Überprüfen ob Punkt innerhalb eines Dreiecks liegt?
Ich versuche gerade einen Algorithmus zu schreiben, der Polygone simplifizieren kann oder auch höher auflösen. Dafür habe ich ein Polygon, das trianguliert ist.
Wenn ich jetzt einen Punkt innerhalb des Polygons hinzufüge, wie kann ich dann überprüfen, in welchem Dreieck sich der Punkt befindet? Ein Algorithmus dafür habe ich hier gefunden: https://www.geeksforgeeks.org/check-whether-a-given-point-lies-inside-a-triangle-or-not/
Meine Frage jetzt: Wenn das Polygon mehrere Dreiecke hat, muss ich dann für jedes Dreieck überprüfen, ob der Punkt darin liegt, oder gibt es auch eine schnellere Methode bei der ich nicht für jedes Dreieck prüfen muss, ob darin der Punkt liegt.
1 Antwort
![](https://images.gutefrage.net/media/default/user/11_nmmslarge.png?v=1551279448000)
Wenn das Polygon bereits trianguliert ist und du den Algorithmus, den du gefunden hast, verwendest, um zu überprüfen, ob der Punkt innerhalb eines Dreiecks liegt, müsstest du leider für jedes Dreieck in der Triangulation überprüfen, ob der Punkt darin liegt. Dies kann zeitaufwendig sein, insbesondere wenn die Anzahl der Dreiecke groß ist.
Ein möglicher Ansatz zur Optimierung wäre die Verwendung eines räumlichen Index, beispielsweise eines quadtree- oder kD-Baums. Bei diesem Ansatz wird ein Baum aufgebaut, der die Positionen der Dreiecke in Bezug auf ihre Bounding-Boxes (also das kleinste Rechteck, das ein Dreieck vollständig umschließt) speichert. Wenn man dann nach einem Punkt sucht, kann man schnell die Teile des Baums ausschließen, die außerhalb der Bounding-Box des Punkts liegen, wodurch die Anzahl der zu überprüfenden Dreiecke erheblich reduziert wird.
Die Berechnung der Bounding-Box eines Dreiecks ist recht einfach, sie besteht einfach aus dem minimalen und maximalen X- und Y-Wert der Dreieckspunkte. Die Suche in einem quadtree oder kD-Baum ist ebenfalls recht schnell, da sie auf einer binären Suche basiert.
Es gibt viele Bibliotheken, die räumliche Indexierung unterstützen, einschließlich einiger in den gängigen Programmiersprachen wie Python (z.B. RTree oder PyKDTree), Java (z.B. JTS Topology Suite) oder C++ (z.B. Boost.Geometry).
Denke jedoch daran, dass der Aufbau des Indexes selbst Zeit kostet. Daher ist dieser Ansatz besonders effektiv, wenn du viele Punkte in derselben Triangulation suchst. Wenn du nur einen Punkt suchst und die Triangulation danach nicht weiter verwendest, ist es wahrscheinlich schneller, einfach jedes Dreieck zu überprüfen.