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