web-dev-qa-db-fra.com

Angle entre deux vecteurs 2D

J'essaie de calculer l'angle entre deux vecteurs. J'ai essayé ceci, mais il renvoie toujours zéro:

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

 Vectors  The angle I need

10
Sorashi

Vous devriez jeter un oeil à la documentation de atan2 ( ici ).

Ce que vous cherchez est de trouver la différence entre B (votre vecteur supérieur gauche) et A (votre vecteur inférieur droit), puis transmettez ceci en tant que paramètre à atan2

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

Votre code ne trouve actuellement que l'angle du vecteur b en référence à 0,0 et soustrait l'angle du vecteur a en référence à 0,0.

La raison pour laquelle vous obtenez toujours 0 est parce que 1,1 et 50,50 se trouvent sur la même ligne qui traverse 0,0 (les deux appels renvoient quelque chose d'approximativement 0.785398). Par conséquent, leur soustraction entraîne 0.

18
emartel

Je pense que le code ci-dessous est une copie du code source .NET qui pourrait vous aider.

référence: 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
lisency

Une solution simple devrait être la suivante:

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'est du pseudo-code, parce que C # n'est pas mon monde. Pardon

1
Alexei

si vous recherchez "l'angle entre les vecteurs a et b", vous voulez le delta de l'angle pour le vecteur a et l'angle pour le vecteur b:

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

Mais le diagramme ne correspond pas à "l'angle entre les vecteurs". La réponse pour le diagramme est en effet la réponse précédente donnée:

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

Vous devez utiliser la différence en x et y à l'intérieur de la méthode Atan2:

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

En outre, je pense que cela vous donnera l'angle entre 0 et l'hypoténuse du triangle que vous avez fourni (pas tout à fait sûr). 

Je suggérerais d'essayer Math.PI - angle

1
Shmiddty

Je suis un peu en retard à la fête, mais qu'en est-il de la méthode statique sur la classe Vector:

Vector.AngleBetween(vector1, vector2)
1
Darren

bronzage (angle) = opposé/adjacent

arctan (opposé/adjacent) = angle

opposé = a.y - b.y

adjascent = b.x - a.x

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

puisque vous utilisez la classe vector2, je suppose que vous pouvez utiliser 

un B

pour obtenir le vecteur de a à b.

l'angle dont vous avez besoin est donc: Pi - angle (a-b).

0
urlreader