给定三个坐标点,如何检测它们之间的角度何时超过180度?

时间:2016-08-09 17:00:25

标签: python math geometry trigonometry angle

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

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

2 个答案:

答案 0 :(得分:6)

您要确定的是(p3-p2)与(p2-p1)相比是左转还是右转。这实际上是Graham Scan的核心部分,用于计算凸包(https://en.wikipedia.org/wiki/Graham_scan)。通过略微编辑引用维基百科:

  

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

答案 1 :(得分:0)

要在整个范围内获得有角度的角度,请使用atan2函数,其中包含向量p2p1p2p3

的点和叉积
Angle(in radians) = atan2(cross(p2p1,p2p3), dot(p2p1,p2p3))