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

Python 给定三个坐标点,如何检测它们之间的角度何时跨越180度?,python,math,geometry,trigonometry,angle,Python,Math,Geometry,Trigonometry,Angle,这看起来应该很简单,但我有麻烦。基本上,我有三个不断变化的点(让我们称它们为p1、p2和p3)。另外,让我们将p2定义为顶点 基本上,我需要做的是计算三点之间的角度。一个很好的例子是,如果这三个角度形成179度的角度,那么这些点就会变成181度的角度。所以我真正需要的是一个很好的方法来确定角度是否大于180度。我尝试使用余弦定律,但它并没有给我一个好的答案,因为当点形成181度角时,它只是将其解释为不同方向的179度角。另外,如果有帮助的话,我正在用Python做这件事。谢谢 您要确定的是(p3

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


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

您要确定的是(p3-p2)与(p2-p1)相比是左转还是右转。这实际上是用于计算凸包()的Graham扫描的核心部分。略作编辑引用维基百科:

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


要获得整个范围内的有符号角度,请使用atan2函数,并使用向量的点和叉积
p2p1
p2p3

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

你们有一致的角度测量方案吗?所有角度都是逆时针测量的吗?在这种情况下,你必须知道角度在第一段的顺时针或逆时针方向,对吗?否则,将181解释为179是绝对正确的。所有角度的测量都是一致的。不管是逆时针还是顺时针,重要的是当角度穿过180度边界时。这里完全不需要三角函数,因此,我建议不要增加复杂性。@Dietrich Epp作者的短语
我需要做的是计算三个点之间的角度
意味着他需要角度值,而不仅仅是180度边界交叉的事实问题的标题是“当它们之间的角度交叉180度时如何检测?”,而不是“如何计算角度”。这很好。我想补充一点,这也可以用楔形积来解释,楔形积不需要我们引入额外的尺寸。楔形积也更一般,因为它可以在更多尺寸的空间中计算绕组,而叉积只适用于3。