如何判断一个点是否是另一个点的左侧或右侧

时间:2013-11-14 21:41:20

标签: java math trigonometry angle

我在这里看过类似的问题,但是无法让数学运算起来。

我有一个圆圈,圆周上有两个已知点(x1,y1,x2,y2),圆心为cx,cy

如果我站在cx,cy并且看着点x1,y1我怎么能告诉我需要转向哪个方向面对x2,y2?

到目前为止,我正在研究每个点的角度

Atan((cx-x1)/(cy-y1)) 阿坦((cx-x2)/(cy-y2))

然后我尝试了一个简单的减法,使用mod来确保它们都在-2pi和2pi之间,但我得到了一些奇怪的答案。当两个点位于通过中心点绘制的水平线的上方和下方时,会出现奇怪的结果。

但是说实话,我已经尝试了很多东西,现在我的头疼了!它不一定是计算速度快的解决方案,因为它只执行一次。提前谢谢。

2 个答案:

答案 0 :(得分:5)

答案是(x1-cx)(y2-cy) - (y1-cy)(x2-cx)的标志。

<强>证明:

A成为从C(x1,y1)的方向,表示为从X轴逆时针测量的角度; B是从C(x2,y2)的方向,表达方式相同;并且r是圆的半径。然后(x2,y2)位于(x1,y1)的右侧,如C所示,如果A-B介于0和pi之间或介于-2pi和-pi之间(即,如果sin(A-B)如果A-B介于-pi和0之间,或介于pi和2pi之间(即sin(A-B)为负数),则为左侧。

现在,

(x1,y1)=(Cx + r cos A, Cy + r sin A) 
(x2,y2)=(Cx + r cos B, Cy + r sin B)

所以

  (x1-Cx)(y2-Cy) - (y1-Cy)(x2-Cy) 
= (r cos A)(r sin B) - (r sin A)(r cos B)    
= - r^2 (sin A cos B - cos A sin B)
= - r^2 (sin (A-B))

sin (A-B)符号相反。

答案 1 :(得分:0)

假设A1(cx, cy)(x1, y1)的向量与水平轴之间的角度,A2是来自{{1}的向量之间的角度} (cx, cy)和水平轴。当您坐在(x2, y2)处并查看(cx, cy)点时,点(x1, y1)位于您的右侧,当且仅当两个矢量之间的角度小于(x2, y2)且当且仅当角度大于pi时才在左侧。

由于正角度的正弦从pi0为正,而pi为负pi,因此该点位于右侧iff 2*pi和左侧iff sin(A2-A1) > 0

如果我们使用通常的trigonometric identity,我们就有了

sin(A2-A1) < 0

然后你只需用笛卡尔坐标用公式替换正弦和余弦。因为这些点位于一个圆上,所以分母被考虑在内。

因此sin(A2-A1) = sin(A2) * cos(A1) - sin(A1) * cos(A2) 的符号与sin(A2-A1)的符号相同。