找到相邻多边形的轮廓

时间:2014-09-29 15:11:34

标签: algorithm union polygon outline

我正在寻找一种方法来查找两个相邻多边形的轮廓。

多边形由多边形中出现的点列表定义。在我的用例中,没有重叠的多边形,多边形之间没有间隙,并且没有带有"孔的多边形"。

我想计算两个多边形的轮廓,没有任何"孔"。 这些pictures显示了预期的结果。

enter image description here

我知道有很多用于剪裁多边形的库,但是对于它们中的大多数而言,性能不是很好,因为它们适用于任何类型的多边形(具有孔,重叠多边形等)。在我的用例中,算法必须实时处理许多多边形(> 20.000)。我怎样才能最有效地计算轮廓?

1 个答案:

答案 0 :(得分:0)

鉴于

  

没有重叠的多边形,多边形之间没有间隙,没有带“洞”的多边形

以下算法应该可以解决问题。

  1. 弃掉重复的线段。

  2. 计算剩下的doubly connected edge list的自然组合嵌入。每个区段产生两个节点(半边,彼此反转,其中一个端点是头部(分别是尾部),另一个端部是尾部(分别是头部)),每个半边连接以逆时针方向使用相同的头部到下一半边缘。

  3. 提取脸部。组合嵌入中的 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->VW->V的下一半边缘的反面是V->U。其他面孔为{U->V, V->Y, Y->Z, Z->U}{V->W, W->X, X->Y, Y->V}

  4. 通过对有符号的逆时针角度求和并测试符号,仅保留无限面。像{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.