Создание макета города в сетке


9

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

  • 2x2 дома
  • Дороги шириной 1 единица
  • Каналы шириной 1 единица

Пример макета:

Образец макета

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

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

Ответы:


8

Есть много способов пойти в зависимости от того, как именно вы этого хотите. Вот примерный план того, как, по-моему, подойдет ваше описание:

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.