Я пытаюсь создать довольно большую двумерную звездную карту, которая показывает разные фракции / состояния, каждая из которых владеет одной или несколькими звездными системами. Я хотел бы автоматически создавать границы / области для фракций.
Идея состоит в том, чтобы по существу перейти от чего-то подобного (точки представляют звездные системы на 2-й плоскости, цвета - принадлежность фракций)
к этому
Создание таких карт кажется довольно распространенным требованием, поэтому мой реальный вопрос таков: существуют ли стандартные алгоритмы для генерации областей состояния, как показано? Если да, не могли бы вы указать мне их? Если нет, можете ли вы придумать хороший алгоритм (базовая идея или псевдокод в порядке)?
Производительность алгоритма не имеет для меня первостепенного значения, поэтому я предпочел бы иметь более «красивую» карту, чем более быструю для генерации. Этот похожий вопрос предлагает подход, который, вероятно, применим к моей проблеме, хотя и с некоторыми «предварительными требованиями»: как создать карту из графика
Позвольте мне объяснить, что я имею в виду, когда говорю красивее: в нижней части связанного вопроса спрашивающий представляет свой конечный результат после реализации принятого ответа. Моя первая проблема здесь: области для узлов № 6, № 9 и № 12 очень маленькие и странной формы. Кроме того, вместо острых краев я бы предпочел более плавный изогнутый вид.
Мои собственные идеи, в том числе соответствующие недостатки / вопросы, которые я вижу с ними:
- Создайте многоугольник с выпуклой оболочкой для каждой фракции, затем немного увеличьте его наружу. Проблемы: нет вогнутых функций. Кроме того, как вы справляетесь с перекрытиями?
- Создайте вороной график для точек, затем используйте ребра полигона вороного между соседними системами различных фракций в качестве границ. Проблема: Большие полигоны по краям карты - как их идентифицировать и исправить?
- Создайте многоугольник фиксированного размера для каждой точки, объедините все многоугольники для одной фракции (в результате получается один большой, потенциально сложный «полигон фракции»). Затем сделайте что-нибудь, чтобы согласовать перекрывающиеся области между двумя фракциями. Проблемы: как бы я это сделал? Не совсем тривиальный процесс. Что если есть совпадение между более чем двумя фракциями?
Ваша помощь приветствуется.
Приложение: Подумав о первых двух ответах и их подходах к решению проблемы, я понял, что мои требования выше не выполнены.
Я должен добавить, что на карте могут быть малонаселенные районы, что означает, что там может быть изолированная звезда или скопление звезд. Я хотел бы отобразить каждый из этих кластеров с их собственной смежной цветной областью. Что-то вроде этого:
Я понимаю, что для этого может потребоваться первый шаг, который идентифицирует кластеры, а затем запустить фактический алгоритм для каждого из кластеров.