【问题标题】:How to tell if a point is left or right of another point如何判断一个点是在另一个点的左边还是右边
【发布时间】:2013-11-14 21:41:19
【问题描述】:

我在这里看到过类似的问题,但只是无法让数学工作。

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

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

到目前为止,我正在计算每个点的角度

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

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

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

【问题讨论】:

标签: java math trigonometry angle


【解决方案1】:

(x1-cx)(y2-cy) - (y1-cy)(x2-cx)的符号给你答案。

证明:

A 为从C(x1,y1) 的方向,表示为从X 轴逆时针测量的角度; BC(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)的符号相反。

【讨论】:

  • 但是怎么做呢?我想看一点解释。
  • 你的意思是,它为什么有效?嗯,好的,如果我有时间,也许稍后,我会编辑这个答案以包含一个很长的解释。
  • 是的,它是如何工作的?符号决定什么 - 左还是右?我会等待解释。
  • (x1-cx, y1-cy) 为您提供点 1 距中心的矢量坐标。与第 2 点类似。左/右由它们的叉积的 Z 坐标的符号给出,这恰好是由它们的坐标形成的 2x2 矩阵的行列式。
  • 干杯,伙计们,我想我一直盯着我的代码太久了——这是我尝试的第一件事,但没有奏效,我一定是打错了字,然后转了一圈大圆圈(原谅双关语)只是为了回到原来的解决方案!非常感谢。
【解决方案2】:

假设A1 是从(cx, cy)(x1, y1) 的向量与水平轴之间的角度,A2 是从(cx, cy)(x2, y2) 的向量与水平轴之间的角度。当您坐在(cx, cy) 并查看点(x1, y1) 时,当且仅当两个向量之间的角度小于pi 时,点(x2, y2) 在您的右侧,当且仅当角度大于pi

由于正角度的正弦从0pi 为正,从pi2*pi 为负,因此该点在您的右侧iff sin(A2-A1) > 0 和左侧iff sin(A2-A1) < 0.

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

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

然后,您只需将正弦和余弦的公式替换为笛卡尔坐标即可。因为点在一个圆上,所以分母被分解了。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-25
    • 2010-12-06
    • 2017-02-01
    • 2014-06-15
    • 1970-01-01
    • 2014-08-29
    相关资源
    最近更新 更多