Estou tentando gerar um mapa estelar bidimensional bastante grande que mostra diferentes facções / estados, cada um possuindo um ou mais sistemas estelares. Eu gostaria de criar automaticamente bordas / áreas para as facções.
A idéia é basicamente partir de algo assim (os pontos representam sistemas estelares em um plano 2D, cores são afiliações de facções)
para isso
Gerar mapas como esse parece ser um requisito bastante comum, então minha pergunta real é a seguinte: Existem algoritmos padrão para gerar áreas de estado, como mostrado? Se sim, você poderia apontar para mim? Caso contrário, você pode pensar em um bom algoritmo (ideia básica ou pseudo-código estão corretos)?
O desempenho do algoritmo não é uma preocupação principal para mim, portanto, prefiro ter um mapa "mais bonito" do que um mais rápido para gerar. Essa pergunta semelhante oferece uma abordagem que provavelmente é aplicável ao meu problema, embora com algumas "prettificações" necessárias: Como criar um mapa a partir do gráfico
Deixe-me explicar o que quero dizer quando digo mais bonita: na parte inferior da pergunta vinculada, a pessoa que pergunta apresenta seu resultado final após implementar a resposta aceita. Minha primeira edição aqui: as áreas dos nós # 6, # 9 e # 12 são muito pequenas e de formato estranho. Além disso, em vez das bordas afiadas, eu preferiria uma aparência mais suave e curvada.
Minhas próprias idéias até agora, incluindo as respectivas desvantagens / perguntas que vejo com elas:
- Gere um polígono "casco convexo" para cada facção e depois expanda-o um pouco. Problemas: Sem recursos côncavos. Além disso, como você lida com sobreposições?
- Gere um gráfico de voronoi para os pontos e use as bordas do polígono de voronoi entre sistemas vizinhos de facções diferentes como bordas. Problema: polígonos grandes nas bordas do mapa - como identifico e corrijo esses?
- Gere um polígono de tamanho fixo para cada ponto, unindo todos os polígonos para uma única facção (resultando em um "polígono de facção" grande e potencialmente complexo). Em seguida, faça algo para reconciliar áreas sobrepostas entre duas facções. Problemas: Como eu faria exatamente isso? Não é exatamente um processo trivial. E se houver sobreposição entre mais de duas facções?
Sua ajuda é apreciada.
Adendo: Depois de pensar nas duas primeiras respostas e suas respectivas abordagens para resolver o problema, percebi que meus requisitos acima estão incompletos.
Devo acrescentar que o mapa pode ter áreas pouco povoadas, o que significa que pode haver uma estrela isolada ou um aglomerado de estrelas. Gostaria de exibir cada um desses clusters com sua própria área colorida contígua. Algo assim:
Percebo que isso pode exigir uma primeira etapa que identifique os clusters e, em seguida, execute o algoritmo real de cada um dos clusters.