跳转至

向量夹角的计算

计算向量的夹角

要计算两个向量的夹角,可以使用向量的点积公式。假设有两个向量 \(\mathbf{a}\)\(\mathbf{b}\),它们的夹角为 \(\theta\),那么它们的点积可以表示为:

\[ \mathbf{a} \cdot \mathbf{b} = \|\mathbf{a}\| \|\mathbf{b}\| \cos \theta \]

其中,\(\|\mathbf{a}\|\)\(\|\mathbf{b}\|\) 分别是向量 \(\mathbf{a}\)\(\mathbf{b}\) 的模长,\(\cos \theta\) 是夹角 \(\theta\) 的余弦值。

通过这个公式,我们可以解出 \(\cos \theta\)

\[ \cos \theta = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \|\mathbf{b}\|} \]

然后,我们可以通过反余弦函数(arccos)来求出 \(\theta\)

\[ \theta = \arccos \left( \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \|\mathbf{b}\|} \right) \]

下面,我们通过一个例子来说明如何计算两个向量的夹角。

例子

假设我们有两个向量 \(\mathbf{a} = (3, 4)\)\(\mathbf{b} = (1, 2)\),我们想要计算它们的夹角。

步骤如下:

  1. 计算向量 \(\mathbf{a}\)\(\mathbf{b}\) 的点积:
\[ \mathbf{a} \cdot \mathbf{b} = 3 \times 1 + 4 \times 2 = 3 + 8 = 11 \]
  1. 计算向量 \(\mathbf{a}\)\(\mathbf{b}\) 的模长:
\[ \|\mathbf{a}\| = \sqrt{3^2 + 4^2} = \sqrt{9 + 16} = \sqrt{25} = 5 \]
\[ \|\mathbf{b}\| = \sqrt{1^2 + 2^2} = \sqrt{1 + 4} = \sqrt{5} \]
  1. 计算 \(\cos \theta\)
\[ \cos \theta = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \|\mathbf{b}\|} = \frac{11}{5 \sqrt{5}} = \frac{11}{5 \sqrt{5}} \times \frac{\sqrt{5}}{\sqrt{5}} = \frac{11 \sqrt{5}}{25} \]
  1. 计算 \(\theta\)
\[ \theta = \arccos \left( \frac{11 \sqrt{5}}{25} \right) \]

所以,两个向量 \(\mathbf{a}\)\(\mathbf{b}\) 的夹角为 \(\arccos \left( \frac{11 \sqrt{5}}{25} \right)\)

Note

在计算两个向量的夹角时,使用点积公式和反余弦函数(Math.Acos)得到的夹角范围通常是 0 到 π 弧度,即 0 到 180 度。这是因为反余弦函数的定义域是 \([-1, 1]\),而其值域是 \([0, π]\)

夹角范围解释

1.夹角范围

  • 0 度:两个向量方向完全相同。
  • 90 度:两个向量正交(垂直)。
  • 180 度:两个向量方向完全相反。

2.为什么夹角范围是 0 到 180 度?

  • 从几何角度理解,两个向量之间的夹角总是取最小的夹角。因此,即使两个向量方向相反,夹角也不会超过 180 度。

  • 从数学公式来看,点积公式 \(\mathbf{a} \cdot \mathbf{b} = \|\mathbf{a}\| \|\mathbf{b}\| \cos \theta\) 中,\(\cos \theta\) 的值在 \([-1, 1]\) 之间,而 \(\arccos\) 函数的输出范围是 \([0, π]\)(即 0 到 180 度)。

改进计算结果,返回夹角范围0 到 360 度

如果你需要计算两个向量之间的夹角范围为 0 到 360 度,可以通过以下方法实现:

  1. 计算 0 到 180 度的夹角: 使用点积公式计算夹角 \(\theta\)

  2. 判断夹角方向: 使用向量的叉积(在二维中可以简化为标量)来判断夹角的方向。如果叉积为正,则夹角为顺时针方向;如果叉积为负,则夹角为逆时针方向。

  3. 调整夹角范围: 如果夹角方向为逆时针方向,则夹角为 \(360^\circ - \theta\)

C#代码实现

以下是修改后的代码,计算夹角范围为 0 到 360 度

using System;

public class Vector2d
{
    public double X { get; set; }
    public double Y { get; set; }

    public Vector2d(double x, double y)
    {
        X = x;
        Y = y;
    }
}

public class VectorMath
{
    // 方法:计算两个 Vector2d 向量的夹角(单位:度,范围:0 到 360)
    public static double CalculateAngle(Vector2d vectorA, Vector2d vectorB)
    {
        // 计算点积
        double dotProduct = vectorA.X * vectorB.X + vectorA.Y * vectorB.Y;

        // 计算向量的模长
        double magnitudeA = Math.Sqrt(vectorA.X * vectorA.X + vectorA.Y * vectorA.Y);
        double magnitudeB = Math.Sqrt(vectorB.X * vectorB.X + vectorB.Y * vectorB.Y);

        // 计算夹角的余弦值
        double cosTheta = dotProduct / (magnitudeA * magnitudeB);

        // 防止浮点数误差导致的超出范围问题
        cosTheta = Math.Max(-1, Math.Min(1, cosTheta));

        // 计算夹角(单位:弧度)
        double angleInRadians = Math.Acos(cosTheta);

        // 将弧度转换为度
        double angleInDegrees = angleInRadians * (180.0 / Math.PI);

        // 判断夹角方向(使用叉积)
        double crossProduct = vectorA.X * vectorB.Y - vectorA.Y * vectorB.X;

        // 如果叉积为负,则夹角为逆时针方向
        if (crossProduct < 0)
        {
            angleInDegrees = 360 - angleInDegrees;
        }

        return angleInDegrees;
    }
}

public class Program
{
    public static void Main()
    {
        // 创建两个 Vector2d 对象
        Vector2d vectorA = new Vector2d(3, 4);
        Vector2d vectorB = new Vector2d(-1, -2);

        // 计算夹角
        double angle = VectorMath.CalculateAngle(vectorA, vectorB);

        // 输出结果
        Console.WriteLine($"两个向量的夹角为:{angle} 度");
    }
}

输出示例

对于向量 \(\mathbf{a} = (3, 4)\)\(\mathbf{b} = (-1, -2)\)

  • 如果使用 0 到 180 度的范围,夹角为 180 度。
  • 如果使用 0 到 360 度的范围,夹角为 180 度(因为它们方向相反)。

对于向量 \(\mathbf{a} = (3, 4)\)\(\mathbf{b} = (4, -3)\)

  • 如果使用 0 到 180 度的范围,夹角为 90 度。
  • 如果使用 0 到 360 度的范围,夹角为 270 度(因为 \(\mathbf{b}\)\(\mathbf{a}\) 的顺时针方向)。

通过这种方式,你可以根据需要选择夹角的范围。

评论