13

我正在尝试计算两个向量之间的角度。我试过这个,但它总是返回零:

public double GetAngle(Vector2 a, Vector2 b)
{
double angle = Math.Atan2(b.Y, b.X) - Math.Atan2(a.Y, a.X);
return angle;
}

GetAngle(new Vector2(1,1), new Vector2(50,50));

矢量图我需要的角度

4

8 回答 8

22

您应该查看atan2此处)的文档。

您正在寻找的是找到 B(您的左上向量)和 A(您的右下向量)之间的差异,然后将其作为参数传递给atan2

return Math.Atan2(b.Y - a.Y,b.X - a.X);

您的代码当前所做的是找到向量b参考0,0的角度并减去向量参考的a角度0,0

你总是得到 0 的原因是因为1,150,50在同一条线上交叉0,0(两个调用都返回大约0.785398),所以减去它们会导致0

于 2012-11-19T17:32:29.590 回答
8

我认为代码显示如下,来自 .NET 源代码的副本可以帮助您。

参考: http ://referencesource.microsoft.com/#WindowsBase/Base/System/Windows/Vector.cs,102

/// <summary>
/// AngleBetween - the angle between 2 vectors
/// </summary>
/// <returns>
/// Returns the the angle in degrees between vector1 and vector2
/// </returns>
/// <param name="vector1"> The first Vector </param>
/// <param name="vector2"> The second Vector </param>
public static double AngleBetween(Vector vector1, Vector vector2)
{
    double sin = vector1._x * vector2._y - vector2._x * vector1._y;  
    double cos = vector1._x * vector2._x + vector1._y * vector2._y;

    return Math.Atan2(sin, cos) * (180 / Math.PI);
}
于 2015-01-24T07:57:27.600 回答
4

一个简单的解决方案应该是这样的:

Vector2 a_normalized = normalize(a);
Vector2 b_normalized = normalize(b);
double angle = arccos(dot(a_normalized,b_normalized));

http://simple.wikipedia.org/wiki/Dot_product

这是伪代码,因为 C# 不是我的世界。对不起

于 2014-07-02T21:41:03.180 回答
3

如果您正在寻找“向量 a 和 b 之间的角度”,您需要向量 a 的角度和向量 b 的角度的增量:

Math.Atan2(b.Y, b.X) - Math.Atan2(a.Y, a.X)

但是该图与“向量之间的角度”不匹配。该图的答案确实是先前给出的答案:

Math.Atan2(b.Y - a.Y, b.X - a.X)
于 2014-11-11T15:50:09.883 回答
2

您必须在 Atan2 方法中使用 x 和 y 的差异:

Math.Atan2(b.Y - a.Y,b.X - a.X);

另外,我相信这会给你从0你提供的三角形斜边的角度(不完全确定)。

我建议尝试Math.PI - angle

于 2012-11-19T17:32:05.107 回答
1

我参加聚会有点晚了,但是 Vector 类的静态方法怎么样:

Vector.AngleBetween(vector1, vector2)
于 2016-05-25T13:44:44.643 回答
0

tan(角度)=对面/相邻

arctan(相反/相邻)= 角度

对面 = ay - by

相邻 = bx - ax

Math.Atan((a.Y - b.Y) / (b.X - a.X));
于 2012-11-19T17:34:53.083 回答
0

因为你使用vector2类,我想你可以使用

抗体

获取从 a 到 b 的向量。

所以你需要的角度是:Pi - 角度(ab)。

于 2012-11-19T17:36:02.927 回答