Algorytm kwadratu diamentowego jest algorytmem generującym obszar fraktalny (mapa wysokości). Możesz znaleźć ładny opis, jak to działa:
http://www.gameprogrammer.com/fractal.html (Używany jako odniesienie.)
http://www.playfuljs.com/realistic-terrain-in-130-lines/ (Świetna implementacja JS, być może możesz chcieć ukraść jego renderer. Spójrz tutaj, do czego ten algorytm może http: // dema. playfuljs.com/terrain/ .)
Ogólna idea jest taka, że masz 4 rogi jako nasiona (a) i oblicz wysokość punktu środkowego, uśredniając te cztery rogi i dodając losową wartość, np. Od -0,5 do 0,5 (b). Jeśli zastosujesz to do siatki, ponownie otrzymujesz siatkę diamentów (kwadraty i 45 °) i powtarzasz to samo (c, d), ale zakres losowy zmniejsza się, np. -0,125 do 0,125 itd.
Twój program musi zaakceptować szereg danych wejściowych:
- Liczba całkowita
l=1,2,3,...
określająca rozmiar kwadratowej siatki o długości boku2^l+1
. Col=10
trzeba będzie przechowywać około miliona cyfr. - Cztery nasiona (zmiennoprzecinkowe) dla każdego rogu
- Parametr
0<h<1
określający chropowatość (H
w łączu), który oznacza początkowo zakres losowy - Parametry
a,b
reprezentujące początkowe dolne i górne granice dla zakresu losowego i mnożone przezh
na każdym etapie udoskonalania. (Liczba losowa jest jednolicie wybierana pomiędzya
ib
.
Wyjście musi składać się z gotowej siatki 2d.
Z grubsza algorytm wyglądałby tak:
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
Jest jeden szczegół, o którym powinieneś wiedzieć: na granicy siatki będziesz mieć tylko trzy wierzchołki diamentu , więc powinieneś także obliczyć tylko średnią z tych trzech punktów.
Wizualizacja niektórych przykładów (powiedz nam, jakich parametrów użyłeś) jest opcjonalna, ale doceniona i oczywiście nie dodaje się do liczby bajtów.
Nieco zróżnicowaną implementację tego algorytmu można znaleźć tutaj: Równolegle rzutowany generator terenu wokseli
Stworzyłem małą funkcję rysowania w javascript do wyświetlania map wysokości w 2D w obrazie w skali szarości. http://jsfiddle.net/flawr/oy9kxpsx/
Jeśli ktoś z was lubi fantazyjne 3D i może napisać skrypt do przeglądania map w 3D, dajcie znać! =)