Hallo,
ich möchte per Funktion berechnen ob sich ein Punkt P innerhalb eines Polygons befindet.
Ein Polygon definiere ich als eine Liste von Punkten (ich nenne es mal "Polygon-Punktliste"), welche nacheinander mit Linien verbunden sind. Ich verzichte extra auf das Wort Kante.
Ich habe eine Lösung (nicht ohne Hilfe) gefunden von der ich glaube, dass sie richtig ist und würde gern wissen, ob der Gedanke alle Fälle abdeckt.
Vielleicht macht sich der ein oder andere der Lust hat das ganze auf Papier anschaulich, ist dann wesentlich einfacher zu verstehen.
Ich ziehe von dem Punkt P eine Linie zu einem Punkt, der garantiert außerhalb des Polygons liegt (schonmal ein Schwachpunkt *1). Zum Beispiel Q(MAX_INT, P.y). Es ensteht also eine waagerechte Linie von P nach Q.
Nun zähle und vergleiche ich alle Schnittpunkte zwischen der Linie PQ und den Polygon Linien. Bei den Schnittpunkten, die _nicht_ Teil der Polygon-Punktliste sind (also keine Polygon-Ecken sind) zähle ich den Zähler um 1 hoch, sonst nicht, denn dann habe ich eine Ecke erwischt und befinde mich noch in dem Raum (innen/außen) wo ich mich vor der "Kollision" befand.
Ist der Zähler am Ende gerade, befindet sich Punkt P außerhalb des Polygons, bei ungerader Anzahl befindet er sich innerhalb.
Wandere ich vom Punkt Q der garantiert außerhalb liegt zum Punkt P und kreuze nur eine Polygon-Linie, befinde ich mich danach innerhalb des Polygons, durchstoße ich die nächste bin ich wieder außerhalb usw.
Die Frage ist, habe ich alle Möglichkeiten abgedeckt, bzw. was wären Spezialfälle?
- Die PQ-Linie stimmt mit einer Polygon-Linie überein. Ist nicht relevant mit meinem Lösungsgedanken oder?
- Punkt P ist eine Ecke des Polygons (sehe gerade, dieser Fall wäre schonmal nicht abgedeckt und müsste wohl extra behandelt werden)
- Was ist mit Polygonen die sich selbst schneiden ("8"er-Form)
*1) Vielleicht könnte ich MAX_INT durch MAX(alle x-Werte der Polygon-Punkte) + 1 definieren.
ich möchte per Funktion berechnen ob sich ein Punkt P innerhalb eines Polygons befindet.
Ein Polygon definiere ich als eine Liste von Punkten (ich nenne es mal "Polygon-Punktliste"), welche nacheinander mit Linien verbunden sind. Ich verzichte extra auf das Wort Kante.
Ich habe eine Lösung (nicht ohne Hilfe) gefunden von der ich glaube, dass sie richtig ist und würde gern wissen, ob der Gedanke alle Fälle abdeckt.
Vielleicht macht sich der ein oder andere der Lust hat das ganze auf Papier anschaulich, ist dann wesentlich einfacher zu verstehen.
Ich ziehe von dem Punkt P eine Linie zu einem Punkt, der garantiert außerhalb des Polygons liegt (schonmal ein Schwachpunkt *1). Zum Beispiel Q(MAX_INT, P.y). Es ensteht also eine waagerechte Linie von P nach Q.
Nun zähle und vergleiche ich alle Schnittpunkte zwischen der Linie PQ und den Polygon Linien. Bei den Schnittpunkten, die _nicht_ Teil der Polygon-Punktliste sind (also keine Polygon-Ecken sind) zähle ich den Zähler um 1 hoch, sonst nicht, denn dann habe ich eine Ecke erwischt und befinde mich noch in dem Raum (innen/außen) wo ich mich vor der "Kollision" befand.
Ist der Zähler am Ende gerade, befindet sich Punkt P außerhalb des Polygons, bei ungerader Anzahl befindet er sich innerhalb.
Wandere ich vom Punkt Q der garantiert außerhalb liegt zum Punkt P und kreuze nur eine Polygon-Linie, befinde ich mich danach innerhalb des Polygons, durchstoße ich die nächste bin ich wieder außerhalb usw.
Die Frage ist, habe ich alle Möglichkeiten abgedeckt, bzw. was wären Spezialfälle?
- Die PQ-Linie stimmt mit einer Polygon-Linie überein. Ist nicht relevant mit meinem Lösungsgedanken oder?
- Punkt P ist eine Ecke des Polygons (sehe gerade, dieser Fall wäre schonmal nicht abgedeckt und müsste wohl extra behandelt werden)
- Was ist mit Polygonen die sich selbst schneiden ("8"er-Form)
*1) Vielleicht könnte ich MAX_INT durch MAX(alle x-Werte der Polygon-Punkte) + 1 definieren.
Kommentar