Python 将两个凸的不相交多边形合并为一个多边形

Python 将两个凸的不相交多边形合并为一个多边形,python,computational-geometry,Python,Computational Geometry,我需要将两个凸的、不相交的多边形连接成一个连接的凹多边形,以最小化生成的面积,如下图所示:我正在寻找一个alhorithm这样做。如果有人向我提供相应的python实现,我也将不胜感激。如果有两个不相交的多边形分别具有m和n个顶点,那么您的问题可以这样考虑: 求包含所有m+n点的最小面积的凸多边形。说到这里,请查看QuickHull算法: 此外,您还可以查看这些算法 贾维斯算法: 格雷厄姆扫描: 希望这有帮助 另外,我想你可以在互联网上的任何地方找到这些算法的python实现。:) 找到这两个集

我需要将两个凸的、不相交的多边形连接成一个连接的凹多边形,以最小化生成的面积,如下图所示:我正在寻找一个alhorithm这样做。如果有人向我提供相应的python实现,我也将不胜感激。

如果有两个不相交的多边形分别具有m和n个顶点,那么您的问题可以这样考虑:

求包含所有m+n点的最小面积的凸多边形。说到这里,请查看
QuickHull算法

此外,您还可以查看这些算法

贾维斯算法:

格雷厄姆扫描:

希望这有帮助


另外,我想你可以在互联网上的任何地方找到这些算法的python实现。:)

找到这两个集合的凸包将起作用,但以下方法可能更快,因为它只需要按顺序访问多边形顶点:

  • 给定多边形
    p
    Q
    ,从每个多边形中拾取一个顶点
    p1
    q1

  • Q
    中搜索与
    q1
    相邻的顶点
    q2
    ,以便从
    p1-q1
    p1-q2
    的旋转为顺时针方向(可以使用向量叉积轻松检查)

  • 重复此操作,直到到达一个点,该点的两个相邻顶点在Q中生成逆时针旋转

  • 现在,反转从p中连续顶点的
    p1
    移动过程,使旋转逆时针,直到再次找到极端的
    pl

  • 从2开始重复,直到无法再前进。现在有两个点
    pm
    pn
    ,这两个点是红色区域的一侧与上面图形中的黑色多边形相交的两个顶点

  • 现在再次重复该算法,但改变方向,从顺时针到逆时针,反之亦然,以便找到红色区域另一侧的顶点

  • 剩下的唯一工作是从已经找到的两个红色区域边和多边形的线段生成最终多边形


  • 为了获得有效的解决方案,可以对单调链方法()进行如下调整:

    • 对于这两个多边形,找到最左边和最右边的位置(如果是并列位置,则分别使用最高/最低的位置)

    • 这些站点将多边形拆分为两条链,按X排序

    • 通过X上的比较合并两个上链和两个下链(这是mergesort的过程)

    • 使用与单调链法(格雷厄姆步行法的一种变体)相同的程序,从上链和下链拒绝反射部位

    总运行时间将由

    • n+m比较,找出极端位置

    • 合并的n+m比较

    • n+m+2h测试(有符号区域;h是结果的顶点数)

    因此,复杂性为O(n+m),这不是最优的,但对于您的目的来说可能已经足够好了(当多边形不重叠时,可以使用更复杂的O(Log(n+m)解决方案,但对于较小的多边形大小不值得大惊小怪)

    在本例中,合并的结果只是链的串联,但可能会出现更复杂的情况


    最后一句话:如果您将所有多边形保持为两个单调链的串联,则可以省去上述过程的第一步。

    这些建议没有利用点已经组织在两个独立的凸包中这一事实。有什么可能的方法可以做到这一点?请检查我的答案。使用两个多边形而不是顶点批量意味着它们被排序了。所以你可以省去排序步骤(用简单的合并进行交易)。我想是这样的。