Suponhamos que tem uma malha que consiste em 2D triângulos não sobrepostos , e um conjunto de pontos { p i } M i = 1 ⊂ ∪ N k = 1 T K . Qual é a melhor maneira de determinar em qual triângulo cada um dos pontos se encontra?
Por exemplo, na imagem a seguir, temos , p 2 ∈ T 4 , , então eu gostaria de uma função que retorne a lista . f f ( p 1 , p 2 , p 3 ) = [ 2 , 4 , 2 ]
O Matlab tem a função de localização de pontos que faz o que eu quero para malhas de Delaunay, mas falha em malhas gerais.
Meu primeiro pensamento (burro) é que, para todos os nós , percorra todos os triângulos para descobrir qual triângulo está. No entanto, isso é extremamente ineficiente - você pode precisar percorrer todos os triângulos para cada ponto, para que possa faça o trabalho de .p i O ( N ⋅ M )
Meu próximo pensamento é, para todos os pontos , encontre o nó de malha mais próximo por meio da pesquisa do vizinho mais próximo e, em seguida, observe os triângulos anexados ao nó mais próximo. Nesse caso, o trabalho seria , onde é o número máximo de triângulos anexados a qualquer nó na malha. Existem alguns problemas solucionáveis, mas irritantes, com essa abordagem, ó ( um ⋅ H ⋅ l ó g ( N ) ) um
- Requer implementar uma pesquisa eficiente do vizinho mais próximo (ou encontrar uma biblioteca que a possua), o que pode ser uma tarefa não trivial.
- Requer o armazenamento de uma lista de quais triângulos estão anexados a cada nó, para os quais meu código não está configurado atualmente - agora há apenas uma lista de coordenadas do nó e uma lista de elementos.
No geral, parece deselegante, e acho que deveria haver uma maneira melhor. Esse deve ser um problema que surge muito, então eu queria saber se alguém poderia recomendar a melhor maneira de abordar a localização dos triângulos nos nós, teoricamente ou em termos de bibliotecas disponíveis.
Obrigado!
Não estou convencido de que sua solução esteja correta. Considere a situação em que você possui esses nós:
Existem triângulos ABC e ACD. Agora B é o ponto mais próximo da origem, mas a origem está no triângulo ACD, que não contém B.
Eu consideraria a opção de construir um quadtree que contenha os triângulos. Ou seja, você tem uma árvore quaternária que armazena em cada nó (que corresponde a uma caixa delimitadora):
fonte
A CGAL lida com triangulações e localização de pontos (e muito mais). Em particular, o módulo de triangulação 2D pode fazer o que você deseja.
fonte