Реалистичное «случайное» распределение часто выполняется с использованием Perlin Noise , которое можно использовать для получения распределения с «скоплениями», как вы упомянули.Он работает путем суммирования / объединения нескольких слоев линейно интерполированных значений из случайных точек данных.Каждый слой (или «октава») имеет в два раза больше точек данных, чем последний, и ограничен более узким диапазоном значений.В результате получается «реалистично» выглядящая случайная текстура.
Вот прекрасная демонстрация теории Perlin Noise от Hugo Elias.
Здесьэто первое, что я нашел в Perlin Noise в C # .
Что вы можете сделать, это сгенерировать изображение Perlin Noise и установить «порог», где все, что выше значения, «включено»и все под ним "выключено".То, что вы в итоге получите, это комки, где вещи выше порога, которые выглядят нерегулярно и потрясающе.Просто присвойте те, которые выше порогового значения, где вы хотите, чтобы ваша функция ландшафта была.
Здесь является демонстрацией , если программа генерирует битовую карту Perlin Noise и затем настраиваетпорог отсечки с течением времени.Явный "комок" виден.Это может быть именно то, что вы хотели.
Обратите внимание, что с высоким порогом, очень мало точек над ним, и это редко.Но когда порог понижается, эти точки «превращаются» в комки (по характеру перлин-шума), и некоторые из этих комков соединяются друг с другом и в основном создают нечто очень естественное и похожее на ландшафт.
Обратите внимание, чтоВы также можете установить «коэффициент сгущения» или тенденцию к слипанию функций, установив «турбулентность» функции Perlin Noise, которая в основном приводит к тому, что пики и впадины вашей функции PN акцентируются и сближаются.
Теперь, где установить порог?Чем выше пороговое значение, тем ниже процентное содержание объекта на конечной карте.Чем ниже порог, тем выше процент.Вы можете возиться с ними.Вы могли бы, вероятно, получить точные проценты, поигравшись с небольшой математикой (кажется, что распределение значений следует за Normal Distribution ; я могу ошибаться).Изменяйте его до тех пор, пока оно не станет правильным:)
EDIT Как указано в комментариях, вы можете найти точный процент, создав кумулятивную гистограмму (индекс того, какой% карты находится подпорог) и выберите порог, который дает вам процент, который вам нужен.
Самое классное здесь то, что вы можете создавать функции, которые объединяются вокруг некоторых других функций (например, ваши болотные функции) здесь тривиально - просто используйте тот жеPerlin Noise map дважды - второй раз, понизив порог.Первый будет комковатым, а второй - комковатым в тех же областях, но с увеличенными скоплениями (см. Флэш-анимацию, опубликованную ранее).
Что касается других функций, таких как живые изгороди, вы можете попробоватьмоделирование простых случайных блужданий линий, которые имеют более высокую склонность идти прямо, чем поворот, и размещать их в любом месте случайным образом на карте на основе Perlin.
samples
Вот образец плитки 50x50 Sparse Forest Map.Подлесок окрашен в коричневый цвет, а деревья окрашены в синий цвет (извините), чтобы было ясно, какой именно.
Редкий лес http://img688.imageshack.us/img688/7005/forestmap.png
Для этой карты я не сделал точных порогов длясоответствует 50%;Я только установил порог в 50% от максимума.По статистике, это будет в среднем ровно 50% каждый раз.Но это может быть недостаточно точным для ваших целей;см. предыдущую заметку о том, как это сделать.
Вот демонстрация ваших особенностей болота (не включая подлесок, для ясности) с мелким болотом серого цвета и глубоким болотом сзади:
Болота http://img202.imageshack.us/img202/5092/marshdemo.png
Это всего лишь 50x50, поэтому есть некоторые артефакты, но вы можете видеть, как легко вы можете заставить мелкое болото «расти» из глубокого болота - просто отрегулировав порог на той же карте Perlin.Для этого я намерил пороговый уровень, чтобы получить наиболее приятные для глаз результаты, но в своих собственных целях вы могли бы сделать то, что упоминалось ранее.
Вот карта болота, созданная из той же карты Perlin Noise, но вместо этого на растянутой более 250х250 плиточной карте:
Болота 250х250 http://img251.imageshack.us/img251/2867/marshdemo250.png