【问题标题】:Polygons from line segments线段的多边形
【发布时间】:2015-08-20 01:45:56
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# algorithm graph polygon convex-hull


    【解决方案1】:

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

    • 节点是边的交点

    • 如果点 ij 在节点 ij 之间,则存在一条边同一条边

    构建图表后:

    编辑由于 FooBar 的出色观点而从原始修改。

    【讨论】:

    • 连接组件的一个边缘情况是划分一个区域的边缘(因此它是几个连接组件的一部分)。
    • 凸包步骤的目标是什么?非凸区域会发生什么?
    • @FooBar 我认为这是 OP 的问题。
    • 如果有 2 个正方形共享一条线,您的算法将构建大矩形而不是 2 个正方形。
    • 使用双连接组件似乎可行
    【解决方案2】:

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

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

    关于这个主题的讨论(太多)细节和源代码,有这个很棒的库:CGAL

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

    【讨论】:

      【解决方案3】:

      Ami 的回答是正确方向的一个很好的指针,但以下是您可能需要了解的更详细的步骤:

      1. 获取线段列表并构建顶点集合。由于通过蛮力检查每个单独的线段是否与其他线段相交基本上是 N^2 操作,因此您可能需要构建一个四叉树并使用它来减少您正在执行的检查次数。如果 n 很小或者你有很多 cpu 时间要烧掉,那就暴力破解它,否则你需要聪明地进行碰撞检测。这是一个实现四叉树碰撞检测的库:https://github.com/hroger1030/SpatialTrees

      2. 使用您的节点和边列表,您可以构建图表。您可以将线节点和交叉点称为边缘,反之亦然,这无关紧要。重要的是你现在可以在图中找到所有循环中节点数 > 2 的循环。

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

      【讨论】:

      • 一旦你确定了它?我不知道,一旦你确定了它,我不知道你将如何处理它。你需要弄清楚,有很多方法可以表示多边形。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 2012-11-15
      • 2017-09-27
      • 2018-05-06
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多