【问题标题】:find the outline of adjacent polygons找到相邻多边形的轮廓
【发布时间】:2014-11-24 00:53:32
【问题描述】:

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

多边形由在多边形中按出现排序的点列表定义。在我的用例中,没有重叠的多边形,多边形之间没有间隙,也没有带有“孔”的多边形。

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

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

【问题讨论】:

  • 将有助于 1) 避免重复顶点; 2)建立反关系“这个顶点属于这个/这些轮廓”。从那里,您可以找到共享一个顶点并且可以合并的轮廓,并且处理将简化为在逻辑上组合两个顶点列表。
  • 致 Yves Daoust:按照您的建议,我可以确定哪些顶点属于两个多边形。但是怎么继续?图片中的案例一很简单。我只需要以正确的顺序在属于两个多边形的多边形 1 的两个顶点之间插入多边形 2 的顶点。从图片上看案例2是我比较难的事情。如果我删除多边形之间的轮廓,则会留下一个“洞”。如何识别哪些轮廓属于“洞”?
  • 您是否看到任何选择保证成为轮廓一部分的顶点的方法?如前所述,图片的案例 2 将导致两个可能的轮廓。 “洞”的轮廓和我正在寻找的轮廓。如果我能确定轮廓的一个点,我就会知道我应该选择哪个轮廓。
  • 问题文本说“多边形之间没有间隙”。在第二个例子中,由红色顶点 3、4、5、6 和蓝色顶点 4、5、6、7 形成的两个多边形之间的那个岛不被认为是间隙吗?

标签: algorithm union polygon outline


【解决方案1】:

给定

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

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

  1. 丢弃重复的线段。

  2. 计算剩下的内容的自然组合嵌入为doubly connected edge list。每个段产生两个节点(半边,彼此反向,段的一个端点是头部(分别为尾部),另一个是尾部(分别为头部)),并且每个半边链接按逆时针顺序到具有相同头部的下半边。

  3. 提取人脸。组合嵌入中的是最小的、非空的半边集合,使得对于每个半边 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}

  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.
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 2016-04-30
    • 2021-10-29
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    相关资源
    最近更新 更多