将两个凸的非相交多边形连接成一个

时间:2017-09-05 07:46:46

标签: python computational-geometry

我需要将两个凸的,不相交的多边形连接到一个连接的凸多边形中,以最小化结果区域,如下图所示:enter image description here我正在寻找一个做法的算法。如果有人向我提供相应的python实现,我也将不胜感激。

3 个答案:

答案 0 :(得分:4)

如果有两个非相交的多边形分别有say,m和n个顶点,那么可以通过这种方式考虑你的问题:

查找包含所有m + n个点的最小区域的凸多边形。说完这个,请查看此处的QuickHull Algorithmhttp://www.geeksforgeeks.org/quickhull-algorithm-convex-hull/

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

贾维斯的算法:http://www.geeksforgeeks.org/convex-hull-set-1-jarviss-algorithm-or-wrapping/

而且,格雷厄姆的扫描:http://www.geeksforgeeks.org/convex-hull-set-2-graham-scan/

希望这有帮助。

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

答案 1 :(得分:3)

要获得有效的解决方案,您可以按如下方式调整Monotone Chain方法(https://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Convex_hull/Monotone_chain):

  • 对于两个多边形,找到最左边和最右边的网站(如果是关系,分别使用最高/最低);

  • 这些网站将多边形分成两个链,这些链在X上排序;

  • 将两个上部链和两个下部链合并为X上的比较(这是mergesort的传递);

  • 使用与单调链方法相同的程序(格拉汉姆散步的变体)拒绝来自上下链的反射位点。

总运行时间将由

决定
  • n + m比较以找到极端位置;

  • 合并的n + m比较;

  • n + m + 2 h LeftOf测试(签名区域; h是结果的数字顶点)。

因此复杂度为O(n + m),这不是最优的,但很可能足以满足您的目的(当多边形不重叠时,可以使用更复杂的O(Log(n + m)解决方案)值得为小多边形尺寸大惊小怪。)

enter image description here

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

最后评论:如果将所有多边形保留为两个单调链的串联,则可以省略上述过程的第一步。

答案 2 :(得分:0)

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

  1. 鉴于多边形PQ,请从每个顶点p1q1中选择。

  2. Q中搜索与q2相邻的顶点q1,以便从p1-q1p1-q2的旋转顺时针(可以检查)轻松使用矢量交叉产品)。

  3. 重复直至到达qk点,其中Q中的两个连续顶点生成并逆时针旋转。

  4. 现在,将p1的过程从P中的多个顶点反转,使旋转逆时针旋转,直到再次找到极端pl

  5. 从2开始重复,直到无法再提前。您现在有两个点pmpn,它们是两个顶点,其中红色区域的一边与上图中的黑色多边形相交。

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

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