Supongamos que tengo una malla 2D que consiste en triángulos que no se superponen , y un conjunto de puntos { p i } M i = 1 ⊂ ∪ N k = 1 T K . ¿Cuál es la mejor manera de determinar en qué triángulo se encuentra cada uno de los puntos?
Por ejemplo, en la siguiente imagen tenemos , p 2 ∈ T 4 , p 3 ∈ T 2 , por lo que me gustaría una función f que devuelva la lista f ( p 1 , p 2 , p 3 ) .
Matlab tiene la función de asignación de puntos que hace lo que quiero para las mallas Delaunay, pero falla para las mallas generales.
Mi primer pensamiento (tonto) es, para todos los nodos , recorrer todos los triángulos para descubrir en qué triángulo p i está. Sin embargo, esto es extremadamente ineficiente: es posible que tenga que recorrer cada triángulo para cada punto, por lo que podría tomar trabajo O ( N ⋅ M ) .
Mi siguiente pensamiento es, para todos los puntos , encontrar el nodo de malla más cercano a través de la búsqueda de vecino más cercano, luego mirar a través de triángulos unidos a ese nodo más cercano. En este caso, el trabajo sería O ( a ⋅ M ⋅ l o g , donde a es el número máximo de triángulos unidos a cualquier nodo en la malla. Hay un par de problemas solucionables pero molestos con este enfoque,
- Requiere implementar una búsqueda eficiente del vecino más cercano (o encontrar una biblioteca que lo tenga), lo que podría ser una tarea no trivial.
- Requiere almacenar una lista de los triángulos que están unidos a cada nodo, para lo cual mi código no está configurado actualmente; en este momento solo hay una lista de coordenadas de nodo y una lista de elementos.
En conjunto, parece poco elegante, y creo que debería haber una mejor manera. Este debe ser un problema que surge mucho, así que me preguntaba si alguien podría recomendar la mejor manera de abordar la búsqueda de los triángulos en los que se encuentran los nodos, ya sea teóricamente o en términos de bibliotecas disponibles.
¡Gracias!
No estoy convencido de que su solución sea realmente correcta. Considere la situación en la que tiene estos nodos:
Hay triángulos ABC y ACD. Ahora B es el punto más cercano al origen, pero el origen está en el triángulo ACD, que no contiene B.
Consideraría la opción de construir un quadtree que contenga los propios triángulos. Es decir, tiene un árbol cuaternario que se almacena en cada nodo (que corresponde a un cuadro delimitador):
fuente
CGAL maneja triangulaciones y ubicación de puntos (y mucho más). En particular, el módulo de triangulación 2D puede hacer lo que quiera.
fuente