Выравнивание участков ландшафта (алгоритм ромбовидного квадрата)

Я программирую движок ландшафта, который использует фрагменты в стиле Minecraft. Фрагменты генерируются отдельно с использованием алгоритма Diamond-square.

Проблема в том, что эти куски не выстраиваются в линию, они совершенно разные. Я пробовал много вещей, чтобы заставить их делать это, но пока ничего не работало так, как должно.

Правка. Кроме того, мир, который я пытаюсь создать, не бесконечен; он генерирует массив фрагментов 33x33, каждый из которых имеет глобальное значение высоты, присвоенное другим генератором ромбовидного квадрата.

Есть ли (предпочтительно простой) способ изменить движок алмазного квадрата, чтобы выровнять куски?


person BK-TN    schedule 15.04.2012    source источник


Ответы (2)


Итак, вы генерируете каждый квадрат верхнего уровня алгоритма ромбовидного квадрата как отдельный фрагмент?

Вы должны разделить четыре угловые точки этого фрагмента с окружающими фрагментами.

Есть очень простой способ сделать это. Вам просто нужна функция шума с двумя параметрами (при условии, что вы создаете ландшафт в 2D) — функция, которая всегда возвращает одно и то же псевдослучайное число для одного и того же начального числа (которое остается постоянным для всей карты) и два параметра. Поэтому, если вы запросите у функции значение координаты [-100, 500], вы всегда получите одно и то же число (что гарантирует, что окружающие фрагменты выстроятся в линию).

Пример такой функции:

function Noise1(integer x, integer y)
    n = x + y * 57
    n = (n<<13) ^ n;
    return ( 1.0 - ( (n * (n * n * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);    
end function

Источник.

ИЗМЕНИТЬ:

Мое плохое - вы не должны полагаться на функцию параметризованного шума только для четырех угловых точек, вы должны использовать ее для всех случайных чисел, сгенерированных в алгоритме ромбовидного квадрата.

Если это не работает, вы делаете что-то не так со своей стороны.

person Matěj Zábský    schedule 16.04.2012
comment
Это не совсем работает - я обновил вопрос, добавив немного информации, которую забыл. - person BK-TN; 17.04.2012
comment
@ BK-TN Извините, я добавил небольшое пояснение к своему ответу. - person Matěj Zábský; 17.04.2012
comment
Я предполагаю, что ответ на самом деле использует шум перлина для кусков - я мог бы попробовать это, хотя я уже нашел более простой способ :) - person BK-TN; 18.04.2012

См. этот ответ: создание алгоритма фрактального алмазного квадрата бесконечным

Лучше всего было бы либо полностью отказаться от шума, либо использовать мой изящный алгоритм бесконечного алмаза в квадрате. И просто обрезать его, на ваш край. Если вы хотите назвать какой-то регион чанком, так тому и быть. Легко найти любую точку в таком-то и таком-то бесконечном поле.

Или мое объяснение и реализованный пример здесь: http://godsnotwheregodsnot.blogspot.com/2013/11/field-diamond-squared-fractal-terrain.html

person Tatarize    schedule 09.11.2013