没有孔的多边形联合

时间:2011-07-27 12:42:20

标签: algorithm math geometry polygon computational-geometry

我正在寻找一些相当容易的(我知道多边形联合不是一个简单的操作,但也许有人可以用一个相对简单的方法指向我的方法)合并两个相交的多边形。多边形可以是没有孔的凹面,输出多边形也不应该有孔。多边形以逆时针方式表示。我的意思是在图片上显示。正如你所看到的那样,即使在多边形的组合中有一个洞,我也不需要它在输出中。输入多边形肯定没有洞。我认为没有漏洞应该更容易,但我仍然没有想法。 Polygons - blue and red are input, green is output

3 个答案:

答案 0 :(得分:13)

  1. 删除位于另一个多边形内的多边形的所有顶点:http://paulbourke.net/geometry/insidepoly/
  2. 选择一个保证在联合多边形中的起点(其中一个极值可行)
  3. 以逆时针方式跟踪多边形的边缘。这些是你工会的要点。跟踪直到您到达交叉点(请注意,边可能与另一个多边形的多个边相交)。
  4. 找到第一个交叉点(如果有多个交叉点)。这是你工会的一个观点。
  5. 使用另一个多边形返回步骤3。下一个点应该是与前一个边缘形成最大角度的点。

答案 1 :(得分:3)

您可以按以下步骤操作:

首先将多边形的所有交点添加到您的点集中。

然后我会像graham scan algorithm一样继续,但还有一个约束。

不是选择与前一行形成最大角度的点(查看全景扫描以查看我的意思(*)),而是选择具有最高角度的那个,该角度是前一个多边形之一

你会得到一个描述你的形状的envellope(不是凸起的)。

注意:

它类似于找到你的点的凸包。

例如graham scan algorithm将帮助您找到O(N * ln(N))中点集的凸包,其中N是点数。

查找凸包算法,你可以找到一些想法。

希望它有所帮助。

<强> remarques:

来自维基百科的

(*):

  

此算法的第一步是找到最低点   y坐标。如果最低y坐标存在于多个点中   在集合中,具有最低x坐标的点   候选人应该被选中。称此为P.此步骤采用O(n),   其中n是有问题的点数。

     

接下来,必须按照递增的顺序对点集进行排序   角度它们和点P与x轴的关系。任何通用的   排序算法适用于此,例如heapsort(其中   是O(n log n))。为了加快计算速度,事实并非如此   需要计算这些点与实际角度   x轴;相反,它足以计算这个角度的余弦:它   在所涉及的领域中是单调递减函数   (由于第一步,它是0到180度)并且可能是   用简单的算术计算。

在凸包算法中,您选择与前一侧成最大角度的角度点。

要“粘贴”前一个多边形,只需添加必须选择以前存在的边的约束。

你取消了角度小于180°

的约束 希望我很清楚

答案 2 :(得分:0)

我没有完整的答案,但我即将开始出现类似的问题。我认为有两个步骤非常重要。首先是在一些位于外边缘的多边形上找到一个点。第二个是为所有顶点制作一个边界框列表,并查看其中哪些重叠。这意味着当您遍历顶点时,您不必对所有这些进行测试,只有那些您知道有可能交叉的测试(边界框问题是轻量级的)。

由于您现在有一个外部点,现在可以迭代连接点,直到您检测到交叉点。如果您知道哪一侧在哪里以及哪一侧(您可能需要在第一个顶点上做一些工作才能知道这一点),您就知道在哪个方向上进行交叉。然后,它仅仅是切换多边形的问题。

如果你想保持那个洞(我这样做),这会变得有趣一点,在这种情况下,我可能会确保我已经用尽了所有相交的边界框。如果您的多边形根本不相交,您也没有说明会发生什么。但是,要么让他们独自一人(如果您预期会有一个多边形,这可能会成为问题)或者返回错误。