Angle between two Vectors 2D

前端 未结 8 1731
深忆病人
深忆病人 2021-02-05 17:29

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 = Mat         


        
相关标签:
8条回答
  • 2021-02-05 17:52

    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);
    }
    
    0 讨论(0)
  • 2021-02-05 17:57

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

    0 讨论(0)
  • 2021-02-05 17:59

    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.

    0 讨论(0)
  • 2021-02-05 18:01

    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

    0 讨论(0)
  • 2021-02-05 18:03

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

    Vector.AngleBetween(vector1, vector2)
    
    0 讨论(0)
  • 2021-02-05 18:04

    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)
    
    0 讨论(0)
提交回复
热议问题