Como faço para obter um diagrama de Voronoi dado o seu conjunto de pontos e sua triangulação de Delaunay?
-
01-07-2019 - |
Pergunta
Eu estou trabalhando em um jogo onde eu criar um mapa aleatório das províncias (a la Risco ou Diplomacia). Para criar esse mapa, estou primeira geração de uma série de pontos semi-aleatórios, em seguida, descobrir as triangulações de Delaunay desses pontos.
Com isso feito, agora estou olhando para criar um diagrama de Voronoi dos pontos para servir como um ponto de partida para as fronteiras província. Meus dados neste momento (sem trocadilhos) consiste da série original de pontos e uma coleção dos triângulos Delaunay.
Eu vi um número de maneiras de fazer isso na web, mas a maioria deles são amarrados com a forma como o Delaunay foi derivado. Eu adoraria encontrar algo que não precisa ser integrado ao Delaunay, mas pode trabalhar com base off os dados sozinho. Falhando isso, eu estou procurando algo compreensível para um novato geometria relativa, em oposição a velocidade ideal. Obrigado!
Solução
O diagrama de Voronoi é apenas o grafo dual da triangulação de Delaunay.
- Assim, as bordas do diagrama de Voronoi são ao longo das bissectrizes perpendiculares das bordas da triangulação Delaunay, assim calcular essas linhas.
- Em seguida, calcula-se os vértices do diagrama de Voronoi, encontrando as intersecções das orlas adjacentes.
- Finalmente, as bordas são então os subconjuntos das linhas que você calculados que se encontram entre os vértices correspondentes.
Note que o código exato depende da representação interna que você está usando para os dois diagramas.
Outras dicas
Se a velocidade ideal não é uma consideração, o seguinte código pseudo irá gerar um diagrama de Voronoi da maneira mais difícil:
for yloop = 0 to height-1
for xloop = 0 to width-1
// Generate maximal value
closest_distance = width * height
for point = 0 to number_of_points-1
// calls function to calc distance
point_distance = distance(point, xloop, yloop)
if point_distance < closest_distance
closest_point = point
end if
next
// place result in array of point types
points[xloop, yloop] = point
next
next
Supondo que você tenha uma classe 'ponto' ou estrutura, se você atribuir-lhes cores aleatórias, então você vai ver o padrão voronoi familiar quando você exibir a saída.
Depois de tentar usar esta discussão como uma fonte de respostas para a minha própria pergunta semelhante, descobri que o algoritmo de Fortune - provavelmente porque ele é o mais popular e, portanto, mais documentado -. Foi o mais fácil de entender
O artigo da Wikipedia sobre o algoritmo de Fortune mantém ligações frescas para o código-fonte em C, C # e Javascript. Todos eles eram de alto nível e veio com belos exemplos.
Eu tenho certeza de que 'triângulo' http: //www.cs .cmu.edu / ~ terremoto / triangle.html pode gerar o voronoi
Cada um dos seus triângulos Delaunay contém um único ponto do diagrama de Voronoi.
Você pode calcular este ponto por encontrar a intersecção dos três perpendicular bisectors para cada triângulo .
O seu diagrama de Voronoi vai ligar esse conjunto de pontos, cada uma com seu mais próximos três vizinhos. (Cada vizinho compartilha um lado do triângulo Delaunay)
Como você planeja abordar os casos de ponta?