Punkt-in-Polygon-Test nach Jordan
# Punkt-in-Polygon-Test nach Jordan

Der Punkt-in-Polygon-Test nach Jordan prüft, ob ein bestimmter Punkt in der Ebene innerhalb, außerhalb oder an der Grenze eines Polygons liegt.

Nach dem Jordanschen Kurvensatz teilen, vereinfacht gesagt, die Ränder eines Polygons den Datenraum in eine Innen- und eine Außenseite. Für viele Anwendungen ist es nötig, herauszufinden, ob ein Punkt innerhalb oder außerhalb eines Polygons liegt.

## Strahl-Methode

Bei der Strahl-Methode wird von dem zu testenden Punkt ein Strahl in eine beliebige Richtung versendet. Dabei wird gezählt, wie oft der Strahl die Kanten des Polygons schneidet. Es können vier Fälle unterschieden werden:

* keinen Schnittpunkt
* eine gerade Anzahl von Schnittpunkten
* eine ungerade Anzahl von Schnittpunkten
* unendlich viele Schnittpunkte

Ist die Anzahl Null, liegt der Punkt außerhalb des Polygons. Ist die Anzahl ungerade, liegt der Punkt innerhalb des Polygons, ist sie gerade, liegt er außerhalb. Im Fall von unendlich vielen Schnittpunkten verlief der Strahl direkt auf einer Kante. Der Test muss dann mit einem anderen Winkel wiederholt werden. Durch eine verfeinerte Betrachtung der relativen Lage des Testpunktes und der Kantenenden im kollinearen Fall kann jedoch auf solch eine Wiederholung mit einem anderen Winkel verzichtet werden.

## Pseudocode

Der folgende Pseudocode zählt die Schnittpunkte entlang dem horizontal nach rechts gerichteten Strahl mit besonderer Beachtung der auf dem Strahl liegenden Ecken:

Hinweis: Gemäß der Beschreibung des Rückgabewertes der Funktion KreuzProdTest wird bei Delta > 0 der Wert $-1$ zurückgegeben. Wenn stattdessen das Vorzeichen von Delta zurückgegeben wird, liefert die Funktion PunktInPolygon auch das korrekte Ergebnis. In diesem Fall werden die Schnittpunkte der Kanten mit einem von $A$ nach links verlaufenden Strahl gezählt.

## Programmierung

Das folgende Beispiel in der Programmiersprache C# zeigt die Implementierung des Algorithmus. Die Punkte und die konvexe Hülle werden auf dem Hauptfenster gezeichnet. Das Programm verwendet mehrere Klassen. Bei der Ausführung des Programms wird die Methode Main verwendet, die das Ergebnis auf der Konsole ausgibt.

## Anwendungsgebiete

Diese Methode findet vor allem in Geoinformationssystemen Anwendung.

