3个顶点之间的角度

jma*_*erx 6 c c++ algorithm

例如,GetAngle((0,0),(100,0),(100,100))= 90.如何找到3个2D点之间的角度.

Sea*_*wen 9

给定A,B和C点,你想要AB和AC之间的角度?首先计算向量AB和AC - 它只是B的坐标减去A的坐标,同样对于AC.取两个向量的点积.这只是x坐标加上矢量y坐标的乘积.将此数字除以AB的长度,再按AC的长度除以.这个结果是两个向量之间角度的余弦,所以取arccos()就可以得到它.


com*_*orm 7

这里仅使用点积的问题在于它在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
Run Code Online (Sandbox Code Playgroud)

除非角度的一条腿长度为零,否则这应该是数值上稳健的.

请注意,这也会给你一个签字的角度,这取决于是否BAC那张顺时针或逆时针方向; acos()方法总会给你一个正值.当然,如果你只想要一个正角度,你可以采取abs(angle); atan2()方法仍然会更强大,并且可能更快.