Angle between two Vectors 2D

廉价感情. 提交于 2019-12-20 10:38:20

问题


I'm trying to compute the angle between two vectors. I tried this, but it always returns zero:

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));


回答1:


You should take a look at the documentation of atan2 (here).

What you're looking of is finding the difference between B (your upper left vector) and A (your bottom right vector), then pass this as a parameter to atan2

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

What your code currently does is find the angle of the vector b in reference to 0,0 and subtract the angle of the vector a in reference to 0,0.

The reason you always get 0 is because 1,1 and 50,50 are on the same line that crosses 0,0 (both calls return something approx. 0.785398), so subtracting them will result in 0




回答2:


I think code show as below copy from .NET source code could help you.

reference: 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);
}



回答3:


You have to use the difference in x and y inside of the Atan2 method:

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

Also, I believe this will give you the angle from 0 to the hypotenuse of the triangle you've provided (not entirely sure).

I'd suggest trying Math.PI - angle.




回答4:


A simple solution should be this:

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

This is Pseudo-code, because C# is not my world. Sorry




回答5:


if you are looking for the "angle between vectors a and b", you want the delta of the angle for vector a and the angle for vector b:

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

But the diagram doesn't match "angle between vectors". The answer for the diagram is indeed the previous answer given:

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



回答6:


I'm a bit late to the party, but how about the static method on the Vector class:

Vector.AngleBetween(vector1, vector2)



回答7:


tan(angle) = opposite/adjascent

arctan(opposite/adjascent) = angle

opposite = a.y - b.y

adjascent = b.x - a.x

Math.Atan((a.Y - b.Y) / (b.X - a.X));



回答8:


since you use vector2 class, I guess you can use

a-b

to get the vector from a to b.

so the angle you need is: Pi - angle(a-b).



来源:https://stackoverflow.com/questions/13458992/angle-between-two-vectors-2d

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!