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

3

我在这里看到了类似的问题,但是就是无法让数学公式得出正确的答案。

我有一个圆,上面有两个已知点(x1,y1,x2,y2),以圆心(cx,cy)为中心。

如果我站在(cx,cy)并看着点(x1,y1),我如何知道我需要向哪个方向才能面对(x2,y2)?

目前,我的方法是计算每个点的角度:

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

然后我尝试了简单的减法,使用mod函数确保两个角度都在-2π到2π之间,但是我得到了一些奇怪的答案。当两个点在中心点垂直线的上下方时,结果会变得奇怪。

但说实话,我现在已经尝试了很多方法,我的头都痛了!这不必是一个计算速度快的解决方案,因为它只需要执行一次。谢谢。


1
请查看以下链接:https://dev59.com/i3I_5IYBdhLWcg3wBuRs?rq=1 - higuaro
2个回答

5
答案给出的是 (x1-cx)(y2-cy) - (y1-cy)(x2-cx) 的符号。
证明如下:
A 为从 C(x1,y1) 的方向,以逆时针从 X 轴算起的角度表示;B 为从 C(x2,y2) 的方向,同样用此方式表示;r 为圆的半径。然后,若 A-B 在 0 至 pi 或 -2pi 至 -pi 之间(即,若 sin(A-B) 是正数),则在从 C 看来,(x2,y2)(x1,y1) 的右侧;若 A-B 在 -pi 至 0 或 pi 至 2pi 之间(即,若 sin(A-B) 是负数),则在从 C 看来,(x2,y2)(x1,y1) 的左侧。
现在,
(x1,y1)=(Cx + r cos A, Cy + r sin A) 
(x2,y2)=(Cx + r cos B, Cy + r sin B)

So

  (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)相反。


但是怎么做呢?我想看一下详细的解释。 - slider
你的意思是,为什么它能够工作?嗯,好的,如果我有时间的话,也许稍后我会编辑这个答案并包含一个长的解释。 - Dawood ibn Kareem
是的,它是如何工作的?这个符号是用来确定左边还是右边的吗?我会等待解释。 - slider
1
(x1-cx,y1-cy)给出了点1相对于中心的向量坐标。点2同理。它们的左/右位置由它们的叉积的Z坐标的符号给出,这恰好是由它们的坐标形成的2x2矩阵的行列式。 - tskuzzy
大家好,我想我已经盯着我的代码看得太久了——那是我尝试的第一件事之一,但它没有起作用。我一定犯了某种笔误,然后绕了一个大圈子(请原谅双关语),最终回到了原来的解决方案!非常非常感谢。 - user2993997
@DavidWallace 真是太棒了! - slider

0
假设A1是从(cx, cy)(x1, y1)的向量与水平轴之间的角度,A2是从(cx, cy)(x2, y2)的向量与水平轴之间的角度。当您坐在(cx, cy)并看着点(x1, y1)时,如果两个向量之间的角度小于pi,则点(x2, y2)在您的右侧,反之,在您的左侧。

由于正角度的正弦值在0pi之间为正,在pi2*pi之间为负,因此可以得出结论:当且仅当sin(A2-A1) > 0时,该点在您的右侧;当且仅当sin(A2-A1) < 0时,该点在您的左侧。

如果我们使用通常的三角恒等式,那么我们有

sin(A2-A1) = sin(A2) * cos(A1) - sin(A1) * cos(A2)

然后你只需要用笛卡尔坐标的公式替换正弦和余弦。分母被分解因为点位于圆上。

因此,sin(A2-A1)的符号与(x2-cx)*(y1-cy) - (x1-cx)*(y2-cy)的符号相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接