2010-01-27 5 views
25

Wie finden Sie den signierten Winkel Theta von Vektor a nach b?Gefundene signierte Winkel zwischen Vektoren

Und ja, ich weiß, dass Theta = Arccos ((a.b)/(| a || b |)).

Es enthält jedoch kein Vorzeichen (d. H. Es unterscheidet nicht zwischen einer Drehung im oder gegen den Uhrzeigersinn).

Ich brauche etwas, das mir den minimalen Winkel von A nach B drehen kann. Ein positives Vorzeichen zeigt eine Drehung von + x-Achse in Richtung + y-Achse an. Umgekehrt bedeutet ein negatives Vorzeichen eine Drehung von + x-Achse in Richtung -y-Achse.

assert angle((1,0),(0,1)) == pi/2. 
assert angle((0,1),(1,0)) == -pi/2. 

Antwort

30

Wenn Sie eine atan2() Funktion in der Mathematik-Bibliothek der Wahl:

signed_angle = atan2(b.y,b.x) - atan2(a.y,a.x) 
+0

Perfect, danke. – Cerin

+9

Was ist mit a = (-1,1) und b = (-1, -1), wo die Antwort pi/2 sein sollte? Sie sollten prüfen, ob der absolute Wert größer als pi ist, und dann 2 * pi addieren oder subtrahieren, wenn dies der Fall ist. –

+0

@Derek Guter Fang. Das habe ich selbst bei der Implementierung der Lösung selbst entdeckt. – Cerin

50

Was Sie wollen, oft die „perp Punktprodukt“ genannt wird, verwenden, das heißt, finden Sie den Vektor senkrecht zu einem der Vektoren, und dann finden Sie das Skalarprodukt mit dem anderen Vektor.

if(a.x*b.y - a.y*b.x < 0) 
    angle = -angle; 

Sie können dies auch tun:

angle = atan2(a.x*b.y - a.y*b.x, a.x*b.x + a.y*b.y); 
+0

Wissen Sie, ob die zweite Gleichung immer Winkel von weniger als 180º zurückgibt? – rraallvv

+2

Der Winkel liegt zwischen -pi und Pi Radiant, einschließlich. –

+0

groß, dass das Problem löst, wenn a = (-1,1) und b = (-1, -1) zeigte über – rraallvv