Chiaramente è necessario generare il diagramma di Voronoi sui vincoli del poligono maggiore. Sebbene tu ti riferisca ad esso come un poligono, noto che il tuo diagramma di esempio ha bordi basati su spline. Dimentichiamo quello per ora.
Quello che vuoi fare è assicurarti di iniziare con il poligono contenente (sia generato da te che da un'altra fonte) con bordi di lunghezza abbastanza uguale; un fattore di varianza renderebbe questo aspetto più naturale. Probabilmente opterei per una varianza del 10-20%.
Ora che hai il poligono contenente delimitato da segmenti di segmenti di lunghezza approssimativamente uguale, hai una base da cui iniziare a generare il tuo diagramma di Voronoi.Per ogni spigolo sul tuo contenitore:
- Determina il bordo normale (la linea perp si protende verso l'interno dal centro di quel segmento).
- Utilizzare il bordo normale come scala mobile su cui posizionare un nuovo centro nodo Voronoi. La distanza dal bordo stesso sarebbe determinata da ciò che si desidera che il "diametro" della cella Voronoi medio sia, se fossero tutti presi come cerchi. Nel tuo esempio assomiglia a circa 30 pixel (o qualunque sia l'equivalente nelle unità del tuo mondo). Di nuovo, dovresti applicare un fattore di varianza a questo in modo che non tutti i centri cellulari siano posti equidistanti dal suo bordo sorgente.
- Genera la cella Voronoi per il tuo nuovo centro.
- Memorizza il punto di origine della cella Voronoi in un elenco.
Come si genera in modo incrementale ogni punto, è necessario iniziare a vedere che l'algoritmo suddivide ogni convessa "area costituente" del contenitore concavo in modo radiale.
Forse ti starai chiedendo a cosa serve l'elenco. Beh, ovviamente, non hai ancora finito, hai generato solo una frazione della tessellazione Voronoi che desideri. Una volta create queste celle "limite" del tuo spazio concavo, non vuoi che nuove celle vengano generate più vicino al confine di quanto lo siano già le celle di confine, le vuoi solo all'interno di quell'area. Mantenendo un elenco dei punti di origine della cella limite, è possibile verificare che qualsiasi altro punto creato sia all'interno dell'area nell'area. È un po 'come prendere una somma Minkowski interna per assicurarti di avere una zona cuscinetto. Ora puoi randomizzare il resto delle tue cellule in questo spazio concavo derivato, fino al completamento.
(Caveat emptor: Dovrai fare attenzione con questo passaggio precedente.Se le eventuali aree di "passaggio" sono troppo strette, i confini di questo spazio derivato si sovrappongono, avrai un poligono non semplice, e tu potresti trovarti a piazzare punti nei posti sbagliati nonostante i tuoi sforzi.La soluzione è quella di garantire che la distanza massima di posizionamento dai bordi non sia mai superiore alla metà della larghezza minima di passaggio ... o usi qualche altro mezzo geometrico, incluso Minkowski sommatoria come una possibilità, per assicurarti di non finire con un poligono derivato degenerato.È abbastanza probabile che finirai con un multipoligono, cioè frammenti.)
Non ho ancora applicato questo metodo, ma nonostante ci saranno sicuramente degli errori da risolvere, penso t L'idea generale ti farà iniziare nella giusta direzione.
fonte
2011-08-29 12:55:44
+1 Per la visualizzazione – Johan