多边形的对角线在里面还是外面?

时间:2010-05-12 06:55:58

标签: algorithm math polygon

我有三个连续的多边形点,比如p1,p2,p3。现在我想知道p1和p3之间的正交是在多边形内部还是在多边形外部。

我是通过取三个向量v1,v2和v3来做到的。多边形中点p1之前的点表示p0 v1 = (p0 - p1)
v2 = (p2 - p1)
v3 = (p3 - p1)

关于this问题,我使用的是该问题的接受答案中显示的方法。它只适用于逆时针方向。如果我的点是顺时针方向怎么办

我也知道我的整个多边形是顺时针或逆时针。因此我选择向量v1和v2。但我仍然遇到了一些问题。我正在展示一个我遇到问题的案例。

alt text http://i42.tinypic.com/2dt8aaw.jpg

此多边形是逆时针方向。它是从v1和v2的起源开始的。

3 个答案:

答案 0 :(得分:2)

基本上,对角线可以完全在内部,完全在外部,内部和外部,并且在所有三种情况下可能重叠一个或多个边缘。这使得确定你需要的东西并非完全无足轻重。

从数学方面来说,内外之间实际上并没有那么大的区别,除了外面有无限区域这样的小细节。 (至少对于2D平面;在球体上,对于plygon的内部和外部没有明显区分。)

您还有一个关于多边形边排序的子问题。最简单的方法是按顺序对相邻边之间的所有角度求和。这将加起来为N *(pi / 2)。对于CCW多边形,N是正的。

[编辑] 一旦你知道方向,如果你没有上面列出的硬案例,问题就很容易了。角度p0-p1-p2小于角度p0-p1-p3。因此,边缘p1-p3至少部分地位于多边形之外。如果它没有穿过任何其他边缘,它显然完全位于多边形之外。

答案 1 :(得分:2)

由于你的点数是连续的,你可以通过检查三角形p1 p2 p3的方向来解决这个问题。如果方向与多边形的方向相同,则对角线位于内侧,否则位于外侧。

要确定三角形的方向,最简单的方法是计算签名区域并检查符号。计算

p1.x * p2.y + p2.x * p3.y + p3.x * p1.y - p2.x * p1.y - p3.x * p2.y - p1.x * p3.y

如果此值的符号为正,则方向为逆时针方向。如果符号为负,则方向为顺时针方向。

准确地说,上述方法仅为您提供有关对角线所在多边形的哪一侧的信息。显然,多边形仍然可以在以后的点与对角线相交。

答案 2 :(得分:0)

任意两个向量之间的角度是

alpha = acos(v1.x * v2.x + v1.y * v2.y)

因为你现在可以拥有

之间的角度
v1 and v3 = alpha1; v1 and v2 = alpha2; 

您可以检查alpha2是否在alpha1中:

function normalize(a):
    if a > 2 * pi then a - 2 * pi
    else if a < 2 * pi then a + 2 * pi
    else a

alpha1 = normalize(alpha1)
alpha2 = normalize(alpha2)

if (alpha2 < alpha1) then is_between
else is_not_between

这不是很完整,但你应该明白这一点。

编辑:如果多边形重叠,就像MSalters所说的那样,它将无效。