Увеличение вероятности того, что похожие плитки будут генерироваться рядом друг с другом

Я работаю над системой картографирования плитки, которая выглядит так (зеленый - трава, воздух белый, камень серый, а синий - вода):

Плитки

Он использует простой генератор случайных чисел, так что 45% вероятность того, что плитка станет травой, 30% вероятность того, что она будет водой, и вероятность 25% быть камнем.

В любом случае я могу увеличить склонность к тому, чтобы травянистые /каменные блоки собирались вместе, чтобы образовать массы суши, и сделать водяные блоки формой океанов (вроде того, что можно было увидеть в игре, такой как Minecraft)?

9 голосов | спросил airplaneman19 1 MaramThu, 01 Mar 2012 03:00:42 +04002012-03-01T03:00:42+04:0003 2012, 03:00:42

5 ответов


17

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

То, что вы хотите посмотреть, это фрактальные типы шума - в данном случае, perlin или симплексный шум. Если вы создаете шум, вы получите значения от -1 до 1.

http://en.wikipedia.org/wiki/Perlin_noise

Затем вы можете отрегулировать уровень воды, установив пороговое значение воды. Для других блоков вы можете запустить второй набор шумов для переключения между камнем и травой. (таким образом, вы можете иметь большие участки воды, но меньшие куски камня).

getTerrain(x,y) {
if(perlin_noise(x,y) > 0) {
    if(perlin_noise(x * scale,y * scale) > 0) {
        return rock
    } else {
        return dirt
    }
} else {
    return water
}

Как я считаю, метод сканирования и броска слишком сложный и не слишком надежно масштабируемый, я предлагаю другой метод, который мне понравился:

Положите сетку на карту, разбив карту на большие квадраты.

Создайте случайное число на каждом пересечении (между 0 и 1 будет работать для ваших процентов)

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

Промойте и повторите. Вы получите начальную случайность с первого прохода, но последние проходы принесут некоторую однородность. Извините за psuedo-random numbers:

0-------5  0---3---5 0-1-3-4-5 011233455
|       |  |   |   | | | | | | 012344555
|       |  |   |   | 0-2-4-6-5 002445665
|       |  |   |   | | | | | | 123445666
|       |  2---5---7 2-4-5-7-7 234455777
|       |  |   |   | | | | | | 233455688
|       |  |   |   | 2-3-5-5-9 223455589
|       |  |   |   | | | | | | 233455589
2-------9  2---4---9 2-4-4-5-9 234445579

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

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

ответил salmonmoose 1 MaramThu, 01 Mar 2012 03:17:26 +04002012-03-01T03:17:26+04:0003 2012, 03:17:26
3

Шум - одно хорошее решение, как уже упоминалось. Другой вариант - сделать второй проход на данных, чтобы подтолкнуть его к макету, который вы хотите. Gaussian Blur - один из многих способов добиться этого. Выполнение прохода с этим должно принести вам приятные «круглые» капли каждого типа.

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

ответил Jason Morales 1 MaramThu, 01 Mar 2012 04:45:32 +04002012-03-01T04:45:32+04:0004 2012, 04:45:32
2

Относительно простой способ сделать это - создать несколько ядер в случайных положениях. Нарисуйте диаграмму Вороного этих точек. Назначьте элемент каждой области результата.

Это приводит к чему-то довольно уродливому и механическому виду. Немного помассируйте границы, и вы будете в приличной форме.

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

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

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

ответил dhasenan 1 MaramThu, 01 Mar 2012 08:47:15 +04002012-03-01T08:47:15+04:0008 2012, 08:47:15
2

Генератор многоугольной карты быть хорошим чтением в создание карты с различными «зонами», которые также дадут вам более качественные карты. Он основан на диаграммах voronoi, но я думаю, это было бы хорошим началом.

ответил Vite Falcon 1 MarpmThu, 01 Mar 2012 23:53:37 +04002012-03-01T23:53:37+04:0011 2012, 23:53:37
0

вы можете сделать это, используя этот метод:

  • поместите все плитки в неуказанный список
  • , в то время как в неуказанном списке есть фрагмент
  • начать
  • выберите один фрагмент из этого списка
  • проверить соседей этой плитки и выбрать тип в зависимости от его соседей
  • удалить эту плитку из неуказанного списка
  • конец
ответил Ali1S232 1 MaramThu, 01 Mar 2012 03:19:04 +04002012-03-01T03:19:04+04:0003 2012, 03:19:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132