Heim > Backend-Entwicklung > C++ > Hauptteil

Wie berechnet man direkt den Winkel im Uhrzeigersinn zwischen zwei Vektoren?

Susan Sarandon
Freigeben: 2024-11-23 17:24:19
Original
830 Leute haben es durchsucht

How to Directly Calculate the Clockwise Angle Between Two Vectors?

Direkte Berechnung des Winkels im Uhrzeigersinn zwischen Vektoren

Traditionell umfasst die Berechnung des Winkels zwischen Vektoren die Verwendung des Skalarprodukts, das den Innenwinkel dazwischen ergibt 0° und 180°. Dieser Ansatz erfordert jedoch die Verwendung von bedingten Anweisungen, um den tatsächlichen Winkel im Uhrzeigersinn zu bestimmen.

Zweidimensionaler Fall

In 2D gibt es einen einfachen Ansatz:

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)
Nach dem Login kopieren

Die Determinante ist proportional zum Sinus des Winkels und ergänzt die Beziehung des Skalarprodukts zum Kosinus. Die Ausrichtung des Winkels stimmt mit der des Koordinatensystems überein, wobei positive Winkel eine Drehung im Uhrzeigersinn in einem linkshändigen System (z. B. Computergrafik) anzeigen. Durch Vertauschen der Eingaben ändert sich das Vorzeichen des Winkels.

Dreidimensionaler Fall

In 3D wird der Drehwinkel durch die Achse definiert, die senkrecht zu beiden beteiligten Vektoren steht. Eine Konvention weist Drehungen, die die Achse an einem positiven Winkel ausrichten, positive Winkel zu. Unter Verwendung dieser Konvention:

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))
Nach dem Login kopieren

Ebene eingebettet in 3D

Ein weiterer Sonderfall tritt auf, wenn die Vektoren innerhalb einer Ebene mit einem bekannten Normalenvektor _n_ liegen. Bei der Anpassung der 2D-Berechnung berücksichtigen wir _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)
Nach dem Login kopieren

Beachten Sie, dass n eine Einheitslänge haben muss.

Triple Product Form

Die Determinante kann auch als Tripel ausgedrückt werden Produkt:

det = n · (v1 × v2)
Nach dem Login kopieren

Diese Formel bietet eine alternative Perspektive, wobei das Kreuzprodukt proportional zum Sinus des Winkels ist und senkrecht zur Ebene liegt und effektiv an _n_ ausgerichtet ist. Das Skalarprodukt misst dann die Länge des resultierenden Vektors mit dem richtigen Vorzeichen.

Bereich 0° – 360°

Die meisten atan2-Implementierungen geben zurück Winkel im Bereich [-π, π] Bogenmaß oder [-180°, 180°] Grad. Für positive Winkel [0°, 360°] addieren Sie 2π zu allen negativen Ergebnissen. Alternativ kann atan2(-det, -dot) π unbedingt für positive Winkel verwendet werden.

Das obige ist der detaillierte Inhalt vonWie berechnet man direkt den Winkel im Uhrzeigersinn zwischen zwei Vektoren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage