Алмазный квадратный алгоритм - это алгоритм генерации фрактальной местности (карты высот). Вы можете найти хорошее описание того, как это работает здесь:
http://www.gameprogrammer.com/fractal.html (используется в качестве ссылки.)
http://www.playfuljs.com/realistic-terrain-in-130-lines/ (Отличная реализация JS, возможно, вы захотите украсть его средство визуализации. Посмотрите здесь, на что этот алгоритм способен http: // demos. playfuljs.com/terrain/ .)
Общая идея состоит в том, что у вас есть 4 угла в качестве начальных значений (a), и вы рассчитываете высоту центральной точки, усредняя эти четыре угла и добавляя случайное значение, например, между -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
.
Вывод должен состоять из готовой двумерной сетки.
Таким образом, грубый алгоритм будет выглядеть так:
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, дайте мне знать! =)