我有一组连接的相交线段。我想检测由这些线段的交集产生的所有多边形,如下所示:
我发现了一篇提出解决这个问题的算法的论文,但我并不是一个真正的计算机科学人,所以我无法理解它。这是paper的链接。此时,我的计划是1)找到所有交叉点,并且2)以某种方式使用这些交叉点来识别多边形。我能够通过蛮力解决(1),但(2)有点棘手。我更喜欢R或C ++中的解决方案,但任何语言都可以。
答案 0 :(得分:2)
假设您的线段始终是一个封闭的多边形链,并且您将它们放在某种边缘列表中。并且,正如您所说,您已经计算了交叉点(蛮力意味着O(n ^ 2)时间,在这种情况下,这是最佳的,因为线段可以相交n ^ 2次)。
您可以将(1)中的交点插入此列表中,将相交的线段分开,将它们标记为交点,并在此点引用所有相交的线段。此外,在每个线段上,两个多边形是入射的,因此将相应的参考场添加到每个边缘。然后,只需在输入中取最左边的顶点,然后沿边缘列表移动。添加到遍历对其左入射多边形(在本例中为多边形)的引用的每个边。如果到达交叉点,请将其放在某种堆栈上以便以后恢复。现在分析该点并继续在最左边的路径上行走(在到达交叉点的线段和所有传出的线段之间)。在某些时候,您到达起点并且第一个简单多边形已关闭。
现在从堆栈中取出第一个交叉点。必须有偶数个线段在那里开始/结束。找到一个最多只有一个引用的入射多边形的线段(还),并将其用作第二个多边形的起始线段。您可以像以前一样沿着它的链走。 (如果您引用线段的右侧入射多边形,请在交叉点上最右侧转弯。)当您的堆栈为空时,您已完成。
编辑:在我再次寻找解决方案之后,我发现了implementation from Dan Sunday。我认为它更有用,因为它已经实现了。
答案 1 :(得分:0)
Alfredo Ferreira开发了用于检测来自一组重叠线的多边形的c ++代码。你可以在他的页面找到代码:http://3dorus.ist.utl.pt/tools/PolygonDetector.html 希望这有助于
答案 2 :(得分:0)
在尝试论文中的算法后,我刚刚发布了我的实现,速度非常快。
基本思想是去除检测到的循环并重新搜索(去除检测到的循环的“耳朵”)。 我也只是取消将点连接到图形的线段。消除重叠分两步:使用面积公式,该公式非常精确,然后近似特定范围内的交点差异。