Supposons que j'ai un maillage 2D constitué de triangles non chevauchants , et un ensemble de points { p i } M i = 1 ⊂ ∪ N k = 1 T K . Quelle est la meilleure façon de déterminer dans quel triangle chacun des points se trouve?
Par exemple, dans l'image suivante, nous avons , p 2 ∈ T 4 , p 3 ∈ T 2 , donc je voudrais une fonction f qui retourne la liste f ( p 1 , p 2 , p 3 ) = [ 2 , 4 , 2 ] .
Matlab a la fonction pointlocation qui fait ce que je veux pour les maillages Delaunay, mais elle échoue pour les maillages généraux.
Ma première pensée (stupide) est que, pour tous les nœuds , parcourez tous les triangles pour savoir dans quel triangle p i se trouve. Cependant, cela est extrêmement inefficace - vous pourriez avoir à parcourir chaque triangle pour chaque point, donc cela pourrait prendre du travail O ( N ⋅ M ) .
Ma prochaine pensée est, pour tous les points , de trouver le nœud de maillage le plus proche via la recherche du plus proche voisin, puis de regarder à travers les triangles attachés au nœud le plus proche. Dans ce cas, le travail serait O ( a ⋅ M ⋅ l o g ( N ) ) , où a est le nombre maximal de triangles attachés à n'importe quel nœud du maillage. Il y a quelques problèmes résolubles mais ennuyeux avec cette approche,
- Cela nécessite la mise en œuvre d'une recherche efficace du plus proche voisin (ou la recherche d'une bibliothèque qui en dispose), ce qui pourrait être une tâche non triviale.
- Cela nécessite de stocker une liste des triangles attachés à chaque nœud, pour lequel mon code n'est actuellement pas configuré - pour le moment, il n'y a qu'une liste de coordonnées de nœud et une liste d'éléments.
Dans l'ensemble, cela semble inélégant, et je pense qu'il devrait y avoir une meilleure façon. Cela doit être un problème qui se pose souvent, donc je me demandais si quelqu'un pouvait recommander la meilleure façon d'aborder la recherche des triangles dans lesquels se trouvent les nœuds, théoriquement ou en termes de bibliothèques disponibles.
Merci!