Алгоритм алмазного квадрата - алгоритм, що генерує фрактальну місцевість (карта висоти). Ви можете знайти хороший опис, як це працює тут:
http://www.gameprogrammer.com/fractal.html (використовується як довідник.)
http://www.playfuljs.com/realistic-terrain-in-130-lines/ (Чудова реалізація JS, можливо, ви можете вкрасти його рендері. Погляньте тут, на що цей алгоритм здатний http: // demos. playfuljs.com/terrain/ .)
Загальна ідея полягає у тому, що у вас є 4 кути як насіння (а), і обчислюйте висоту центральної точки шляхом усереднення цих чотирьох кутів і додавання випадкової величини, наприклад, від -0,5 до 0,5 (b). Якщо застосувати це до сітки, ви знову отримаєте сітку з діамантами (квадрати в 45 °) і повторите те саме (c, d), але випадковий діапазон стає меншим, наприклад, від -0,125 до 0,125 і т.д.
Ваша програма повинна прийняти ряд входів:
- Ціле число,
l=1,2,3,...
яке визначає розмір квадратної сітки з бічною довжиною2^l+1
. Уl=10
вас доведеться зберігати близько мільйона номерів. - Чотири насіння (плаваюча точка) для кожного кута
- Параметр,
0<h<1
який визначає шорсткість (H
за посиланням), що означає, наскільки великим є випадковий діапазон спочатку - Параметри,
a,b
які представляють початкову нижню і верхню межі для випадкового діапазону і отримують множення наh
кожен етап уточнення. (Випадкове число рівномірно вибирається міжa
іb
.
Вихід повинен складатися з готової 2d сітки.
Тож приблизний алгоритм виглядатиме так:
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
Ви повинні пам’ятати про одну деталь: На межі сітки у вас буде лише три вершини діаманта , тож ви також повинні обчислити лише середнє значення цих трьох точок.
Візуалізація деяких прикладів (будь ласка, розкажіть, які використовувані вами параметри) не є обов'язковою, але цінується, і, звичайно, не додає до кількості байтів.
Тут можна знайти незначну варіаційну реалізацію цього алгоритму: Паралельний проектований генератор місцевості вокселів
Я створив невелику функцію малювання в javascript для відображення мапи висот у 2d як зображення в масштабах сірого. http://jsfiddle.net/flawr/oy9kxpsx/
Якщо хтось із вас захоплюється фантазією 3d і може скласти сценарій для перегляду карт у 3d, дайте мені знати! =)