【问题标题】:Outermost Polygon from a set of Edges一组边的最外层多边形
【发布时间】:2015-07-01 18:38:06
【问题描述】:

假设我有一组全部连接的二维线段。我需要一种算法来找到集合中最外层的段。即,限定同一区域的最小子集。

注意:这与寻找构成线段的点的凸包不同。

编辑: 顶部是初始段集。 下面是删除了内部段的相同轮廓。 (忽略灰色的小十字,它们只是用来标记交叉点。)

【问题讨论】:

  • 所以你有一个复杂的多边形,你想把它缩小到它的外边界?例如。如果你把一个五角星放进去,你会放五个段,然后拿出十个段来描述轮廓?
  • 没有。请参阅我使用附加示例所做的编辑。
  • 知道了。它会是被边缘完全包围的每个点的轮廓吗?边缘肯定是原件的子集吗?你能保证没有相交的段吗?
  • 是的,是的。对于特定的应用程序,两者都是正确的。
  • 您的绘图是否以矢量或光栅形式提供?

标签: computational-geometry line-segment geometry-class-library


【解决方案1】:

你会用铅笔怎么做...?

  1. 找到最左边的顶点(最小 x)。如果有多个,请选择其中最低的一个(最小 y)。当前顶点下方没有顶点,因此以“向下”方向为参考。
  2. 查找从当前顶点出发的所有边并计算它们的方向(方位角)。找到与参考方向成最小正角(逆时针)的那个。这将是大纲部分。
  3. 选择它的另一端作为新的“当前”顶点,并设置从该顶点到最近的顶点的方向作为新的参考方向。
  4. 从第 2 步开始,直到到达起始顶点。
  5. 删除所有未访问的片段。
  6. 删除所有孤立顶点(如果在第 5 步中出现)。

【讨论】:

    【解决方案2】:

    给定一个三角非凸多边形,您可以指定顶点遍历的方向(逆时针顺时针方向)。使所有的三角形都以类似的方向 WRT 遍历它的顶点。将所有三角形分解为有向边。每个三角形的每条边都是两个顶点(a, b) 的元组。对于每个相邻的三角形,您有两个相反的边 (a, b)(b, a)。您可以简单地将这样的一对边排除在进一步考虑之外。最后,您将获得一组专门的外边缘。

    如果您的多边形由非简单部分组成,则不会失去一般性(但您仍然可以指定顶点遍历的方向)。

    对源段构建的多边形进行三角剖分的步骤很明显:将顶点拉伸到 $d + 1$ 抛物面上并进行三角剖分,然后排除三角形,其中包含至少一条不匹配任何源段的边。

    另一种可能的方法稍作修改Gift wrapping algorithm

    【讨论】:

    • 添加到问题中的图像表明多边形是三角剖分的,但描述并没有做出这样的保证。
    【解决方案3】:

    以下是从convex hull 开始然后向内工作的方法。直觉是,您从船体上的边缘开始,然后通过沿着边缘集中的最短路径找到“沿”间隙的最近点来填充间隙。

    1. 计算点的凸包。
    2. 将船体组与边缘组相交。这将为您留下一系列可能不连贯的边缘路径。
    3. 任何没有两条边的点(即图形术语中的 leaf)都通过在原始边集中找到最短路径连接到其最近的叶子。
    4. 任何关系都可能被船体封闭时形成最小区域的路径打破。

    【讨论】:

      猜你喜欢
      • 2012-04-15
      • 2018-02-13
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      • 2020-02-23
      相关资源
      最近更新 更多