2012-04-13 55 views
11

(在三維中)我正在尋找一種方法來計算兩個向量之間的帶符號夾角,除非是這些向量,否則不給出任何信息。如在this question中回答的那樣,在給定矢量垂直的平面的法線的情況下計算符號角是足夠簡單的。但是如果沒有這個價值,我無法找到辦法。很顯然,兩個向量的叉積產生這樣一個正常的,但我已經使用上面的答案碰上以下矛盾:沒有參考平面的兩個向量之間的符號夾角

signed_angle(x_dir, y_dir) == 90 
signed_angle(y_dir, x_dir) == 90 

在那裏我希望第二個結果爲陰性。這是由於這樣的事實,叉積cross(x_dir, y_dir)是在cross(y_dir, x_dir)相反的方向,給出歸一化輸入下列僞代碼:

signed_angle(Va, Vb) 
    magnitude = acos(dot(Va, Vb)) 
    axis = cross(Va, Vb) 
    dir = dot(Vb, cross(axis, Va)) 
    if dir < 0 then 
     magnitude = -magnitude 
    endif 
    return magnitude 

我不相信目錄將永遠是負面的上方。

我看到了與建議的atan2解決方案相同的問題。

我正在尋找一種方法,使:

signed_angle(a, b) == -signed_angle(b, a) 
+1

是不是這個:http://www.jtaylor1142001.net/calcjat/Solutions/VDotProduct/VDPTheta3D.htm你在找什麼? – Jack 2012-04-13 01:05:03

+0

以上評論中的鏈接不起作用 – ephere 2013-08-16 13:11:40

回答

1

謝謝大家。在回顧這裏的評論並回顧我想要做的事情之後,我意識到我可以完成我需要用給定的標準公式來完成我需要做的事情。我剛剛在單元測試中掛了我的簽名角度函數。

作爲參考,我將產生的角度反饋迴旋轉函數。我沒有考慮到這樣一個事實,即它自然會使用與signed_angle(輸入向量的叉積)相同的軸,並且正確的旋轉方向將遵循該軸面向哪個方向。

更簡單地說,這兩個應該只是「做正確的事」,並旋轉不同的方向:

rotate(cross(Va, Vb), signed_angle(Va, Vb), point) 
rotate(cross(Vb, Va), signed_angle(Vb, Va), point) 

其中第一個參數是旋轉和第二的軸線旋轉量。

3
兩個向量之間

符號的角度,而不參考平面

angle = acos(dotproduct(normalized(a), normalized(b))); 

signed_angle(A, b)== -signed_angle(b,a)

我認爲沒有某種參考矢量是不可能的。

+0

我在想更多,這是對的。角度的符號取決於您將哪個旋轉軸用作參考。當然,還有兩個不同的軸,一個在叉積的方向,另一個在相反的方向。 – 2012-04-13 23:50:44

+0

@JeffE:是的,雖然通過使用叉積可以找到「旋轉」軸,但您無法確定它最初面向哪個方向 - 在「交叉b」或「b交叉a」交換向量中,你會得到軸朝相反的方向。因此,不可能確定旋轉角度是否在0 ...π範圍內,或者是否在pi..pi * 2範圍內。 – SigTerm 2012-04-14 02:03:13

-2

如果你想要的是一個一致的結果,然後一個×b之間進行選擇b×一個爲您的正常會做的任意方式。也許選擇字典上較小的那個?

(但你可能要解釋你其實是想解決什麼問題:也許有,不涉及計算任意3向量之間的一致的符號的角度解決方案)

18

相關的數學公式:

dot_product(a,b) == length(a) * length(b) * cos(angle) 
    length(cross_product(a,b)) == length(a) * length(b) * sin(angle) 

對於3-d向量之間的穩健角度,你的實際的計算應該是:

s = length(cross_product(a,b)) 
    c = dot_product(a,b) 
    angle = atan2(s, c) 

如果使用單獨使用時,角度較小時會出現嚴重的精度問題。計算s並使用atan2()爲您提供了一個強大的結果,適用於所有可能的情況。

由於s總是非負的,因此得到的角度範圍從0到pi。總是會有一個等效的負角(angle - 2*pi),但沒有幾何理由更喜歡它。

+0

謝謝,我會繼續關於acos。我想這是顯而易見的,當你可視化的功能。 – metatheorem 2012-04-19 05:14:52

+0

警告:此功能是可交換的,不應該是:從+ x方向(1 0 0)到+ y方向(0 1 0)的角度應爲+ 90°。反之亦然,從+ y到+ x應該是-90°。但是用這個函數,'f(x,y)== f(y,x)'。它不能說明區別,因爲's'不是負面的,而且交叉產品是唯一可以告訴你關於兩者之間的方向的東西。 – 2016-03-11 05:16:24

+0

如果它在2維中,它將是反交換的。然而,在三維中,它是(也應該是)可交換的 - 因爲在三維中,需要第三個矢量來確定手性。如果沒有第三個向量來區分前兩個的正向和反向角度,則沒有幾何原因可以偏向於另一個方向。 – comingstorm 2016-03-11 05:29:30

相關問題