Maison >développement back-end >C++ >Comment calculer directement l'angle dans le sens des aiguilles d'une montre entre deux vecteurs ?

Comment calculer directement l'angle dans le sens des aiguilles d'une montre entre deux vecteurs ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-23 17:24:19922parcourir

How to Directly Calculate the Clockwise Angle Between Two Vectors?

Calcul direct de l'angle dans le sens des aiguilles d'une montre entre les vecteurs

Traditionnellement, le calcul de l'angle entre les vecteurs implique l'utilisation du produit scalaire, qui donne l'angle intérieur entre 0° et 180°. Cependant, cette approche nécessite l'utilisation d'instructions conditionnelles pour déterminer l'angle réel dans le sens des aiguilles d'une montre.

Cas bidimensionnel

En 2D, une approche simple existe :

dot = x1*x2 + y1*y2      # Dot product between [x1, y1] and [x2, y2]
det = x1*y2 - y1*x2      # Determinant
angle = atan2(det, dot)  # atan2(y, x) or atan2(sin, cos)

Le déterminant est proportionnel au sinus de l'angle, complétant la relation du produit scalaire avec le cosinus. L'orientation de l'angle s'aligne sur celle du système de coordonnées, les angles positifs indiquant une rotation dans le sens des aiguilles d'une montre dans un système gaucher (par exemple, l'infographie). L'échange des entrées modifie le signe de l'angle.

Cas tridimensionnel

En 3D, l'angle de rotation est défini par l'axe perpendiculaire aux deux vecteurs impliqués. Une convention attribue des angles positifs aux rotations qui alignent l'axe avec un angle positif. En utilisant cette convention :

dot = x1*x2 + y1*y2 + z1*z2    # Between [x1, y1, z1] and [x2, y2, z2]
lenSq1 = x1*x1 + y1*y1 + z1*z1
lenSq2 = x2*x2 + y2*y2 + z2*z2
angle = acos(dot/sqrt(lenSq1 * lenSq2))

Plan intégré en 3D

Un autre cas particulier se produit lorsque les vecteurs se trouvent dans un plan avec un vecteur normal connu _n_. En adaptant le calcul 2D, nous prenons en compte _n_ :

dot = x1*x2 + y1*y2 + z1*z2
det = x1*y2*zn + x2*yn*z1 + xn*y1*z2 - z1*y2*xn - z2*yn*x1 - zn*y1*x2
angle = atan2(det, dot)

Notez que n doit avoir une longueur unitaire.

Forme de produit triple

Le déterminant peut également être exprimé sous forme de triplet produit :

det = n · (v1 × v2)

Cette formule offre une perspective alternative, le produit vectoriel étant proportionnel au sinus de l'angle et perpendiculaire au plan, s'alignant efficacement avec _n_. Le produit scalaire mesure ensuite la longueur du vecteur résultant avec le signe correct.

Plage 0° – 360°

La plupart des atan2 implémentations renvoient angles compris entre [-π, π] radians ou [-180°, 180°] degrés. Pour les angles positifs [0°, 360°], ajoutez 2π à tout résultat négatif. Alternativement, atan2(-det, -dot) π peut être utilisé sans condition pour les angles positifs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn