Question

Je veux calculer l'angle entre deux vecteurs a et b. Laisse supposer ceux-ci sont à l'origine. Cela peut être fait avec

theta = arccos(a . b / |a| * |b|)

Cependant arccos vous donne l'angle dans [0, pi], à savoir qu'il ne sera jamais vous donner un angle supérieur à 180 degrés, ce qui est ce que je veux. Alors, comment trouvez-vous quand les vecteurs ont dépassé la marque de 180 degrés? En 2D Je voudrais simplement laisser le signe de la composante y sur l'un des vecteurs de déterminer quel quadrant le vecteur est. Mais quelle est la meilleure façon de le faire en 3D?

EDIT: Je voulais garder la question générale, mais ici nous allons. Je programmation cela en c et le code que j'utilise pour obtenir l'angle est theta = acos(dot(a, b)/mag(a)*mag(b)) alors comment voulez-vous déterminer par programme l'orientation?

Était-ce utile?

La solution 2

Je suis venu avec la solution suivante qui profite du changement de direction du produit croisé des deux vecteurs:

  1. Faire un vecteur n = a X b et normaliser. Ce vecteur est perpendiculaire au plan défini par a et b.

  2. Chaque fois qu'un nouvel angle est calculé comparer avec l'ancien normal. Dans la comparaison, traiter les anciens et les actuels Normales comme points et calculer la distance entre eux. Si cette distance est 2 la normale (à savoir le produit croisé a X b est retournée).

Vous pouvez avoir un seuil pour la distance que la distance après un flip peut être plus courte que 2, selon la façon dont les vecteurs a et b sont orientés et la façon dont vous mettez à jour souvent l'angle.

Autres conseils

Cela fonctionne en 2D parce que vous avez un plan défini dans lequel vous définissez la rotation.

Si vous voulez le faire en 3D, il n'y a pas tel plan 2D implicite. Vous pouvez transformer votre coordonnées 3D à un plan 2D en passant par les trois points, et faites votre calcul dans ce plan.

Mais, il y a bien sûr deux orientations possibles pour le plan, et qui auront une incidence sur quels angles seront> 180 ou moins.

Une solution que vous pouvez utiliser:
Ce que vous devez effectivement faire est de créer un plan que l'un des vecteurs est coplanaires.

Obtenir le produit croisé des deux vecteurs va créer un plan, puis est que vous obtenez la normale de ce plan, vous pouvez obtenir l'angle entre ceci et le vecteur dont vous avez besoin pour obtenir l'angle signé, et vous pouvez utiliser l'angle pour déterminer le signe.
Si l'angle est supérieur à 90 degrés, alors il est en dessous du plan créé; moins de 90 degrés, et il est au-dessus.
Selon le coût des calculs, le produit scalaire peut être utilisé à ce stade au lieu de l'angle.

Assurez-vous que vous calculez toujours les Normales par le même ordre de vecteurs.

Ceci est utilisable plus facilement si vous utilisez les axes XYZ, et c'est ce que vous comparez contre, puisque vous avez déjà les vecteurs nécessaires pour le plan.

Il existe des solutions possbly plus efficaces, mais c'est celui que je suis venu avec.

Edit: clarification des vecteurs créés a X b = p. Ceci est perpendiculaire à la fois a et b. Ensuite, effectuez: a X p ou b X p pour créer un autre vecteur qui est perpendiculaire au plan créé par les 2 vecteurs. Le choix du vecteur dépend sur lequel vous essayez de trouver l'angle pour.

A proprement parler, deux vecteurs 3D ont toujours deux angles entre eux - un inférieur ou égal à 180, l'autre supérieure ou égale à 180. Arccos vous donne l'un d'eux, vous pouvez obtenir l'autre en soustrayant de 360. penser de cette façon: imaginez deux lignes se croisent. Vous avez 4 angles là - 2 d'une valeur, 2 d'un autre. Quel est l'angle entre les lignes? Pas de réponse unique. Pareil ici. Sans une sorte de critères supplémentaires, vous ne pouvez pas, en théorie, dire laquelle des deux valeurs d'angle doivent être prises en compte.

EDIT: Donc ce que vous avez vraiment besoin est un exemple arbitraire de fixer une orientation. Voici une: nous regardons de la direction Z positive. Si le plan entre les deux vecteurs contient l'axe Z, nous regardons de la direction Y positive. Si l'avion est YZ, nous attendons de la direction positive X. Je pense que la façon d'exprimer en coordonnées sous forme, puis modifier à nouveau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top