Angenommen , ich habe eine 2D - Gitter , bestehend aus nicht - überlappende Dreiecken , und eine Menge von Punkten { P i } M i = 1 ⊂ ∪ N k = 1 T K . Wie lässt sich am besten bestimmen, in welchem Dreieck jeder der Punkte liegt?
In der folgenden Abbildung haben wir zum Beispiel , p 2 ≤ T 4 , p 3 ≤ T 2 , daher hätte ich gerne eine Funktion f , die die Liste f ( p 1 , p 2 , p 3 ) = zurückgibt [ 2 , 4 , 2 ] .
Matlab hat die Funktion pointlocation, die das tut, was ich für Delaunay-Netze will, aber es schlägt für allgemeine Netze fehl.
Mein erster (dummer) Gedanke ist, für alle Knoten alle Dreiecke zu durchlaufen, um herauszufinden, in welchem Dreieck p i sich befindet. Dies ist jedoch äußerst ineffizient - Sie müssen möglicherweise jedes Dreieck für jeden Punkt durchlaufen, also es könnte O ( N ⋅ M ) Arbeit erfordern .
- Es erfordert die Implementierung einer effizienten Suche nach dem nächsten Nachbarn (oder die Suche nach einer Bibliothek, in der diese vorhanden ist), was eine nicht triviale Aufgabe sein kann.
- Dazu muss eine Liste mit den an jeden Knoten angehängten Dreiecken gespeichert werden, für die mein Code derzeit nicht eingerichtet ist. Derzeit gibt es nur eine Liste mit Knotenkoordinaten und eine Liste mit Elementen.
Insgesamt scheint es unelegant, und ich denke, es sollte einen besseren Weg geben. Dies muss ein Problem sein, das häufig auftritt. Daher habe ich mich gefragt, ob jemand den besten Weg empfehlen kann, um herauszufinden, in welchen Dreiecken sich die Knoten befinden, entweder theoretisch oder in Bezug auf die verfügbaren Bibliotheken.
Vielen Dank!
Ich bin nicht überzeugt, dass Ihre Lösung tatsächlich richtig ist. Betrachten Sie die Situation, in der Sie diese Knoten haben:
Es gibt Dreiecke ABC und ACD. Jetzt ist B der nächstgelegene Punkt zum Ursprung, aber der Ursprung liegt im Dreieck ACD, das kein B enthält.
Ich würde die Möglichkeit in Betracht ziehen, einen Quadtree zu bauen , der die Dreiecke selbst enthält. Das heißt, Sie haben einen quaternären Baum, der in jedem Knoten (der einem Begrenzungsrahmen entspricht) gespeichert ist:
quelle
CGAL verarbeitet Triangulationen und Punktpositionen (und vieles mehr). Insbesondere das 2D-Triangulationsmodul kann tun, was Sie wollen.
quelle