我需要将两个凸的非交叉多边形合并为一个连接的凸多边形,以最小化所产生的面积,如下图所示:我正在寻找一个这样做的算法。如果有人向我提供相应的python实现,我也将不胜感激。将两个凸的非相交多边形合并为一个
回答
如果存在具有这样说,m和n个顶点分别,那么你的问题可以被认为是两个不相交的多边形:
查找包含所有的M +的面积最小的凸多边形n分。话虽如此,看看QuickHull Algorithm
这里:http://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实现。 :)
发现两组的凸包的工作,但下列方法可能更快,只需要访问的多边形顶点顺序:
鉴于多边形
P
和Q
,从每一个挑一个顶点p1
和q1
。在
Q
搜索顶点q2
邻接q1
使得从p1-q1
到p1-q2
旋转是顺时针的(这可以使用easyly矢量叉积进行检查)。重复上述步骤直到您到达点Q其中Q中的两个连续顶点生成并逆时针旋转。
现在,将从
p1
行进的过程翻转到P中的相邻顶点,使得旋转逆时针旋转直到再次找到极值pl
。从2开始重复,直到不再有可能。您现在有两个点
pm
和pn
,它们是两个顶点,红色区域的一边与上图中的黑色多边形相交。现在再次重复算法,但改变方向,从顺时针到逆时针,反之亦然,以便找到红色区域另一侧的顶点。
剩下的唯一工作是从已经找到的两个红色区域边和多边形中的区段生成最终的多边形。
对于一个有效的解决方案,你可以按照如下适应单调链法(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(日志(N + M)的解决方案,能够把多边形没有重叠,但不值得忙乱对于小多边形尺寸)。
在该示例中,合并的结果是链的只是级联的,但可能会出现更复杂的情况。
最后的评论:如果你保留所有的polygo ns作为两个单调链的连接,可以省去上述过程的第一步。
- 1. 两个凸多边形的交点
- 2. 合并相交的多边形一个多边形
- 3. 在scipy中计算两个不相交多边形的凸壳
- 4. java - 将多边形合并为一个多边形
- 5. java如何将多个矩形合并为一个多边形
- 6. 合并两个多边形区域为一个多边形区域中的R
- 7. 非重叠的非凸多边形
- 8. 从两个相交的多边形创建一个新的MKPolygon
- 9. 将重叠的三角形合并为一个多边形
- 10. 在Java中合并两个多边形
- 11. 合并两个凸包
- 12. OpenGL中的轮廓非凸多边形
- 13. 将凹多边形分解为凸多边形
- 14. 是否存在有效的算法来确定两个可能非凸多边形的边之间的交点?
- 15. 如何合并多个多边形为一个在java中
- 16. 合并多个谷歌地图的多边形到一个多边形,JavaScript的
- 17. python:scipy.spatial:绘制一个凸多边形并计算区域
- 18. 结合最接近的凸多边形
- 19. 如何将凸多边形分割为给定比例的两个区域?
- 20. 的Java2D:填一个凸起的圆形多边形(QuadCurves)
- 21. 非凸多边形 - 使用凸包算法的预处理
- 22. 将凸多边形拟合到给定的矩形中
- 23. 谷歌地图将矩形合并为一个多边形并搜索它
- 24. 形成一个凸多边形的算法
- 25. 行距2D中的两个凸多边形等距
- 26. 找到两个凸多边形之间的接触点
- 27. 3D中两个凸多边形之间的距离
- 28. 如何将两个非顺序的git提交合并为一个?
- 29. 为什么在非凸多边形中找到比凸多边形更硬的点?
- 30. 多边形C++的凸性?
这些建议不利用这样的事实,即点已经组织在两个独立的凸包中。 –
什么可能是一种可能的方式来做到这一点? –
检查我的答案。散装有两个多边形而不是顶点表示它们已分类。所以你可以省去分拣步骤(交易进行简单的合并)。 –