我需要將兩個凸的非交叉多邊形合併爲一個連接的凸多邊形,以最小化所產生的面積,如下圖所示:我正在尋找一個這樣做的算法。如果有人向我提供相應的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++的凸性?
這些建議不利用這樣的事實,即點已經組織在兩個獨立的凸包中。 –
什麼可能是一種可能的方式來做到這一點? –
檢查我的答案。散裝有兩個多邊形而不是頂點表示它們已分類。所以你可以省去分揀步驟(交易進行簡單的合併)。 –