Ich werde den Kommentar von TravisG etwas erweitern und eine andere Antwort geben, wobei ich die Tatsache ausnutze, dass Ihre Frage das "2D" -Tag hatte.
Sie können den Winkel zwischen zwei Vektoren mithilfe des Punktprodukts ermitteln, aber Sie können den vorzeichenbehafteten Winkel zwischen zwei Vektoren mithilfe des Punktprodukts nicht ermitteln . Anders ausgedrückt, wenn Sie einen Charakter mit der Zeit in Richtung eines Punktes drehen möchten, erhalten Sie mit dem Skalarprodukt, wie viel gedreht werden muss, nicht jedoch in welche Richtung. Es gibt jedoch eine andere einfache Formel, die in Kombination mit dem Skalarprodukt sehr nützlich ist. Das hast du nicht nur
dot(A,B) = |A| * |B| * cos(angle)
Sie können auch eine andere Formel haben (deren Namen ich für politische Korrektheit entschädigt habe):
pseudoCross(A,B) = |A| * |B| * sin(angle)
wobei, wenn A = (a, b), B = (x, y) ist, Pseudokreuz (A, B) als die dritte Komponente des Kreuzprodukts (a, b, 0) x (x, y, 0) definiert ist ). Mit anderen Worten:
a*x+b*y = |A| * |B| * cos(angle)
-b*x+a*y = |A| * |B| * sin(angle)
Der volle vorzeichenbehaftete Winkel ist dann angle=atanfull(-b*x+a*y,a*x+b*y)
(atanfull oder atan2 verzeihen Ihnen, wenn Sie nicht normalisierte Werte übergeben). Wenn A und B normalisiert sind, |A|=|B|=1
sind dies einfach:
a*x+b*y = cos(angle)
-b*x+a*y = sin(angle)
Beachten Sie zur genaueren Erläuterung, dass die obigen Gleichungen durch die Matrixgleichung ausgedrückt werden können:
[ a,b] [x] [cos(angle)]
[-b,a] * [y] = [sin(angle)]
Aber a und b können für einen bestimmten Wert als a=cos(ang1)
, ausgedrückt b=sin(ang1)
werden ang1
(nicht angle
). Daher ist die linke Matrix eine Rotationsmatrix, die den Vektor (x, y) um den Betrag -ang1 dreht. Dies entspricht dem Umschalten in einen Referenzrahmen, in dem der Einheitsvektor "A" als Vektor / Achse (1,0) behandelt wird! Wenn Sie also nur den Einheitskreis / das rechtwinklige Dreieck in diesem Rahmen zeichnen, können Sie sehen, warum der resultierende Vektor dieses Produkts (cos (Winkel), sin (Winkel)) ist.
Wenn Sie (a, b) und (x, y) in Polarform schreiben und anwenden , um die Winkeldifferenz Formeln cos(l)*cos(m)+sin(l)*sin(m)=cos(l-m)
und sin(l)*cos(m)-cos(l)*sin(m)=sin(l-m)
, Sie erneut Ausdruck bringen , dass die Sinus- / Cosinus dieses Produkt gegeben werden, da (lm) = Winkel. Alternativ könnten diese Identitäten verwendet werden, um zu sehen, warum das oben angegebene lineare Produkt einen Vektor dreht.
All diese Identitäten bedeuten, dass Sie selten Winkel benötigen. Da Winkel komisch sein können - Bogenmaß / Grad, Konventionen für inversen Sinus / Cosinus, die Tatsache, dass sie sich alle 2 * pi wiederholen - kann dies tatsächlich nützlicher sein und Ihnen eine Reihe von "if (ang <180)" usw. -Logik ersparen.