Какой хороший способ генерировать случайные кластеры и пути?
Я играю с написанием генератора случайных карт и не совсем уверен, как случайным образом создавать реалистичные ландшафты. Я работаю с этими видами локальных карт, представляющих некоторые интересные проблемы.
Одним из простейших случаев является forest:
Sparse Medium Dense
Typical trees 50% 70% 80%
Massive trees — 10% 20%
Light undergrowth 50% 70% 50%
Heavy undergrowth — 20% 50%
Деревья и подлесок могут существовать в одном и том же пространстве, поэтому средний разреженный лес имеет 25% типичных деревьев и легкий подлесок, 25% типичных деревьев, 25% светлого подлеска и 25% открытого пространства. Средние и густые леса будут немного больше думать, но это не то место, где лежит моя проблема, так как все это равномерно рассеивается.
Моя проблема заключается в создании кластеров и путей, сохраняя процентные ограничения. Болота являются хорошим примером:
Moor Swamp
Shallow bog 20% 40%
Deep bog 5% 20%
Light undergrowth 30% 20%
Heavy undergrowth 10% 20%
Квадраты глубоких болот обычно группируются вместе и окружены нерегулярным кольцом мелких квадратов болота.
Также может присутствовать дополнительный элемент карты, изгороди, а также путь открытой земли, проносящийся через болото. Оба эти типа элементов карты (кластеры и пути) представляют проблемы, так как общий состав карты должен содержать X% элемента, но он не равномерно распределен. Другие элементы, такие как потоки, пруды и зыбучие станции, также нуждаются в генерации кластера или типа пути.
Какую технику я могу использовать для создания реалистичных карт с учетом этих ограничений?
Я использую С#, FYI (но это не вопрос С#).
Ответы
Ответ 1
Реалистичное "случайное" распределение часто выполняется с использованием Perlin Noise, который можно использовать для распространения с помощью "clumps", как вы упоминаете. Он работает путем суммирования/объединения нескольких слоев линейно интерполированных значений из случайных точек данных. Каждый слой (или "октава" ) имеет в два раза больше точек данных, чем последний, и ограничивается более узким диапазоном значений. Результатом является "реалистичная" выглядящая случайная текстура.
Вот красивая демонстрация теория, связанная с шумом Perlin от Hugo Elias.
Вот первое, что я нашел на Perlin Noise в С#.
Что вы можете сделать, это генерировать изображение шума Perlin и устанавливать "порог", где что-либо выше значения "on", а все под ним "выключено". То, что вы получите, - это комки, где вещи выше порога, которые выглядят нерегулярно и удивительно. Просто назначьте те, которые превышают порог, где вы хотите, чтобы ваша функция рельефа была.
Здесь - демонстрация, если программа генерирует растровое изображение Perlin Noise, а затем корректирует порог отсечки над время. Видно явное "сгущение". Это может быть именно то, что вы хотели.
Обратите внимание, что с высоким порогом очень мало очков находится над ним, и это редко. Но по мере того как порог понижается, эти точки "растут" в комки (по характеру перлинского шума), и некоторые из этих комков присоединяются друг к другу, и в основном создают что-то очень естественное и ландшафтное.
Обратите внимание, что вы также можете установить "коэффициент кластеризации" или склонность объектов к скоплению, установив "турбулентность" вашей функции шума Perlin, которая в основном приводит к усилению пиков и долин вашей функции PN вместе.
Теперь, где установить порог? Чем выше пороговое значение, тем ниже процентная доля функции на последней карте. Чем ниже порог, тем выше процент. Вы можете обходиться с ними. Вероятно, вы можете получить точные проценты, играя небольшую математику (кажется, что распределение значений следует за Normal Distribution, я могу ошибаться), Подстройте его, пока он не будет прав:)
РЕДАКТИРОВАТЬ Как указано в комментариях, вы можете найти точный процент, создав кумулятивную гистограмму (показатель того, что% карты находится под порогом) и выберите порог, который дает вам проценты, которые вам нужны.
Самое крутое в том, что вы можете создавать функции, которые объединяются вокруг некоторых других функций (например, ваших болотных функций) тривиально здесь - просто используйте одну карту Перлин Шум дважды - второй раз, опустив порог. Первый из них будет clumpy, а второй будет clumpy вокруг тех же самых областей, но с увеличенными clops (см. Флеш-анимацию, опубликованную ранее).
Как и для других функций, таких как изгородь, вы можете попробовать моделировать простые случайные блуждания, которые имеют более высокую тенденцию идти прямо, чем поворот, и место их в случайном порядке на вашей карте, основанной на perlin.
Образцы
Вот пример 50x50 плитки Sparse Forest Map. Подлесок окрашен в коричневый цвет, а деревья окрашены в синий цвет (извините), чтобы было ясно, что именно.
Редкий лес http://img688.imageshack.us/img688/7005/forestmap.png
Для этой карты я не делал точных порогов, чтобы соответствовать 50%; Я устанавливаю порог только на 50% от максимума. По статистике, это будет составлять ровно 50% каждый раз. Но это может быть недостаточно для ваших целей; см. предыдущую заметку о том, как это сделать.
Вот демонстрация ваших особенностей Марша (без ясности), с мелким болотом в сером и глубоком болоте сзади:
Болота http://img202.imageshack.us/img202/5092/marshdemo.png
Это всего лишь 50x50, поэтому из этого есть некоторые артефакты, но вы можете видеть, как легко вы можете сделать мелкое болото "расти" из глубокого болота - просто регулируя порог на той же карте Перлина. Для этого я посмотрел на пороговый уровень, чтобы дать самые приятные результаты, но для ваших собственных целей вы могли бы сделать то, что было упомянуто ранее.
Вот болотная карта, созданная на той же карте Перлина, но на растянутой карте размером 250x250 вместо этого:
Болота 250x250 http://img251.imageshack.us/img251/2867/marshdemo250.png
Ответ 2
Я никогда такого не делал, но вот некоторые мысли.
Вы можете получить кластеры путем смещения случайного выбора в местоположения на сетке, которые близки к существующим элементам этого типа. Назначьте значение по умолчанию 1 для всех квадратов. Для квадратов с существующими кластерными элементами добавьте значение кластеризации в смежные квадраты (чем выше значение кластеризации, тем сильнее будет кластеризация). Затем сделайте случайный выбор для следующего элемента этого типа в функции распределения вероятностей всех квадратов.
Для путей вы можете иметь аналогичную процедуру, за исключением того, что пути будут расширены поэтапно (вероятность того, что путь конечен на квадратах рядом с концом пути и нулевым везде). Направленные пути можно было бы сделать, увеличив вероятность выбора в направлении пути. Мейндеризующие пути могут иметь направление, которое изменяется в ходе случайного расширения (new_direction = mf * old_direction + (1-mf) * rand_direction, где mf - коэффициент импульса между 0 и 1).
Ответ 3
Чтобы развернуть комментарии academorobobot, вы можете начать с болота по умолчанию или лесного посева в некоторых ячейках сетки и позволить им расти из источника с использованием коррелированного случайного числа. Например, болото может иметь восемь соседних ячеек сетки, каждый из которых имеет вероятность 90% также быть болотом, но 10% вероятность быть чем-то другим. Вы можете позволить форме ecosytem из семени и отрегулировать корреляцию, пока не получите то, что выглядит правильно. Вероятно, довольно легко реализовать даже в электронной таблице.
Ответ 4
Вы можете начать читать ссылки здесь. Я помню, что смотрел гораздо лучший документ. Поставит его, если найду его (он также был основан на L-системах).
Но это на общей стороне; по конкретной проблеме, с которой вы сталкиваетесь, я думаю, вы должны ее моделировать с точки зрения
- проценты
- другие правила (кластеры и пути)
Дело в том, что, даже если вы не знаете, как построить карту с заданными свойствами, если вы можете оценить свойства (коэффициент кластеризации, удобство пути) и набросить на них, вы можете затем переборщить или сделать некоторые другое пространственное пространство задачи.
Если вы все еще хотите сделать генеративный подход, вам придется немного изучить порождающие правила; здесь идея, что я буду преследовать
- создавать шаблоны разных ландшафтов и покрытий местности, которые имеют требуемые свойства "clusterness", "pathness" или однородность.
- создавать шаблоны таким образом, чтобы значения для глубокого болота не были сдержанными, а задавали значение вероятности; после того, как шаблон был создан, вы можете нормализовать эту вероятность таким образом, чтобы она создавала необходимый процент покрытия.
- смешивать разные шаблоны вместе.
Ответ 5
Вероятно, для определенных типов областей может быть некоторый успех с шаблоном Voronoi. Я никогда не видел, чтобы он использовался для создания карт, но я видел, как он использовался в нескольких похожих областях.