Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Генерирование случайного пятна


Автор: APXEOLOG 31.5.2011, 18:45
Доброго времени суток. Работаем над генератором карт для tile-based игры. Интересуют алгоритмы генерации пятен (озер) случайной формы. Собственно в общем случае интересует генерация многоугольников (причем они могут быть невыпуклыми и иметь нестандартные пропорции).

Автор: _Y_ 2.6.2011, 08:34
Если не очень быстрый алгоритм устроит, то я бы сделал так.

На первом этапе создаем пятно с некрасивыми краями.

1) Наносим случайным образом точку на карте. Это зародыш пятна.
2) Обходим пятно по периметру случайным образом добавляя точки.
3) Возврящаемся к п.2 случайное число раз.

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

Далее - сглаживаем края. Это можно сделать стандартным алгоритмом увеличения-уменьшения пятна. Сначала увеличиваем полученное пятно на N пикселей. Потом уменьшаем на то же число. Края при такой процедуре всегда сглаживаются. Чем больше N, тем глаже результат. Остнова в озере такие операции тоже убирают, если острова не очень большие. К сожалению я не помню названия этих операций увеличения-уменьшения. А http://forum.vingrad.ru/index.php?showtopic=314777&view=findpost&p=2246148 на работе. А на работу я попаду в лучшем случае на той неделе.

Автор: 1000000dollars 2.6.2011, 16:57
А натыкать рандомно точек и обойти по ним, исключая некоторые (слишком крутые изгибы) ? Не?

Автор: Nostr 8.6.2011, 12:55
Создается по N точкам правильный многоугольник, затем в нем выбирается пара вершин, которые соединяются прямой, отсекая фигуру. Если выбирать не слишком далекие друг от друга вершины - можно добиться нормальных результатов.
Ну естественно без сглаживания никак

Автор: pvl16 22.6.2011, 09:53
Посмотрите на тему активатор-ингибитор (Meinhardt-Gierer, Тьюринг).
Например: http://classes.yale.edu/fractals/panorama/Biology/Leopard/Leopard.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)