我正在寻找一种方法来查找两个相邻多边形的轮廓。
多边形由多边形中出现的点列表定义。在我的用例中,没有重叠的多边形,多边形之间没有间隙,并且没有带有"孔的多边形"。
我想计算两个多边形的轮廓,没有任何"孔"。 这些pictures显示了预期的结果。
我知道有很多用于剪裁多边形的库,但是对于它们中的大多数而言,性能不是很好,因为它们适用于任何类型的多边形(具有孔,重叠多边形等)。在我的用例中,算法必须实时处理许多多边形(> 20.000)。我怎样才能最有效地计算轮廓?
答案 0 :(得分:0)
鉴于
没有重叠的多边形,多边形之间没有间隙,没有带“洞”的多边形
以下算法应该可以解决问题。
弃掉重复的线段。
计算剩下的doubly connected edge list的自然组合嵌入。每个区段产生两个节点(半边,彼此反转,其中一个端点是头部(分别是尾部),另一个端部是尾部(分别是头部)),每个半边连接以逆时针方向使用相同的头部到下一半边缘。
提取脸部。组合嵌入中的 face 是最小的非空半边集,使得对于每个半边e,与e的下一半边的反转在集合中。该组面是半边的分区。请参阅下面的ASCII艺术图。
U----V----W
| | |
| | |
Z----Y----X
无限的面孔是{U->Z, Z->Y, Y->X, X->W, W->V, V->U}
。 W->V
的下半边是U->V
。 W->V
的下一半边缘的反面是V->U
。其他面孔为{U->V, V->Y, Y->Z, Z->U}
和{V->W, W->X, X->Y, Y->V}
。
通过对有符号的逆时针角度求和并测试符号,仅保留无限面。像{U->V, V->Y, Y->Z, Z->U}
这样的有限面具有负和
/_UVY - 180 + /_VYZ - 180 + /_YZU - 180 + /_ZUV - 180
= 4 * (90 - 180) = -360.
无限的面孔有正和
/_UZY - 180 + /_ZYX - 180 + /_YXW - 180 + /_XWV - 180 + /_WVU - 180 + /_VUZ - 180
= 4 * (270 - 180) + 2 * (180 - 180) = 360.