Comment calculer l'angle d'un vecteur à partir de la verticale?
Im essayant de trouver l'angle (en degrés) entre deux vecteurs 2D. Je sais que j'ai besoin d'utiliser la trigo, mais je ne suis pas trop bien avec elle. C'est ce que je suis en train de travailler (l'axe des Y augmente vers le bas):
le texte d'alt http://i38.tinypic.com/2dcefch.png
Je suis en train d'utiliser ce code pour le moment, mais ça ne marche pas à tous (calcule aléatoires pour une certaine raison):
private float calcAngle(float x, float y, float x1, float y1)
{
float _angle = (float)Math.toDegrees(Math.atan2(Math.abs(x1-x), Math.abs(y1-y)));
Log.d("Angle","Angle: "+_angle+" x: "+x+" y: "+y+" x1: "+x1+" y1: "+y1);
return _angle;
}
Ce sont mes résultats (Il y en constante lors de la fourniture d'une position constante, mais quand j'ai changer la position, l'angle change et je ne trouve pas de lien entre les deux angles):
Position 1:
x:100 j:100
x1:50 y1:50
Angle: 45
Position 2:
x:92 y:85
x1:24 y1:16
Angle: 44.58
Position 3:
x:44 y: 16
x1:106 y1:132
Angle: 28.12
Edit: Merci à tous ceux qui ont répondu et m'a aidé à comprendre que c'était faux! Désolé, le titre et la question a été source de confusion.
source d'informationauteur Niall
Vous devez vous connecter pour publier un commentaire.
Vous devez d'abord comprendre comment calculer angle entre deux vecteurs et il y en a plusieurs. Je vais vous donner ce que je pense est le plus simple.
v1x * v2x + v1y * v2y
Avec cette information, merci de prendre cette définition:
Maintenant, vous résoudre pour
angle(v1, v2)
:Enfin, en prenant les définitions au début, puis vous vous retrouvez avec:
Encore une fois, il y a beaucoup de façons de le faire, mais je l'aime parce qu'elle est utile pour le produit scalaire angle donné et la norme, ou de l'angle, compte tenu de vecteurs.
La réponse sera en radians, mais vous savez que pi radians (c'est-à 3.14 radians) de 180 degrés, de sorte que vous suffit de multiplier par le facteur de conversion 180/pi.
Aha! S'avère que j'ai juste besoin de la rotation de mon angle et l'utilisation atan2. C'est mon code final:
Merci à tous de m'aider à comprendre cela et aussi pour m'aider à comprendre ce que je suis en train de faire! 🙂
Ne pas prendre la valeur absolue de la arguments pour
atan2
. Le point de l'ensemble deatan2
est qu'il utilise les signes de ses arguments de qaudrant l'angle est en. En prenant les valeurs absolues, vous forcezatan2
à retourner uniquement les valeurs entre 0 et pi/2 au lieu de -pi à pi.Il ressemble à Niall compris, mais je vais terminer mon explication, de toute façon. En plus d'expliquer pourquoi la solution fonctionne, ma solution a deux avantages:
Potentiel de division par zéro dans les atan2() est évitéeatan2()
renvoie la dans le sens antihoraire angle par rapport à l'axe X positif. Niall était à la recherche pour le sens des aiguilles d'angle par rapport à la borne positive de l'axe Y (entre le vecteur formé par les deux points et les impacts de l'axe Y).La fonction suivante est une adaptation de ma astéroïdes jeu où je voulais calculer la direction d'un navire/vecteur vitesse a été ", soulignant:"
Je crois que l'équation de l'angle entre les deux vecteurs devrait ressembler à:
Votre équation ci-dessus permettra de calculer l'angle entre le vecteur p1-p2 et la ligne de faite en prolongeant l'orthogonal du point p2 pour le vecteur p1.
Le produit scalaire de deux vecteurs V1 et V2 est égal à |V1|*|V2|cos(theta). Par conséquent, thêta est égal à acos((V1 dot V2)/(|V1||V2|)). V1 dot V2 se V1.xV2.x+V1.yV2.y.
L'ampleur de V (i.e., |V|) est la pathogorean théorème de... sqrt(V. x^2 + C. y^2)
Il devrait être :
abs
signifie absolue (pour éviter les valeurs négatives)Ma première hypothèse serait de calculer l'angle de chaque vecteur avec les axes à l'aide de atan(y/x) et puis de soustraire ces anges et de prendre la valeur absolue, c'est:
abs(atan(y/x) - atan(y1/x1))
Êtes-vous à l'aide de nombres entiers? Cast les arguments en double, et je voudrais utiliser les fab sur le résultat, et non pas les arguments. Le résultat sera en radians; pour obtenir les degrés, utilisation:
res *= (360.0/(2.0*Math.PI));
L'angle de la deuxième vecteur par rapport au premier =
atan2(y2,x2) - atan2(y1,x1)
.http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/index.htm