L'algoritmo del diamante quadrato è un algoritmo di generazione del terreno frattale (heightmap). Puoi trovare una bella descrizione di come funziona qui:
http://www.gameprogrammer.com/fractal.html (utilizzato come riferimento.)
http://www.playfuljs.com/realistic-terrain-in-130-lines/ (Grande implementazione di JS, forse potresti voler rubare il suo renderer. Dai un'occhiata qui di cosa è capace questo algoritmo di http: // demos. playfuljs.com/terrain/ .)
L'idea generale è che hai 4 angoli come semi (a) e calcoli l'altezza del punto centrale facendo la media di quei quattro angoli e aggiungendo un valore casuale, ad esempio tra -0,5 e 0,5 (b). Se lo applichi alla griglia ottieni di nuovo una griglia di diamanti (quadrati turend 45 °) e ripeti lo stesso (c, d), ma l'intervallo casuale si riduce, ad esempio da -0,125 a 0,125 ecc.
Il tuo programma deve accettare un numero di input:
- Un numero intero
l=1,2,3,...
che determina la dimensione della griglia quadrata con la lunghezza laterale2^l+1
. Dovrail=10
archiviare circa un milione di numeri. - Quattro semi (virgola mobile) per ogni angolo
- Un parametro
0<h<1
che determina la rugosità (H
nel collegamento) che indica quanto è grande l'intervallo casuale inizialmente - Parametri
a,b
che rappresentano i limiti iniziale inferiore e superiore per l'intervallo casuale e vengono moltiplicati perh
ogni fase di perfezionamento. (Il numero casuale viene scelto in modo uniforme traa
eb
.
L'output deve essere costituito dalla griglia 2d finita.
Quindi l'algoritmo approssimativo sarebbe simile al seguente:
Create a square grid with sidelength 2^l+1
Place seed values in the corners
Repeat:
| Perform square steps
| Refine Range: a = a*h; b=b*h;
| Perform diamond steps
| Refine Range
C'è un dettaglio di cui dovresti essere a conoscenza: al limite della griglia, avrai solo tre vertici del diamante , quindi dovresti anche calcolare solo la media di quei tre punti.
Una visualizzazione di alcuni esempi (per favore dicci quali parametri hai usato) è facoltativa ma apprezzata, e ovviamente non si aggiunge al conteggio dei byte.
Una leggera implementazione variegata di questo algoritmo può essere trovata qui: generatore di terreno voxel proiettato in parallelo
Ho creato una piccola funzione di disegno in JavaScript per eliminare le mappe di altezza in 2d come immagine in scala di grigi. http://jsfiddle.net/flawr/oy9kxpsx/
Se qualcuno di voi è appassionato di 3d e può creare uno script per visualizzare le mappe in 3d, fammi sapere! =)