Возьмем, к примеру, большую (шестнадцатеричная) шестнадцатеричную карту, как я могу разделить ее на N областей связанных гексов для моделирования стран?
Цель состоит в том, чтобы создать шестнадцатеричную карту, похожую на реальную карту со странами разных форм, но одинакового размера.
mathematics
maps
hexagonal-grid
MadCatPT
источник
источник
Один простой способ, которым вы можете попробовать.
n
гексы. Каждый начнет группу.Я не проверял, но это должно генерировать острова и избегать длинных тонких скобок. Кроме того, скорее всего, будут соседние границы, но не обязательно, что каждая будет соприкасаться с другой, эта плотность будет зависеть от значения
n
.Некоторые группы также могут быть загнаны в угол другими и могут достигать размера менее 20, вы можете обеспечить увеличенное пространство, порождая стартовые гексы на минимальном расстоянии друг от друга.
Проверьте и настройте по мере необходимости.
Кроме того, не связанные с этой проблемой, но очень, очень полезные для работы с гексами, посетите эту страницу: http://www.redblobgames.com/grids/hexagons/#basics.
Она объединяет всю гексагональную информацию в одном месте с хороший визуальный
источник
Я определенно думаю, что некоторый тип структуры графа сделал бы это возможным. По сути, создайте грань между двумя шестнадцатеричными узлами, если они находятся рядом друг с другом, чтобы имитировать всю карту. Однако я не уверен в точном алгоритме создания «страны» на этой карте. Дело в том, что в зависимости от того, как вы хотите, чтобы страна «выглядела», вам потребуются разные алгоритмы.
Вдобавок ко всему, я бы порекомендовал выбрать точку и отойти оттуда, выбрать случайную плитку в вашей «растущей стране» с соседней плиткой, которая не является частью страны.
Шаблон стратегии может быть использован для переключения алгоритмов в зависимости от того, какой тип страны вам нужен. http://en.wikipedia.org/wiki/Strategy_pattern т.е. хотите ли вы такую тонкую береговую линию, как Чили? Или вы хотите что-то более круглое и сдержанное?
Свойства графика также могут позволить вам настроить то, что вы хотите, чтобы конечная «страна» была похожа: http://en.wikipedia.org/wiki/Eccentricity_(graph_theory)
Хотите большую страну? Настройте свойства графика и заставьте сгенерированную страну (которая является просто графиком) иметь свойства, которые придадут ей «вид», который вы захотите.
И последнее, но не менее важное: графики также будут очень полезны для определения границ между странами. Вы можете построить график, который имеет связь между двумя узлами, если страны граничат друг с другом. Это может быть полезно для некоторых типов разделов в вашей игре и позволит вам оптимизировать некоторые вещи в процессе разработки.
источник
Небольшое примечание: вы говорите: «выглядит как карта реальной жизни со странами разных форм, но одинакового размера), но« реальные »страны сильно различаются по размеру даже в определенных регионах - даже« большие »страны Европы могут сильно различаться, например, Франция более чем в два раза больше Италии. С учетом вышесказанного, очевидно, есть игровые регионы, в которых можно попытаться сохранить размеры примерно одинаковыми - просто имейте в виду, что небольшая вариация здесь, вероятно, хорошая вещь!
Мой первоначальный подход к проблеме должен был бы «развивать» (а не «расти») ваши регионы:
Теперь сколько угодно, запустите следующий псевдокод:
Это будет поддерживать приблизительный баланс между размерами любых двух соседних стран, а проверка «отсоединения» (которая может быть выполнена с помощью простого алгоритма заполнения паводком) гарантирует, что ни одна страна никогда не распадется на части. Обновление списка границ - это операция с постоянным временем - измененный гекс, очевидно, всегда будет по-прежнему на границе, и вы можете просто проверить его шесть соседей, чтобы увидеть, стал ли какой-либо из них граничной ячейкой (потому что его сосед теперь находится в другой стране) или перестали быть пограничной ячейкой (потому что ее сосед находится сейчас в той же стране), изменяя набор границ по мере необходимости.
Чтобы уточнить этот подход, вы можете даже сделать условие, что гекс для изменения немного рандомизирован - вместо того, чтобы всегда «балансировать» две страны, вы всегда можете сделать своп с определенной вероятностью и даже постепенно уменьшить эту вероятность в течение время (аналогично процессу охлаждения в алгоритме имитации отжига ), чтобы заставить их быть примерно одинакового размера.
Обратите внимание, что это не гарантирует того, что все области имеют одинаковый размер (что невозможно, если N в любом случае не разделит размер сетки), и даже не гарантирует, что все страны находятся в одном гексе друг от друга по площади; тем не менее, он должен гарантировать (запустить для достаточного количества итераций), что каждая страна не более чем на один гекс больше или меньше, чем каждый из ее непосредственных соседей.
источник