2010-06-16 92 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()方法仍然更健壮,可能更快。