El algoritmo de diamante cuadrado es un algoritmo generador de terreno fractal (mapa de altura). Puede encontrar una buena descripción de cómo funciona aquí:
http://www.gameprogrammer.com/fractal.html (Usado como referencia).
http://www.playfuljs.com/realistic-terrain-in-130-lines/ (Gran implementación de JS, tal vez quieras robar su procesador. Mira aquí lo que este algoritmo es capaz de hacer en http: // demos. playfuljs.com/terrain/ .)
La idea general es que tiene 4 esquinas como semillas (a), y calcule la altura del punto central promediando esas cuatro esquinas y agregando un valor aleatorio, por ejemplo, entre -0.5 y 0.5 (b). Si aplica esto a la cuadrícula, obtiene nuevamente una cuadrícula de diamantes (cuadrados hasta 45 °) y repite lo mismo (c, d), pero el rango aleatorio se vuelve más pequeño, por ejemplo, -0.125 a 0.125, etc.
Su programa debe aceptar una cantidad de entradas:
- Un entero
l=1,2,3,...
que determina el tamaño de la cuadrícula cuadrada con la longitud del lado2^l+1
. Enl=10
tendrá que almacenar alrededor de un millón de números. - Cuatro semillas (punto flotante) para cada esquina
- Un parámetro
0<h<1
que determina la rugosidad (H
en el enlace) que significa qué tan grande es inicialmente el rango aleatorio - Parámetros
a,b
que representan los límites inferior y superior iniciales para el rango aleatorio y se multiplican porh
cada paso de refinamiento. (El número aleatorio se elige uniformemente entrea
yb
.
La salida debe consistir en la cuadrícula 2D terminada.
Entonces el algoritmo aproximado se vería así:
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
Hay un detalle que debe tener en cuenta: en el límite de la cuadrícula, solo tendrá tres vértices del diamante , por lo que también debe calcular el promedio de esos tres puntos.
La visualización de algunos ejemplos (por favor díganos qué parámetros utilizó) es opcional pero apreciada y, por supuesto, no se suma al recuento de bytes.
Aquí se puede encontrar una implementación ligeramente variada de este algoritmo: generador de terreno voxel proyectado en paralelo
Creé una pequeña función de dibujo en javascript para desplazar mapas de altura en 2d como imagen en escala de grises. http://jsfiddle.net/flawr/oy9kxpsx/
Si alguno de ustedes está en 3D sofisticado y puede hacer un script para ver mapas en 3D, ¡hágamelo saber! =)