这看起来应该很简单,但我遇到了麻烦。基本上,我有三个不断变化的点(让我们称之为p1,p2和p3)。另外,让我们将p2定义为顶点。
基本上,我需要做的是计算三点之间的角度。一个很好的例子是,如果三个角度形成179度角,那么这些点变为形成181度角。所以我真正需要的是确定角度是否大于180度的好方法。我尝试使用余弦定律,但它没有给我一个很好的答案,因为当这些点形成181度角时,它只是将它解释为不同方向的179度角。此外,我在Python中这样做,如果这有帮助。谢谢!
答案 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函数,其中包含向量p2p1
和p2p3
Angle(in radians) = atan2(cross(p2p1,p2p3), dot(p2p1,p2p3))