我试图计算两个向量之间的角度。 我想这一点,但它总是返回零:
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));
我试图计算两个向量之间的角度。 我想这一点,但它总是返回零:
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);
}
你必须使用在X和Y的ATAN2方法内部的差异:
Math.Atan2(b.Y - a.Y,b.X - a.X);
另外,我相信这会让你从角0
至您所提供(不完全确定)的三角形的斜边。
我建议尝试Math.PI - angle
。
一个简单的解决方案应该是这样的:
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之间的角”,你想要的角度矢量和向量b角的三角:
Math.Atan2(b.Y, b.X) - Math.Atan2(a.Y, a.X)
但该图不匹配“向量之间的角度”。 对于图中的答案确实是给以前的答案:
Math.Atan2(b.Y - a.Y, b.X - a.X)
我有点迟到了,但如何在Vector类的静态方法:
Vector.AngleBetween(vector1, vector2)
黄褐色(角度)=相反/ adjascent
反正切(对面/ adjascent)=角
相反= AY - 由
adjascent = BX - 斧
Math.Atan((a.Y - b.Y) / (b.X - a.X));
因为你使用vector2类,我想你可以使用
AB
从获得的向量到B。
所以你需要的角度是:皮 - 角(AB)。