Создание простых городских улиц

1

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

Простым я имею в виду что-то вроде этого: Изображение 174551

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

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

Любые ссылки на ресурсы, теорию или образец кода будут высоко оценены!

PS Это может быть на любом языке. Мне просто нужно знать концепцию этого.

Теги:
random
terrain

2 ответа

1
Лучший ответ

При создании ландшафта, например горных хребтов, часто используются фрактальные структуры, поэтому, возможно, подобная идея может быть использована здесь. Сделайте поиск Google для "фрактальной генерации ландшафта", чтобы узнать больше. В случае создания уличного макета вы можете попробовать следующий алгоритм (это просто с головы до ног, так что никаких гарантий, что это будет действительно хорошо выглядеть):

  • Начните с прямоугольной области.
  • Поместите небольшое, случайное число улиц, проходящих от одного края к другому в случайных местах. Случайность обеспечивает изменение макета. Пример этой единственной итерации может выглядеть как пример, который вы даете в вопросе, но проще, я бы предположил, что 1-4 строки будут разумными.
  • Улицы, которые вы только что создали, разделяют вашу площадь на прямоугольные блоки. Применяйте один и тот же алгоритм разделения рекурсивно к каждому блоку, конечно, каждый раз выбирая разные случайные числа.
  • После 3 или 4 итераций вы должны иметь достаточно сложную уличную сеть. Вы можете сделать улицы, созданные в последующих итерациях, несколько более узкими, так что у вас есть несколько главных улиц в городе, некоторые более крупные улицы и множество небольших улиц.
1

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

В деталях я бы сделал 2d-массив. Поместите первый случайный блок, например, в один угол и установите для всех полей, охватываемых блоком, идентификатор для не-уличной плитки. Окружайте весь блок уличной плиткой. И повторить процесс со следующим блоком, поставив его рядом с уличными плитками из первого блока. Делайте это до тех пор, пока все поля в массиве не будут либо уличными, либо уличными.

  • 0
    Это звучит как интересное решение, которое должно работать .. Я попробую, спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню