O algoritmo do quadrado do diamante é um algoritmo de geração de terreno fractal (mapa de altura). Você pode encontrar uma boa descrição de como funciona aqui:
http://www.gameprogrammer.com/fractal.html (Usado como referência.)
http://www.playfuljs.com/realistic-terrain-in-130-lines/ (Ótima implementação de JS, talvez você queira roubar seu renderizador. Dê uma olhada aqui do que esse algoritmo é capaz de http: // demos. playfuljs.com/terrain/ .)
A idéia geral é que você tenha 4 cantos como sementes (a) e calcule a altura do ponto central calculando a média desses quatro cantos e adicionando um valor aleatório, por exemplo, entre -0,5 e 0,5 (b). Se você aplicar isso à grade, obtém novamente uma grade de diamantes (os quadrados dobram 45 °) e repete o mesmo (c, d), mas o intervalo aleatório fica menor, por exemplo, -0,125 a 0,125 etc.
Seu programa deve aceitar várias entradas:
- Um número inteiro
l=1,2,3,...
que determina o tamanho da grade quadrada com comprimento lateral2^l+1
. Eml=10
você terá que armazenar cerca de um milhão de números. - Quatro sementes (ponto flutuante) para cada canto
- Um parâmetro
0<h<1
que determina a rugosidade (H
no link) que significa o tamanho inicial do intervalo aleatório - Parâmetros
a,b
que representam os limites inferior e superior iniciais para o intervalo aleatório e são multiplicadosh
em cada etapa de refinamento. (O número aleatório é escolhido uniformemente entrea
eb
.
A saída deve consistir na 2d grade finalizada.
Portanto, o algoritmo aproximado seria assim:
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
Há um detalhe que você deve estar ciente: No limite da grade, você terá apenas três vértices do diamante ; portanto, você também deve calcular apenas a média desses três pontos.
Uma visualização de alguns exemplos (por favor, diga-nos quais parâmetros você usou) é opcional, mas apreciada e, é claro, não aumenta a contagem de bytes.
Uma pequena implementação variada desse algoritmo pode ser encontrada aqui: Gerador de terreno voxel projetado em paralelo
Criei uma pequena função de desenho em javascript para exibir mapas de altura em 2D como imagem em escala de cinza. http://jsfiddle.net/flawr/oy9kxpsx/
Se alguém de vocês gosta de 3d e pode fazer um script para visualizar mapas em 3d, avise-me! =)