Genera poligoni da un insieme di linee che si intersecano


10

Questa è una domanda semplice e abbastanza comune che è già stata posta per scopi diversi (vedi questo link e anche questo , per esempio), qui, tuttavia, stiamo cercando non un pacchetto software ma algoritmi che potremmo provare a implementare diciamo in Python .

Quindi, come mostrato di seguito, viene mappata una serie di linee (sono già tagliate, BTW).
Algoritmi / idee per generare poligoni (come quelli rossi mostrati) ?

inserisci qui la descrizione dell'immagine


Il limite del quadrato esterno è noto o deve essere letto anche dalle righe di input?
Devdatta Tengshe,

Risposte:


5

Bene, qui inseriamo una risposta che non è una risposta completa alla nostra domanda, ovvero la domanda rimarrà " aperta alla risposta ". È comunque una soluzione al problema nella domanda. Ecco il trucco che abbiamo usato:

Per prima cosa vediamo i risultati :
inserisci qui la descrizione dell'immagine

Quindi le linee indicate nei leftpoligoni costruiti mostrate in middle. Sono veri poligoni come mostrato in right;)

Per l'algoritmo indicato di seguito abbiamo usato il Shapelypacchetto in Python .

  • righe ==> MultiLineString {:: M}
  • aggiungi un minuscolo buffer, ad esempio eps{:: MB}
  • regione ==> Polygon {:: P} (la regione qui è un quadrato)
  • P.difference(MB) {poligoni risultanti}

Si noti che è silenziosamente veloce in funzione. Tuttavia, il punto mancante è che l'algoritmo non è un metodo originale per costruire il poligono dalle linee . Tuttavia ha funzionato perfettamente per il problema che avevamo in mano.


4

JTS Topology Suite ha una classe Polygonizer, che praticamente fa questo.

Puoi dare un'occhiata al codice sorgente, disponibile qui , e convertirlo in Python.


Come dice la descrizione del codice, non funzionerà come previsto dall'autore della domanda: "i bordi devono essere correttamente annuiti; cioè, devono solo incontrarsi ai loro punti finali. Il poligono funzionerà con input erroneamente citato ma non formerà poligoni da non bordi -noded"
Pablo

1
Esiste un'operazione all'interno di JTS per suddividere correttamente le linee ai vertici. Forse anche l'OP potrebbe esaminare questo.
Devdatta Tengshe,

3

Potresti dare un'occhiata al pacchetto Python Shapely, in particolare polygonize ()


Una breve nota che poligonizza in Shapely ( from shapely.ops import polygonize) usa GEOS.Polygonize da GEOS . Quindi questo è un collegamento in cui è presente un collegamento a un collegamento ...: |
Sviluppatore

Le nostre prove con polygonizenon hanno avuto successo. Tuttavia, grazie per averci ricordato Shapelycon quale soluzione potremmo trovare una soluzione (in realtà un trucco) pubblicata come risposta.
Sviluppatore

2

Ecco un'altra soluzione che potremmo trovare.

Usando DCELpossiamo fare blocchi da linee toccanti.

Per Python esiste un pacchetto {qui} . È una piccola implementazione con alcuni bug. Tuttavia, con un certo sforzo, può essere utilizzato per questo problema. Notare anche le seguenti fasi:

Una fase di pre-elaborazione con cui vengono rilevate tutte le intersezioni tra le linee. Quindi di conseguenza tutte le linee sono suddivise in segmenti nei punti di interazione. Un elenco di punti di intersezione e un elenco di spigoli associati sono quelli necessari per DCEL.


Poiché questo metodo è una soluzione originale e offre prestazioni molto migliori rispetto all'altro metodo in cui differenceviene utilizzata l'operazione.
Sviluppatore
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.