我有兩個凸多邊形。多邊形實現爲其頂點的循環列表。如何找到這兩個多邊形的交集?兩個凸多邊形的交點
10
A
回答
7
For each edge V1-V2 in the first polygon,
Let H := Half-plane tangenting V1-V2, with the remaining
vertices on the "inside".
Let C := New empty polygon.
For each edge V3-V4 in the second polygon,
Let X := The intersection between V3-V4 and H.
If V3 inside H, and V4 is outside H then,
Add V3 to C.
Add X to C.
Else if both V3 and V4 lies outside H then,
Skip.
Else if V3 outside H, and V4 is inside H then,
Add X to C.
Else
Add V3 to C.
Replace the second polygon with C.
這應該足夠簡單的使用; 10-20個頂點,而不是重新計算每一幀。 — O(ñ )
下面是幾個環節:
5
您可以從以下事實中受益兩個多邊形都是凸的。通過這些知識,您可以使用以下掃描線算法實現O(n)時間:
在兩個多邊形中查找最高點。爲了簡單起見,假設你沒有水平邊緣。創建有助於多邊形左右邊界的邊界列表。
在掃平飛機的同時存儲4條邊。 left_edge_C1,right_edge_C1,left_edge_C2,right_edge_C2。你不需要任何複雜的邊緣,因爲它們只有四個。您可以通過迭代所有可能的選項來找到下一個事件點。
在每個事件點,其交點邊界上會出現一些邊緣。基本上,在每個事件點你可以有一個免費的案例(見圖)。
+0
「事件點」的含義是什麼? – TJM
2
除了@約拉的很好的平面掃描描述, 存在 Computational Geometry in C,第7章與C & Java代碼中描述的線性時間的算法是可用的(在相同的鏈接)。有幾個棘手的退化情況,例如,當兩個多邊形在某一點相交,或者交點是一個線段時。
相關問題
- 1. 將兩個凸的非相交多邊形合併爲一個
- 2. 在scipy中計算兩個不相交多邊形的凸殼
- 3. 找到兩個凸多邊形之間的接觸點
- 4. 凸多邊形與移動圓的交點
- 5. 從頂點獲取凸多邊形
- 6. 多邊形C++的凸性?
- 7. 最快水平線<->凸多邊形交點算法?
- 8. 是否存在有效的算法來確定兩個可能非凸多邊形的邊之間的交點?
- 9. 凸3D多邊形對象
- 10. Python:最小凸多邊形?
- 11. 行距2D中的兩個凸多邊形等距
- 12. 3D中兩個凸多邊形之間的距離
- 13. 凸多邊形,圖形算法
- 14. 從矩形生成凸多邊形
- 15. 爲什麼在非凸多邊形中找到比凸多邊形更硬的點?
- 16. 圈多邊形交點
- 17. Libgdx交叉點多邊形
- 18. 兩個多邊形的最近點
- 19. 檢查點是否位於(或靠近)凸多邊形邊緣
- 20. 非重疊的非凸多邊形
- 21. 來自區域的凸多邊形
- 22. 結合最接近的凸多邊形
- 23. Hausdorff凸多邊形之間的距離
- 24. Cuda中的凸多邊形算法?
- 25. OpenGL中的輪廓非凸多邊形
- 26. 查找凸多邊形中向量之間的交集程度
- 27. 將凹多邊形分解爲凸多邊形
- 28. 在一些小凸多邊形中細分一般多邊形
- 29. 的Java2D:填一個凸起的圓形多邊形(QuadCurves)
- 30. 形成一個凸多邊形的算法
您確定我必須將V3添加到情況3中的交叉點嗎?這看起來不正確。 – DaZzz
我重寫了它,使其與Sutherland-Hudgman算法更好地對齊。 –