来自一组边缘的最外面的多边形

时间:2015-07-01 18:38:07

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

enter image description here假设我有一组全部连接的2d线段。我需要一个算法来查找集合中最外面的段。也就是说,限制相同区域的最小子集。

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

编辑: 在顶部是最初的一组段。 下面是删除内部细分的相同轮廓。 (忽略小灰色十字架,它们只是标记交叉点。)

3 个答案:

答案 0 :(得分:4)

用铅笔怎么做??

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

答案 1 :(得分:1)

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

  1. 计算点的凸包。
  2. 将船体组与边缘集相交。这将为您留下一系列可能断开连接的边缘路径。
  3. 通过查找原始边集中的最短路径,任何没有两条边的点(即图中的leaf)都会连接到最近的叶子。
  4. 当船体关闭时,任何关系都可以通过一条路径来打破。

答案 2 :(得分:1)

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

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

源片段构造多边形的三角剖分是明显的步骤:将顶点拉伸到$ d + 1 $抛物面和三角剖分,然后排除三角形,其中至少包含一个不匹配任何源片段的边缘。

另一种可能的方法是略微修改Gift wrapping algorithm