Генерация случайных бассейнов или озер

9

Я реализовал функции, которые могут рисовать любую многоугольную форму, однако я не смог создать гладкую форму, которая имитирует закругленные края озера. Я попытался сгенерировать два круга и соединить края, но недостаточно вариаций или гладкости. Есть ли у кого-нибудь указатели или идеи, которые могли бы создать такую ​​форму?

Manderin87
источник
Я изучал кривые Безье, кажется, что я мог бы создать озеро из этого. У кого-нибудь есть опыт работы с ними на 2d массиве?
Manderin87

Ответы:

8

Alwynd упомянул шум Перлина. Вот как я сгенерировал формы островков для генератора полигональных карт:

  1. Генерировать перлин-шум.
  2. Для каждого местоположения (x, y)в битовой карте шума, вычислить расстояние от центра, нормированы так , что растровое изображение 2х2: (dx, dy) = (2 * x / width - 1, 2 * y / height - 1); d = sqrt(dx*dx + dy*dy).
  3. Расположение (x, y)является частью острова, если noise[x, y] > 0.3 + 0.4*d*d. Этот шаг пытается сделать форму округлой, обрезая области, которые находятся далеко от центра.

Острова немного более рваные, чем озера, поэтому я не уверен, что эти формы будут вам по вкусу. Я установил демонстрацию вышеупомянутого алгоритма с кнопками внизу для управления двумя магическими числами. Могут быть разные значения магических чисел 0,3 и 0,4, которые создают нужные вам формы.

amitp
источник
2
Твоя работа - главное вдохновение, Амит. + 10 тысяч, если смогу, за те 5 лет или около того удивления и удовольствия, которые я получил от чтения вашего блога.
Инженер
4

Вы можете использовать алгоритм Perlin Noise для генерации озер, если вы используете вид сверху вниз (форма многоугольника, похоже на вас), этот парень из Стэнфорда сделал именно это.

http://www-cs-students.stanford.edu/~amitp/game-programming/polygon-map-generation/

alwynd
источник
1
«Этот парень из Стэнфорда» также является пользователем этого сайта, к вашему сведению.
Инженер
а кто нет? =) Я мог бы начать с некоторого шума (перлин, фрактал), но размыть результаты для получения менее "неровных" результатов. Отличная статья, кстати - очень нравится, как он делает реки.
Яри ​​Комппа
0

Одним из способов было бы начать с базового многоугольника, может быть, ваш подход с двумя кругами.

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

Джордж Дакетт
источник