Algoritmo per assegnare i bordi ai poligoni più piccoli possibili?

4

Sto progettando un generatore di città procedurale e il primo passo del processo di generazione è la creazione di strade cittadine. Queste strade si estendono in linea retta fino a un punto, quindi possono diramarsi, ruotare o continuare nella stessa direzione. Se una strada colpisce un'altra strada, può smettere di crescere o attaccarsi allo svincolo più vicino.

Ho pensato ai raccordi come ai vertici e alle strade come bordi. Da questo, dovrei essere in grado di suddividere la rete in una raccolta dei più piccoli poligoni possibili, ad esempio uno spazio racchiuso da tutte le parti lungo le strade.

Finché una strada ha 2 svincoli su entrambi i lati, mi piacerebbe averlo come margine di un poligono. Rimuovo le strade che sono "vicoli ciechi" (i vertici che hanno solo un lato che li attacca) dalla considerazione prima dell'elaborazione, quindi non rappresentano un problema.

Quindi, dato un insieme di vertici e spigoli, qual è un buon modo per scomporli nei poligoni più piccoli possibili? Non importa se il poligono è convesso o concavo, poiché dovrebbe essere usato principalmente come un modo per caricare in bit della città e contrassegnare un'area come caricata o scaricata e scegliere selettivamente i bit della città per la simulazione. È anche importante che io sia in grado di creare nuove aree in fase di esecuzione per consentire una mappa semi-infinita.

Dovrai perdonare la mia immagine frettolosamente gettata insieme, ma diciamo che ho una rete che assomiglia a questa:

Mipiacerebbechel'outputproducessequalcosadelgenere:

Ho provato a realizzare questo da solo, ma ho avuto alcuni problemi (principalmente quando si trattava di determinare se un edge sarebbe stato "condiviso" da 2 poligoni - nel mio esempio precedente, il bordo F è condiviso da AEF e FGMOL, mentre A solo appartiene ad AEF).

Poiché questo sembra un problema che sarebbe comune nel settore della grafica, ho pensato che ci sarebbe stato un algoritmo facilmente accessibile per questo. Ho esaminato l'algoritmo della catena monotono di Andrew , ma sembra che faccia l'opposto (restituendo il PIÙ GRANDE poligono da un insieme di punti).

È del tutto possibile che io stia guardando questo in modo completamente sbagliato, quindi qualsiasi aiuto sarebbe apprezzato. Le mie scuse se ho postato questo nella sezione sbagliata - Ho provato a postare questa domanda a StackOverflow, e mi hanno reindirizzato qui.

Grazie!

    
posta Jay2645 21.01.2015 - 03:24
fonte

1 risposta

4

Vedi qui per un algoritmo. Considerare ciascun bordo non orientato come effettivamente due bordi, uno in ciascuna direzione. Fondamentalmente, se ordinate i bordi attorno ad ogni vertice per angolo, ciò vi permetterà di camminare attorno ad ogni faccia in senso orario e di tagliare ogni lato mentre lo camminate. Poi prendi e spunta quello che non è stato cancellato e cammina iniziando con esso.

Tuttavia, dato che sei tu a generare il grafico, potrebbe essere più semplice generare i volti in primo luogo. Quando arrivi a un vertice sul bordo di una mappa, gira a sinistra e segui il bordo esterno tenendo la prima a destra. Quindi spostati a destra e continua a girare in senso orario fino a tornare al vertice originale, facendo attenzione a non creare un ciclo che non include il vertice originale. Quindi forse dividi il viso una o due volte.

    
risposta data 21.01.2015 - 05:26
fonte

Leggi altre domande sui tag