Thuật toán hình vuông kim cương là thuật toán tạo địa hình fractal (heightmap). Bạn có thể tìm thấy một mô tả hay về cách thức hoạt động ở đây:
http://www.gameprogrammer.com/fractal.html (Được sử dụng làm tài liệu tham khảo.)
http://www.playfuljs.com/realistic-terrain-in-130-lines/ (Triển khai JS tuyệt vời, có lẽ bạn có thể muốn đánh cắp trình kết xuất của anh ấy. Hãy xem ở đây thuật toán này có khả năng http: // demos. playfuljs.com/terrain/ .)
Ý tưởng chung là bạn có 4 góc là hạt (a) và tính chiều cao của điểm trung tâm bằng cách lấy trung bình bốn góc đó và thêm một giá trị ngẫu nhiên, ví dụ từ -0,5 đến 0,5 (b). Nếu bạn áp dụng điều này cho lưới, bạn sẽ nhận được một lưới kim cương (hình vuông turend 45 °) và bạn lặp lại tương tự (c, d), nhưng phạm vi ngẫu nhiên sẽ nhỏ hơn, ví dụ -0.125 đến 0.125, v.v.
Chương trình của bạn phải chấp nhận một số đầu vào:
- Một số nguyên
l=1,2,3,...
xác định kích thước của lưới vuông với chiều dài cạnh2^l+1
. Tạil=10
bạn sẽ phải lưu trữ khoảng một triệu số. - Bốn hạt (điểm nổi) cho mỗi góc
- Một tham số
0<h<1
xác định độ nhám (H
trong liên kết) có nghĩa là phạm vi ngẫu nhiên ban đầu lớn như thế nào - Các tham số
a,b
đại diện cho giới hạn dưới và trên ban đầu cho phạm vi ngẫu nhiên và được nhân vớih
mỗi bước tinh chỉnh. (Số ngẫu nhiên được chọn thống nhất giữaa
vàb
.
Đầu ra phải bao gồm lưới 2d đã hoàn thành.
Vì vậy, thuật toán thô sẽ trông như thế này:
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
Có một chi tiết bạn cần lưu ý: Tại ranh giới của lưới, bạn sẽ chỉ có ba đỉnh của viên kim cương , vì vậy bạn cũng chỉ nên tính trung bình của ba điểm đó.
Một hình ảnh trực quan của một số ví dụ (vui lòng cho chúng tôi biết các tham số bạn đã sử dụng) là tùy chọn nhưng được đánh giá cao và tất nhiên không thêm vào số byte.
Một triển khai thay đổi nhỏ của thuật toán này có thể được tìm thấy ở đây: Trình tạo địa hình voxel được chiếu song song
Tôi đã tạo một hàm vẽ nhỏ trong javascript để thay thế các chiều cao trong 2d dưới dạng ảnh thang độ xám. http://jsfiddle.net/flawr/oy9kxpsx/
Nếu bất kỳ ai trong số bạn thích 3d và có thể tạo tập lệnh để xem bản đồ trong 3d hãy cho tôi biết! =)