2010-01-27 66 views
25

如何找到從向量a到b的帶符號的角度theta?查找向量之間的帶符號的角度

是的,我知道theta = arccos((a.b)/(| a || b |))。

但是,這不包含符號(即,它不區分順時針或逆時針旋轉)。

我需要一些能告訴我從a旋轉到b的最小角度。正號表示從+ x軸向+ y軸的旋轉。相反,負號表示從+ x軸朝-y軸旋轉。

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

回答

30

如果你在選擇你的數學庫的ATAN2()函數:

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

完美,謝謝。 – Cerin 2010-01-27 20:50:23

+9

a =(-1,1)和b =(-1,-1),答案應該是pi/2?您應該檢查絕對值是否大於pi,如果是,則添加或減去2 * pi。 – 2010-01-27 21:52:02

+0

@Derek 好的。我在實施解決方案時親自發現了這一點。 – Cerin 2010-01-28 13:06:48

50

要使用通常被稱爲「PERP點積」,就是找到載體什麼垂直於其中一個矢量,然後用另一個矢量找到點積。

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

你也可以這樣做:

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

你知道第二個方程總是返回小於180º的角嗎? – rraallvv 2013-03-02 16:32:30

+2

角度將介於-pi和pi弧度之間,包括在內。 – 2013-03-06 02:30:25

+0

偉大的解決問題當a =(-1,1)和b =(-1,-1)指向上面 – rraallvv 2013-03-06 03:20:18