Algoritma diamond square adalah algoritma yang menghasilkan fractal terrain (heightmap). Anda dapat menemukan deskripsi yang bagus tentang cara kerjanya di sini:
http://www.gameprogrammer.com/fractal.html (Digunakan sebagai referensi.)
http://www.playfuljs.com/realistic-terrain-in-130-lines/ (Implementasi JS yang hebat, mungkin Anda mungkin ingin mencuri renderernya. Lihatlah di sini apa yang mampu dilakukan algoritma ini dari http: // demo. playfuljs.com/terrain/ .)
Gagasan umum adalah bahwa Anda memiliki 4 sudut sebagai biji (a), dan menghitung ketinggian titik pusat dengan rata-rata keempat sudut dan menambahkan nilai acak misalnya antara -0,5 dan 0,5 (b). Jika Anda menerapkan ini ke grid Anda mendapatkan lagi grid berlian (kuadrat turend 45 °) dan Anda ulangi yang sama (c, d), tetapi rentang acak semakin kecil, misalnya -0,125 ke 0,125 dll.
Program Anda harus menerima sejumlah input:
- Bilangan bulat
l=1,2,3,...
yang menentukan ukuran kotak persegi dengan panjang sisi2^l+1
. Padal=10
Anda harus menyimpan sekitar satu juta nomor. - Empat biji (floating point) untuk setiap sudut
- Parameter
0<h<1
yang menentukan kekasaran (H
dalam tautan) yang berarti seberapa besar rentang acak awalnya - Parameter
a,b
yang mewakili batas bawah dan atas awal untuk rentang acak dan dikalikan denganh
di setiap langkah penyempurnaan. (Nomor acak dipilih secara seragam antaraa
danb
.
Output harus terdiri dari grid 2d yang sudah jadi.
Jadi algoritma kasar akan terlihat seperti ini:
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
Ada satu detail yang harus Anda perhatikan: Pada batas kisi, Anda hanya akan memiliki tiga simpul berlian , jadi Anda juga harus hanya menghitung rata-rata dari ketiga titik tersebut.
Visualisasi beberapa contoh (beri tahu kami parameter apa yang Anda gunakan) adalah opsional tetapi dihargai, dan tentu saja tidak menambah jumlah byte.
Implementasi yang sedikit bervariasi dari algoritma ini dapat ditemukan di sini: Generator medan voxel yang diproyeksikan paralel
Saya membuat fungsi menggambar kecil dalam javascript untuk memindahkan ketinggian peta dalam 2d sebagai gambar skala abu-abu. http://jsfiddle.net/flawr/oy9kxpsx/
Jika ada di antara Anda yang menyukai 3d mewah dan dapat membuat skrip untuk melihat peta dalam 3d beri tahu saya! =)