Heim > Artikel > Backend-Entwicklung > Wie berechnet man direkt den Winkel im Uhrzeigersinn zwischen zwei Vektoren?
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)
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))
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)
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)
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!