合并两个多边形的算法(使用连通性)?

计算科学 算法 计算几何 几何学 向量
2021-11-30 17:01:38

我正在努力实现一种做一件简单事情的算法:

考虑两个多边形(可以绘制任意两个多边形并为其顶点编号),它们在节点列表中的连通性是:

A = [1, 2, 3, 4, 5] B = [1, 6, 7, 8, 3, 2]

这两个多边形共享 2 个面 (1, 2) 和 (2, 3)。

我想要做的是将它们合并到联合多边形中并恢复连接:

C = [1, 6, 7, 8, 3, 4, 5]

规则是:

  1. 所有多边形的连接性都是逆时针排列的(所以如果 A 有面 [1, 2],B 有面 [2, 1] 等等......)
  2. C 中的第一个节点索引是什么并不重要,但它也必须逆时针排序。
  3. 多边形可以共享任意数量的面(生成的元素也可以有一个孔,但这是一种边缘情况)

我的想法是:

  • 获取共享节点列表(本例中为 [1, 2, 3])
  • 找到不在列表中的任何多边形中的第一个节点并标记它,
  • 从该元素添加节点逆时针移动
  • 找到列表中的节点后,转到另一个元素并从那里添加节点,
  • 来回切换,直到再次找到第一个节点

问题:如果联合形成一个洞,它就不起作用......

我不知道是否有标准的方法来做到这一点。如果我把事情复杂化了。我想要一些反馈,以了解这是否是一种合理的方法。更一般地说,如果有的话,我在哪里可以读到它们,合并一组多边形并获得联合连通性的算法。

感谢您阅读低谷和任何提示。

1个回答

简单:

  • 将多边形分解为(无方向的)线段,每个线段按顶点索引排序:

    A={[1,2],[2,3],[3,4],[4,5],[1,5]},B={[1,6],[6,7],[7,8],[3,8],[2,3],[1,2]}.

  • 然后你想考虑所有这些边的联合,但删除重复的边。所以你需要形成

    (AB)(AB)={[3,4],[4,5],[1,5],[1,6],[6,7],[7,8],[3,8]}.

  • 现在你只需要重新构造顶点的顺序。因为你知道它是一个封闭的多边形,所以你从第一条线段开始,然后你找到从最后一条线段的第二个顶点开始的线段,等等。所以你得到

    [[3,4],[4,5],[5,1],[1,6],[6,7],[7,8],[8,3]].

  • 如果您发现此顺序在几何上不是顺时针或逆时针(无论您希望它是什么),只需恢复线段出现的顺序以及每个线段中顶点的顺序。