Ho due poligoni convessi. I poligoni sono implementati come liste cicliche dei loro vertici. Come trovare un'intersezione di questi due poligoni?Intersezione di due poligoni convessi
risposta
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.
Questo dovrebbe essere sufficiente per un utilizzo semplice; 10-20 vertici e non ricalcolare ogni fotogramma. — O (n)
Ecco alcuni link:
è possibile beneficiare del fatto che entrambi i poligoni sono convessi. E con questa conoscenza è possibile ottenere il tempo O (n) utilizzando l'algoritmo della linea di scansione successiva:
Trova punti di punta in entrambi i poligoni. Per semplicità supponiamo di non avere bordi orizzontali. Crea elenchi di bordi che contribuiscono ai limiti sinistro e destro di un poligono.
Mentre si spiana il piano verso il basso, si memorizzano 4 spigoli. left_edge_C1, right_edge_C1, left_edge_C2, right_edge_C2. Non hai bisogno di alcun complesso per battere i bordi, perché ce ne sono solo quattro. Puoi trovare il prossimo punto dell'evento semplicemente ripetendo tutte le opzioni possibili.
In corrispondenza di ciascun punto di evento, alcuni bordi appaiono sul limite della loro intersezione. Fondamentalmente, in ogni punto dell'evento puoi avere uno dei casi gratuiti (vedi la foto).
Che cosa significa "punto evento"? – TJM
Oltre @ bella descrizione aereo-sweep di Yola, c'è un algoritmo di tempo lineare descritto nel Computational Geometry in C, Capitolo 7. E C & codice Java è disponibile (presso lo stesso link). Esistono diversi casi degenerati difficili, ad esempio quando i due poligoni si intersecano in un punto o l'intersezione è un segmento.
- 1. MongoDB - Intersezione geospaziale di due poligoni
- 2. Come intersecare due poligoni?
- 3. intersezione e unione di poligoni
- 4. Intersezione ricorsiva PostGIS tra poligoni
- 5. Intersezione di due LineString Geopandas
- 6. Intersezione di 2D numpy ndarrays
- 7. Qualsiasi intersezione in due raccolte
- 8. Punti più vicini di due poligoni
- 9. Intersezione di due segmenti di linea paralleli
- 10. Python - Intersezione di due liste di liste
- 11. Intersezione di due set (liste) di dati
- 12. Test intersezione di due lingue regolari
- 13. Intersezione di due elenchi in Bash
- 14. Compute intersezione di due array in JavaScript
- 15. Intersezione di due array con ripetizione
- 16. Intersezione personalizzata Python intersezione
- 17. OpenCV - Intersezione tra due immagini binarie
- 18. Intersezione tra due liste non funziona
- 19. Ricerca di punti di intersezione di due ellissi (Python)
- 20. Come faccio a trovare l'area di sovrapposizione tra i due poligoni arbitrari
- 21. Intersezione di due array numpy di dimensioni diverse per colonna
- 22. intersezione di due array di stringhe (ignora caso)
- 23. Trova la linea di separazione tra due poligoni
- 24. Intersezione CGPathRef
- 25. TravisCI Lasciare fallimenti a intersezione di due elementi
- 26. Intersezione Mysql di due set con valore separato da virgola
- 27. Come selezionare elementi nella intersezione di due liste in Python
- 28. Intersezione di due elenchi senza elementi duplicati in Prolog
- 29. Intersezione efficiente di due liste <String> in Java?
- 30. Intersezione di area in Python
Sei sicuro di dover aggiungere V3 all'intersezione nel caso 3? Sembra sbagliato. – DaZzz
L'ho riscritto per allinearlo meglio con l'algoritmo Sutherland-Hudgman. –