我正在尝试计算两个向量之间的角度。我试过这个,但它总是返回零:
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));
您应该查看atan2
(此处)的文档。
您正在寻找的是找到 B(您的左上向量)和 A(您的右下向量)之间的差异,然后将其作为参数传递给atan2
return Math.Atan2(b.Y - a.Y,b.X - a.X);
您的代码当前所做的是找到向量b
参考0,0
的角度并减去向量参考的a
角度0,0
。
你总是得到 0 的原因是因为1,1
和50,50
在同一条线上交叉0,0
(两个调用都返回大约0.785398
),所以减去它们会导致0
我认为代码显示如下,来自 .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);
}
一个简单的解决方案应该是这样的:
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# 不是我的世界。对不起
如果您正在寻找“向量 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)
您必须在 Atan2 方法中使用 x 和 y 的差异:
Math.Atan2(b.Y - a.Y,b.X - a.X);
另外,我相信这会给你从0
你提供的三角形斜边的角度(不完全确定)。
我建议尝试Math.PI - angle
。
我参加聚会有点晚了,但是 Vector 类的静态方法怎么样:
Vector.AngleBetween(vector1, vector2)
tan(角度)=对面/相邻
arctan(相反/相邻)= 角度
对面 = ay - by
相邻 = bx - ax
Math.Atan((a.Y - b.Y) / (b.X - a.X));
因为你使用vector2类,我想你可以使用
抗体
获取从 a 到 b 的向量。
所以你需要的角度是:Pi - 角度(ab)。