我有一个没有特定顺序的线段列表。
我想找到由段形成的所有封闭空间(多边形)。有没有一种有效的算法或方法可以用来做到这一点?
下图说明了该问题。在给定黑线段的情况下,如何检测绿色多边形?
答案 0 :(得分:1)
一种方法是按如下方式构建图表:
节点是边缘的交点
节点 i 和 j 之间的边缘iff指向 i 和 j 处于同一边缘
一旦您构建了图表:
在其上运行Connected Components Algorithm,并检查尺寸为>的已连接组件2
在此类组件的交叉点上运行convex hull算法
编辑从原版修改。
答案 1 :(得分:1)
这确实是computational geometry中的经典问题。
您正在寻找arrangement个细分中的faces
。
要使用过多的详细信息和源代码来讨论此主题,请参见以下精彩的库:CGAL。
请注意,您必须决定要做什么,例如另一个内部有一个多边形,许多多边形交织在一起,等等。
答案 2 :(得分:1)
Ami的答案是正确方向的好指针,但这是您可能需要了解的更详细的步骤:
获取线段列表并构建顶点集合。由于通过蛮力检查每个单独的段是否与其他段相交,因此基本上是N ^ 2操作,因此您可能希望构建一个四叉树并使用它来减少执行的检查次数。如果n很小,或者您有大量的cpu时间需要刻录,则只需蛮力就可以了,否则您需要对碰撞检测更加聪明。这是一个实现四叉树碰撞检测的库:https://github.com/hroger1030/SpatialTrees
有了节点和边的列表,您就可以构建图形。您可以将线称为结点,将相交称为边,反之亦然,这没关系。重要的是,您现在可以直接在图上找到所有循环,其中循环中的节点数> 2。
我碰巧碰巧用c#:Tarjan cycle detection help C#编写了Tarjan循环检测的实现。这可能是建议的“连接组件算法”的替代方法。