Generazione strada / fiume sulla griglia 2d


12

Questa è una domanda da principiante, ma eccola qui:

La mia mappa è una griglia 2d e voglio generare strade e fiumi. Il percorso dal punto iniziale a quello finale non deve essere il percorso ottimale in numero di tessere. Invece, dovrebbero avere un certo livello di casualità (turni).

Esiste un algoritmo standard per questo tipo di cose?

Saluti!

AGGIORNARE:

Questo è il risultato di giocare con i pesi sulla griglia e di applicare un algoritmo di percorso più breve (Bellman-Ford) usando la libreria jgrapht. Dopotutto sono andato con la risposta di Donutz.

http://pastebin.com/AGQGK5ik


Ci sono ostacoli sulla mappa?
MichaelHouse

Non ancora, il fiume sarà il primo ostacolo ad essere posizionato.
Markos Fragkakis,

Risposte:


18

È possibile generare il percorso ottimale utilizzando A *, quindi distorcerlo con lo spostamento del punto medio.

inserisci qui la descrizione dell'immagine

Ciò garantirà il raggiungimento degli endpoint e consentirà di controllare la casualità in larga misura. Ad esempio, non vorrei randomizzare le strade tanto quanto i fiumi. Qualunque intelligenza stia costruendo strade, in genere cerca di essere ottimale al riguardo.

Assicurati che se la tua mappa presenta degli ostacoli, controlla dopo ogni iterazione che non stai attraversando quegli ostacoli.

Un altro metodo sarebbe quello di generare rumore Perlin dopo aver trovato il percorso ottimale, quindi spostare i punti in base al rumore generato. Ad esempio, usando questo rumore:

inserisci qui la descrizione dell'immagine

Quindi mostra con il percorso ottimale in rosso e il percorso spostato in blu:

inserisci qui la descrizione dell'immagine

Notare come il percorso spostato si è "stabilizzato" nelle aree più scure del rumore. Allo stesso modo un fiume potrebbe fluire attraverso una valle.

Uno dei vantaggi della scelta del rumore Perlin è che puoi tener conto dei tuoi ostacoli ed evitarli come parte dell'algoritmo.


1
Come si fa a spostare questo punto basandosi sul rumore?
Khoi,

1
Dipende da come stai memorizzando il rumore e la linea generata. È possibile trovare prima il rumore più vicino / più basso perpendicolare alla linea al centro, quindi ai punti centrali tra il centro e le estremità e così via.
MichaelHouse

3

L'algoritmo A * ti permetterà anche di assegnare valori alle tessere indicandone l'idoneità. Ad esempio, puoi assegnare i punteggi di costo più basso alla terra bassa per i fiumi, alla terra piatta (ma non alla palude) per le strade e generare in base a ciò. Questo non ti dà il percorso più breve, ma ti dà il percorso più efficiente. Applica un po 'di casualità ai valori delle tue tessere e puoi ottenere alcuni percorsi non ottimali.


2

Che dire quando l'altezza è un fattore? Posso creare una mappa di altezza con l'algoritmo del diamante quadrato. Stavo pensando di aggiungere un po 'd'acqua a caso a ciascuna piastrella e poi di scorrere e spostare l'acqua su quote più basse fino a quando non fosse completamente stabile, ma ciò avrebbe rallentato e probabilmente avrebbe creato laghi, non fiumi.

Stavo anche pensando di guardare le normali per ogni tessera. Se 2 normali indicano l'una verso l'altra, quella deve essere una valle. L'acqua si accumulerebbe in una valle. Se puntano nella stessa direzione o distanti tra loro, l'acqua non si accumula. Questo sarebbe probabilmente più veloce del metodo di iterazione, ma potrebbe non creare laghi, ma solo fiumi. Dovrei giocarci attorno per evitare di trasformare ogni istanza di tessere puntate l'una verso l'altra in un fiume.


Ho letto uno dei documenti in cui è possibile aggiungere un peso a ciascuna piastrella, inoltre alcune tessere sono semplicemente impraticabili.
Joe Plante,
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.