2010-06-16 55 views
6

例如,GetAngle((0,0),(100,0),(100,100))= 90.我怎麼能找到3個2D點之間的角度。3個頂點之間的角度

+3

如果這是一個數學網站,我會試圖標記這個作業。 ;)這是簡單的三角。 http://en.wikipedia.org/wiki/Trigonometry#Common_formulas – Cogwheel 2010-06-16 21:57:33

+0

不,這是一個個人項目 – jmasterx 2010-06-16 21:58:22

回答

9

給定點A,B和C,你想要AB和AC之間的角度?首先計算向量AB和AC--它只是B的座標減去A的座標,對於AC也是如此。取兩個向量的dot product。這只是x座標加上矢量y座標乘積的乘積。將該數字除以AB的長度,再除以AC的長度。這個結果是兩個向量之間角度的餘弦,所以採用arccos()並且你有它。

+0

謝謝,我會做到這一點 – jmasterx 2010-06-16 21:59:18

+1

從問題我認爲所需的角度是BA和BC之間 – 2010-06-16 23:02:26

+0

@Dave哦,謝謝:-) – jmasterx 2010-06-16 23:37:08

1

使用點積:

(a,b,c) dot (d,e,f) = ad + be + bf

A dot B = length(A)*length(B)* cos(theta) 

theta = arccos((A dot B)/(length(A)*length(B))是向量A和B.

0

之間的角度這是很容易,如果你有線性代數的一些基本知識。

向量v(在線性代數意義上,不是std :: vector;))是一個元組v =(x,y,z)。

該範數是矢量的長度| v | = SQRT(X X + Y Y + Z * Z)

的兩個向量V1 =(X1,Y1,Z1)和v2 =(X2,Y2,Z2)的內積爲v1·V2 = X1 * X2 + Y1 * Y2 + Z1 * Z2

矢量v1和v2的角度爲α= ACOS(V1·V2 /(| V1 | * | V2 |))

+0

謝謝!我也喜歡這個:-) – jmasterx 2010-06-16 22:02:20

6

與只使用的問題這裏的點積是它在0或180度附近不穩定--acos()的斜率接近+/- 1.0的無窮大,這將導致您失去精度。

爲了解決這個問題,就可以計算僞叉積,並使用ATAN2(),如下所示:

// given A, B, C are 2D points: 
BA= B - A; CA= C - A // vector subtraction, to get vector between points 
dot= BA.x * CA.x + BA.y * CA.y 
pcross= BA.x * CA.y - BA.y * CA.x 
angle= atan2(pcross, dot) // this should be the angle BAC, in radians 

這應該是數值魯棒除非角度的腿部中的一個具有零長度。

請注意,這也會給你一個簽名的角度,這取決於BAC是順時針還是逆時針旋轉; acos()方法總會給你一個正面的價值。當然,如果你只想要一個積極的角度,你可以拿abs(angle); atan2()方法仍然更健壯,可能更快。