来自线段的多边形

时间:2015-06-05 07:36:56

标签: line polygon segment

我有一个没有特定顺序的线段列表。

我想找到由段形成的所有封闭空间(多边形)。有没有一种有效的算法或方法可以用来做到这一点?

下图说明了该问题。在给定黑线段的情况下,如何检测绿色多边形?

How do find polygons (green) from line segments?

3 个答案:

答案 0 :(得分:1)

一种方法是按如下方式构建图表:

  • 节点是边缘的交点

  • 节点 i j 之间的边缘iff指向 i j 处于同一边缘

一旦您构建了图表:

由于FooBar的优秀点,

编辑从原版修改。

答案 1 :(得分:1)

这确实是computational geometry中的经典问题。

您正在寻找arrangement个细分中的faces

要使用过多的详细信息和源代码来讨论此主题,请参见以下精彩的库:CGAL

请注意,您必须决定要做什么,例如另一个内部有一个多边形,许多多边形交织在一起,等等。

答案 2 :(得分:1)

Ami的答案是正确方向的好指针,但这是您可能需要了解的更详细的步骤:

  1. 获取线段列表并构建顶点集合。由于通过蛮力检查每个单独的段是否与其他段相交,因此基本上是N ^ 2操作,因此您可能希望构建一个四叉树并使用它来减少执行的检查次数。如果n很小,或者您有大量的cpu时间需要刻录,则只需蛮力就可以了,否则您需要对碰撞检测更加聪明。这是一个实现四叉树碰撞检测的库:https://github.com/hroger1030/SpatialTrees

  2. 有了节点和边的列表,您就可以构建图形。您可以将线称为结点,将相交称为边,反之亦然,这没关系。重要的是,您现在可以直接在图上找到所有循环,其中循环中的节点数> 2。

我碰巧碰巧用c#:Tarjan cycle detection help C#编写了Tarjan循环检测的实现。这可能是建议的“连接组件算法”的替代方法。