【问题标题】:Union of many (more than two) polygons without holes [duplicate]许多(两个以上)没有孔的多边形的联合[重复]
【发布时间】:2011-11-01 07:41:54
【问题描述】:
我正在创建没有孔的多边形联合。输入多边形没有孔,输出也应该是。我已经有了为两个多边形找到它的工作算法。但如果超过两个,就会出现问题。作为一个联合不应该是不相交的多边形,当我尝试一个一个地计算它们的总和时,在这种情况下我遇到了一个问题:
然后多边形 1 与多边形 2 相遇,联合是不相交的(所以我的算法不计算总和)。在第二个循环中,它当然与第三个和第四个多边形合并,但输出没有第二个多边形。
那么有人知道一种快速准确的算法吗?
可能一个好主意是首先按交叉点对多边形进行排序,但我想不出任何快速算法,而且我也不太确定应该如何对它们进行排序。
【问题讨论】:
标签:
algorithm
sorting
geometry
polygon
【解决方案1】:
我会使用扫描线算法来查找所有边缘交叉点,在交叉点处断开轮廓,然后从(例如)最低 x 坐标顶点开始沿着边缘行走,始终选择最外面的那个。多做一点工作就可以摆脱无孔条件(孔只是不同方向的轮廓)。
【解决方案2】:
您可以迭代地执行此操作并生成一组连接组件(而不是总是只有一个连接组件):
- 将所有多边形放入“打开”列表中。将 components 列表初始化为空。
- 虽然 open 不为空:
- 从 open 中移除一个多边形 p 并将标志 changed 设置为 true。
-
更改为真时重复:
- 设置更改为假
- 对于 open 中的每个多边形 q:
- 如果q与p相交,从open中移除q,设置changed为 true,并将 p 设置为 p 和 q 的并集。
- 将 p 添加到 组件。
最后,components 将包含所有可以通过合并输入多边形形成的不相交、连接的组件。在您发布的示例中,它应该生成一个多边形。
这不是最有效的方法(请参阅 Ricky Bobby 发布的链接中的算法),但它具有简单的优点。如果您不处理数百个多边形,它应该可以正常运行。
附:正如@japreiss 指出的那样,即使输入多边形都没有孔,即使输入都是凸多边形,联合也可以有孔。如果输入可以是凹的,那么即使是 2 个多边形的并集也可以有一个洞。你的 2 多边形算法已经处理了吗?