Maison >développement back-end >C++ >Comment calculer directement l'angle dans le sens des aiguilles d'une montre entre deux vecteurs ?
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!