跳转至

向量夹角的计算

计算向量的夹角

要计算两个向量的夹角,可以使用向量的点积公式。假设有两个向量 ab,它们的夹角为 θ,那么它们的点积可以表示为:

ab=abcosθ

其中,ab 分别是向量 ab 的模长,cosθ 是夹角 θ 的余弦值。

通过这个公式,我们可以解出 cosθ

cosθ=abab

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

θ=arccos(abab)

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

例子

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

步骤如下:

  1. 计算向量 ab 的点积:
ab=3×1+4×2=3+8=11
  1. 计算向量 ab 的模长:
a=32+42=9+16=25=5
b=12+22=1+4=5
  1. 计算 cosθ
cosθ=abab=1155=1155×55=11525
  1. 计算 θ
θ=arccos(11525)

所以,两个向量 ab 的夹角为 arccos(11525)

Note

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

夹角范围解释

1.夹角范围

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

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

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

  • 从数学公式来看,点积公式 ab=abcosθ 中,cosθ 的值在 [1,1] 之间,而 arccos 函数的输出范围是 [0,π](即 0 到 180 度)。

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

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

  1. 计算 0 到 180 度的夹角: 使用点积公式计算夹角 θ

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

  3. 调整夹角范围: 如果夹角方向为逆时针方向,则夹角为 360θ

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} 度");
    }
}

输出示例

对于向量 a=(3,4)b=(1,2)

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

对于向量 a=(3,4)b=(4,3)

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

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

评论