【问题标题】:Given three coordinate points, how do you detect when the angle between them crosses 180 degrees?给定三个坐标点,如何检测它们之间的夹角何时超过 180 度?
【发布时间】:2016-08-09 17:00:25
【问题描述】:

这看起来应该很简单,但我遇到了麻烦。基本上,我有三个不断变化的点(我们称它们为 p1、p2 和 p3)。另外,我们将 p2 定义为顶点。

本质上,我需要做的是计算三点之间的角度。一个很好的例子是,如果三个角度形成 179 度角,那么这些点会改变形成 181 度角。所以我真正需要的是一种确定角度是否大于 180 度的好方法。我尝试使用余弦定律,但它没有给我一个好的答案,因为当点形成 181 度角时,它只是将其解释为不同方向的 179 度角。另外,如果有帮助,我正在 Python 中执行此操作。谢谢!

【问题讨论】:

  • 您有一致的角度测量方案吗?就像所有角度都是逆时针测量的?
  • 在这种情况下,您必须知道角度在第一段的顺时针或逆时针方向,对吗?否则将 181 解释为 179 是绝对正确的。
  • 所有角度的测量都是一致的。逆时针还是顺时针并不重要,重要的是角度何时越过 180 度边界。

标签: python math geometry trigonometry angle


【解决方案1】:

您要决定的是(p3-p2)与(p2-p1)相比是左转还是右转。这实际上是 Graham Scan 的核心部分,用于计算凸包 (https://en.wikipedia.org/wiki/Graham_scan)。引用维基百科并稍作修改:

...确定三个点是否构成“左转”或 “右转”不需要计算两者之间的实际角度 两条线段,实际上可以用简单的算术来实现 只要。对于三个点 P1=(x1, y1), P2=(x2, y2), P3=(x3, y3), 只需计算两者叉积的 z 坐标 向量 (p2-p1) 和 (p3-p1),由表达式给出 (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1)。如果结果为 0,则 点是共线的;如果为正,则三点构成一个 “左转”或逆时针方向,否则为“右转” 或顺时针方向(用于逆时针编号的点)。

【讨论】:

  • 这很好用。我想补充一下,这也可以用楔积来解释,不需要我们引入额外的维度。楔积也更通用,因为它适用于计算更多维度空间中的绕组,而叉积仅适用于 3。
【解决方案2】:

要获得全范围的有符号角度,请使用带有点和向量叉积p2p1p2p3 的atan2 函数

Angle(in radians) = atan2(cross(p2p1,p2p3), dot(p2p1,p2p3))

【讨论】:

  • 三角函数在这里完全没有必要,所以我建议不要增加复杂性。
  • @Dietrich Epp 作者的那句话what I need to do is calculate the angle between the three points 意思是他需要角度值,而不仅仅是180跨界的事实
  • 问题的标题是“你如何检测它们之间的角度何时跨越 180 度?”,而不是“你如何计算角度”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 2021-08-04
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
相关资源
最近更新 更多