Elmas kare algoritması bir fraktal arazi (yükseklik haritası) üreten algoritmadır. Burada nasıl çalıştığını gösteren güzel bir açıklama bulabilirsiniz:
http://www.gameprogrammer.com/fractal.html (Referans olarak kullanılır.)
http://www.playfuljs.com/realistic-terrain-in-130-lines/ (Büyük JS uygulaması, belki de oluşturucusunu çalmak isteyebilirsiniz. Bu algoritmanın http: // demolar için neler yapabileceğini bir göz atın . playfuljs.com/terrain/ .)
Genel fikir, tohumlar (a) olarak 4 köşeye sahip olmanız ve bu dört köşeyi ortalayarak ve rastgele bir değer ekleyerek (-0.5 ile 0.5 (b) arasında) merkez noktasının yüksekliğini hesaplamanızdır. Bunu ızgaraya uygularsanız tekrar bir elmas ızgarası alırsınız (kareler 45 ° kareler) ve aynı şeyi tekrarlarsınız (c, d), ancak rastgele aralık küçülür, örneğin -0.125 ila 0.125 vb.
Programınız bir dizi girişi kabul etmelidir:
l=1,2,3,...
Kenar uzunluğu olan kare ızgara boyutunu belirleyen bir tam sayı2^l+1
. Atl=10
yaklaşık bir milyon sayı depolamak zorunda kalacak.- Her köşe için dört tohum (kayan nokta)
0<h<1
Pürüzlülüğü (H
bağlantıda) belirleyen ve rastgele aralığın başlangıçta ne kadar büyük olduğu anlamına gelen bir parametrea,b
Rastgele aralık için başlangıç alt ve üst sınırlarını temsil eden veh
her ayrıntılandırma adımında çarpılan parametreler . (Rastgele sayıa
ve arasında eşit olarak seçilirb
.
Çıktı bitmiş 2d ızgarasından oluşmalıdır.
Kaba algoritma şöyle görünecektir:
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
Dikkat etmeniz gereken bir ayrıntı var: Izgara sınırında, elmasın sadece üç köşesi olacak , bu yüzden sadece bu üç noktanın ortalamasını hesaplamanız gerekir.
Bazı örneklerin görselleştirilmesi (lütfen bize hangi parametreleri kullandığınızı söyleyin) isteğe bağlıdır ancak takdir edilir ve elbette bayt sayısına eklenmez.
Bu algoritmanın biraz farklı bir uygulaması burada bulunabilir: Paralel izdüşümlü voksel arazi jeneratörü
Javascript'te 2d'de yükseklik haritalarını gri tonlamalı görüntü olarak dağıtmak için küçük bir çizim işlevi oluşturdum. http://jsfiddle.net/flawr/oy9kxpsx/
Eğer herhangi biri süslü 3d içine ve 3d haritaları görüntülemek için bir komut dosyası yapabilirsiniz bana bildirin! =)