我正在寻找一些相当容易的(我知道多边形联合不是一个简单的操作,但也许有人可以用一个相对简单的方法指向我的方法)合并两个相交的多边形。多边形可以是没有孔的凹面,输出多边形也不应该有孔。多边形以逆时针方式表示。我的意思是在图片上显示。正如你所看到的那样,即使在多边形的组合中有一个洞,我也不需要它在输出中。输入多边形肯定没有洞。我认为没有漏洞应该更容易,但我仍然没有想法。
答案 0 :(得分:13)
答案 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)
我没有完整的答案,但我即将开始出现类似的问题。我认为有两个步骤非常重要。首先是在一些位于外边缘的多边形上找到一个点。第二个是为所有顶点制作一个边界框列表,并查看其中哪些重叠。这意味着当您遍历顶点时,您不必对所有这些进行测试,只有那些您知道有可能交叉的测试(边界框问题是轻量级的)。
由于您现在有一个外部点,现在可以迭代连接点,直到您检测到交叉点。如果您知道哪一侧在哪里以及哪一侧(您可能需要在第一个顶点上做一些工作才能知道这一点),您就知道在哪个方向上进行交叉。然后,它仅仅是切换多边形的问题。
如果你想保持那个洞(我这样做),这会变得有趣一点,在这种情况下,我可能会确保我已经用尽了所有相交的边界框。如果您的多边形根本不相交,您也没有说明会发生什么。但是,要么让他们独自一人(如果您预期会有一个多边形,这可能会成为问题)或者返回错误。