Geometrische Algorithmen Punkt-in-Polygon-Suche
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Punkt-in-Polygon-Suche Übersicht
l Praxisbeispiel/Problemstellung
l Zählen von Schnittpunkten
¡ Schnitt einer Halbgerade mit der Masche
¡ Aufwandsbetrachtung
l Streifenkarte
¡ Vorgehen und Eigenschaften
¡ Speicherung der Daten / Suche in den Daten
¡ Aufwandsbetrachtung
l Trapezkarte
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Praxisbeispiel Rollover am Bildschirm
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 1 Zählen
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Problemstellung 1 In welcher Masche liegt Punkt P?
Allgemein:
l Gegeben ist eine räumliche
Datenbank und eine Klasse typischer Anfragen
l Gesucht wird eine Datenstruktur, die einen effizienten Algorithmus
unterstützt Konkret:
l Gegeben ist eine Landkarte S und ein Punkt P
l Gesucht wird die Masche M, die den Punkt P beinhaltet
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 1 Halbgerade am Punkt anlegen
Aus dem >>Jordanschen Kurvensatz folgt:
l Konstruiere ausgehend von P eine Halbgerade in beliebiger Richtung
l P liegt außerhalb des begrenzten Gebietes, wenn eine gerade Anzahl von Schnittpunkten entsteht.
l P liegt innerhalb des begrenzten Gebietes, wenn eine ungerade
Anzahl von Schnittpunkten entsteht.
1x
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Theorem Jordanscher Kurvensatz
Nach Jordan:
l Eine geschlossene Jordankurve S zerlegt die Ebene in zwei
zusammenhängende Gebiete, von denen genau eines nicht beschränkt ist.
l Zwei Punkte der Ebene können genau dann durch eine Jordankurve J
verbunden werden, die S nicht
schneidet, wenn sie entweder beide im Inneren oder beide im Äußeren von S liegen.
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 1 Suchaufwand
Das Verfahren muss für jede Masche iteriert werden:
l Aufwand für ein Polygon mit n Kanten: O(n)
l Aufwand bei m Polygonen: O(m*n)
Der Aufwand für eine Suche nach dem Jordanschen Kurvensatz beträgt
O(m*n).
Mit welchem Verfahren kann der Suchaufwand verringert werden?
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Praxisbeispiel Bundesrepublik Deutschland
In der Praxis kann die Anzahl der Maschen und Kanten sehr schnell hoch werden:
Bundesrepublik Deutschland:
1 Masche
Bundesländer:
16 Maschen mit 17.700 Kanten Kreise:
440 Maschen mit 75.000 Kanten Gemeinden:
13.900 Maschen mit 300.000 Kanten
Angaben für den Massstab 1:500.000 Quelle: ArcDeutschland 500, ESRI
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Vorgehensweise 2 Konstruktion eines Index
Der Aufbau eines Index kostet Zeit. Diese amortisiert sich jedoch bei der Abfrage.
Allgemein:
l Gegeben: Räumliche Datenbank und eine Klasse typischer Anfragen
l Gesucht: Datenstruktur, die einen möglichst schnellen Algorithmus unterstützt
Konkret:
l Gegeben: Landkarte S und ein Punkt P
l Gesucht: Index für die schnelle Identifikation der zugeordneten Masche M .
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 2 Zerschneiden
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 2 Konstruktion der Streifenkarte S'
Vorgehen:
l Konstruktion einer Karte S' durch Aufteilung der Landkarte mit
vertikalen Geraden durch alle Knoten.
Folge:
l In allen Schnittpunkten der Geraden mit den Kanten entstehen neue
Knoten.
2x
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 2 Eigenschaften von S'
S' hat folgende Eigenschaften:
l Die Maschen sind in Trapeze (ggf.
Dreiecke) zerlegt.
l Kanten sind in Teilkanten zerlegt.
2x
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 2 Vorteil von S'
Die Karte erhält eine Struktur, die wir ausnutzen können:
l Die Streifen sind in x-Richtung angeordnet.
l Innerhalb eines Streifens sind die Teilkanten und damit die Trapeze in y-Richtung angeordnet.
2x
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz II Speicherung der Daten
Die Datenspeicherung erfolgt in Arrays:
l Ein Array enthält die x-Koordinaten der Streifen.
l Jeder Streifen enthält ein Array der y-Koordinaten der Teilkanten.
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 2 Intervall-Bisektion
Zwei schnelle binäre Suchalgorithmen werden für die Suche nach der Masche hintereinander geschaltet:
l Binäre Suche im Array der x-
Koordinaten nach dem Streifen, der P enthält.
l Binäre Suche nach dem zugehörigen Trapez in diesem Streifen.
Sobald die Teilkante direkt >>unterhalb/
oberhalb von P gefunden ist, ist die gesuchte Masche gefunden.
3x
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Bemerkungen Eigenschaften der Maschen
Es gilt:
l Jeder Abschnitt eines Streifens liegt genau in einer Masche.
l Jede Kante lässt sich einer in y-
Richtung folgenden Masche zuordnen.
l Die Fläche"Außen" muss ebenfalls als Masche angesehen werden.
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 2 Suchaufwand
Der Suchaufwand dieses Lösungsansatzes entsteht durch:
l Binäre Suche im Array der x-Koordinaten nach dem Streifen, der P enthält:
Binäre Suche in einem Array mit maximaler Länge 2n: O(log n)
l Binäre Suche nach der Lage von P zu den Teilkanten im Array der y-Koordinaten:
Binäre Suche in einem Array mit maximaler Länge n: O(log n)
Der Aufwand für die binäre Suche in einer Streifenkarte beträgt O(log n).
Im >>Vergleich zum Lösungsansatz 1 hat sich der Suchaufwand verbessert.
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Vergleich Suchaufwand der zwei Lösungsansätze
Der Aufwand für eine Suche nach dem Jordanschen Kurvensatz beträgt O(n).
Der Suchaufwand für die binäre Suche in einer Streifenkarte beträgt O(log n).
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 2 Speicherbedarf
Es entsteht eine hohe Speicheranforderung durch:
l die sortierte Speicherung der x-Koordinaten der vertikalen Geraden in einem Array:
Array der x-Koordinaten: O(n)
l die sortierte Speicherung der y-Koordinaten der Teilkanten jedes Streifens von oben nach unten in einem Array:
Array der y-Koordinaten: O(n)
Die Speicheranforderung für die Daten dieses Lösungsansatzes beträgt O(n²)
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 2 Worst Case Speicherbedarf
Der Worst Case tritt tatsächlich auf:
l In ungünstigen Fällen erfolgt mit diesem Verfahren eine sehr hohe Knoten- und Teilkantenbildung und damit ein hohes Datenaufkommen.
Wie kann der Speicherbedarf verringert werden?
1x
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Problemstellung 3 Verringerung des Speicherbedarfs
Zwischenresümee:
l Die Zerlegung in Streifen führt zu einer schnellen Suche.
l Allerdings ist der Speicherbedarf unvertretbar hoch.
Problem:
l Gibt es eine bessere Zerlegung, die die Laufzeit erhält und den
Speicherbedarf verringert?
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Tranchieren
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Vereinfachung des Beispiels
Um im Folgenden die Übersicht zu wahren, wird die Beispielkarte geändert:
l Löschen zweier Knoten: Ersetzen von drei Kanten durch eine Kante
l Verschieben zweier Knoten
2x
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Vereinfachende Annahmen
l Umschließen der Karte durch ein achsenparalleles Rechteck R:
Vermeidung der unbeschränkte Masche "Außen"
l Es existieren keine Knoten mit gleicher x-Koordinate:
Scherung oder Rotation um den Winkel e um den Ursprung
¡ e ist sehr klein wodurch die Topologie erhalten bleibt
¡ Später wird gezeigt, dass diese Transformation rein virtuell ist
2x
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Konstruktion der Trapezkarte T(S)
Vorgehen:
l Bei der Salamikarte werden alle Kanten der Landkarte
durchschnitten. Beim Tranchieren endet der Schnitt an der Kante.
Dadurch werden nur die direkt betroffenen Kanten zerlegt.
2x
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Konstruktionsprinzip Trapezkarte
Gegeben ist eine Landkarte S, umschlossen von einem Rechteck R; es existieren keine Knoten mit gleicher x-Koordinate
l Konstruiere für jeden Knoten aus S eine obere und eine untere vertikale
Extension (Linie); diese Linien enden am Schnittpunkt mit der nächsten Kante aus S oder an R
Die Trapezkarte T(S) ist eine Zerlegung, bestehend aus der Landkarte S, dem Rechteck R und den vertikalen Extensionen
l T(S) besteht aus disjunkten Trapezen (Dreiecken), die von (höchstens) vier Seiten (Kanten) begrenzt werden:
¡ Ein oder zwei vertikale Seiten, gebildet aus den Extensionen
¡ Genau zwei nicht-vertikale Seiten, gebildet aus Segmenten von Kanten
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Eigenschaften von T(S)
5 Fälle für die vertikalen Kanten (in der Abbildung die linken Kanten):
1. Die Kante entartet zu einem Punkt 2. Die untere vertikale Erweiterung
trifft auf eine Kante von S
3. Die obere vertikale Erweiterung trifft auf eine Kante von S
4. Die Kante besteht aus oberer und unterer Extension
5. Die Kante besteht aus einer Kante des Rechtecks R (genau zwei
Trapeze)
5x
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Bezeichnungen
Ein Trapez ist durch vier Elemente eindeutig festgelegt:
l top( )
l bottom( )
l leftp( ): Linker Endpunkt von top( ) oder bottom( ) oder rechter Knoten einer dritten Kante (linke Kante eines Trapezes besteht aus oberer und
unterer Extension) oder einer der linken Knoten von R (Trapez ganz links
l rightp( ):
analog zu leftp( )
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Komplexität der Trapezkarte
Satz 1:
Eine Trapezkarte T(S) einer Landkarte S mit n Kanten enthält höchstens:
a) 6n + 4 Knoten und b) 3n + 1 Trapeze.
Beweis:
a) >>Addition der vorkommenden Knoten b) mit Eulers Formel aus a) (als Übung)
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Beweis zu Satz 1a
Satz 1:
Eine Trapezkarte T(S) einer Landkarte S mit n Kanten enthält höchstens:
(a) 6n + 4 Knoten
Beweis:
Ein Knoten der Trapezkarte ist entweder
Insgesamt: 6n + 4
l ein Eckpunkt von R
l ein Knoten der Karte S
l Endknoten einer Extension (n Kanten 2 · n Knoten
2 · 2 · n Endknoten)
4 2 · n 2 · 2 · n
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Adjazenz von Trapezen
Zwei Trapeze und ' heißen adjazent, wenn sie sich entlang einer vertikalen Linie berühren.
Es gilt entweder: top( ) = top( ') oder: bottom( ) = bottom( ')
Ein Trapez kann höchstens zu vier Trapezen adjazent sein.
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Datenstruktur für T(S)
l Möglich wäre eine doppelt verkettete Kantenliste
l Wegen der einfachen Struktur der Trapeze bietet sich folgende Alternative an:
¡ Elemente für Knoten (mit Koordinaten) von S (leftp( ), rightp( ))
¡ Elemente für Kanten (mit Referenzen auf Knoten) von S (top( ), bottom( ))
¡ Elemente für Trapeze von T(S) mit Referenzen auf:
n leftp( )
n rightp( )
n top( )
n bottom( )
n alle (maximal 4) adjazenten Trapeze
l Beachte: Die Geometrie der Trapeze ist nur implizit, kann aber in konstanter Zeit rekonstruiert werden
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Konstruktion und Suche
l Probleme:
¡ Konstruktion der Trapezkarte T(S)
¡ Unterstützung der Suche in einer Trapezkarte
l Idee für das weitere Vorgehen:
¡ Unterstützung der Suche durch eine Art „binärer Suchbaum“ D mit 2 Arten von Elementen
n X-Elemente für Knoten: Links oder Rechts?
n Y-Elemente für Kanten: Oben oder Unten?
¡ Trapezkarte und „Baum“ werden simultan konstruiert
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Beispiel für T(S) und D
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Aufbau des Beispiels
33x
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Zum Algorithmus
l T(S) und D werden simultan konstruiert
l Die Suchstrukur wird schrittweise aufgebaut: Nach "Einfügen" eines Elements in der Karte S erfolgt ein Update von Suchstruktur und Trapezkarte
l D ist kein Baum, sondern ein „DAG“, ein „directed acyclic graph“, ein gerichteter azyklischer Graph
l Dieser DAG ist zusammenhängend, hat genau eine Wurzel und genau ein Blatt für jedes Trapez von T(S)
l In der berechneten Suchstruktur referenzieren sich die Blätter von D und die Trapeze von T(S) gegenseitig
l Wie stets hängt die Tiefe (=Güte) des Baumes von der Reihenfolge der Bearbeitung der Segmente ab
l Idee: Zufällige Permutation der Segmente von S
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Pseudocode: Aufbau von T(S) & D
Input: Eine Landkarte S mit n Kanten
Output:Eine Trapezkarte T(S) und eine Suchstruktur D für T(S) in einem Rechteck R
1. Konstruiere ein umschließendes Rechteck R 2. Berechne eine Permutation s
1, s
2,...,s
n der Kanten von S 3.for i = 1 to n
4. do Finde die Trapeze
0,...,
k in T(S
i-1), die von s
i
geschnitten werden 5. Lösche
0,...,
k aus T(S
i-1) und ersetze sie durch neue Trapeze
6. Entferne die Elemente für
0,...,
k aus D
i-1 und füge neue innere Knoten und Blätter an
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Übergang von i-1 zu i
Offene Frage: Wie finden wir 0,..., k?
l Konstruktion von T(Si) und Di mit Si = {s1, ..., si} unter Verwendung von T(Si-1) und Di-1
l "Schleifeninvariante": T(Si-1) ist eine Trapezkarte und D(Si-1) ist eine Suchstruktur für diese Trapezkarte
l Der Unterschied zwischen "i - 1" und " i " betrifft genau die Trapeze in T(Si-1), die von si geschnitten werden
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Pseudocode: Finde Trapeze
Input: Das Segment si , T(Si-1) und D(Si-1)
Output: Die Trapeze 0, ..., k, die von si geschnitten werden.
1. Seien p
i und q
i linker und rechter Knoten von s
i
2. Punkt-in-Polygon für p
i in D
i-1: Finde
0 3. j = 0;
4.while q
i liegt rechts von rightp(
j) 5. do if rightp(
j) liegt oberhalb von s
i 6. then
j+1 ist der untere rechte Nachbar von
j 7. else
j+1 ist der obere rechte Nachbar von
j 8. j = j + 1
9.return
0, ...,
k Wir erhalten zwei Fälle
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Trapezfolge Fall 1
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Beispiel zum Fall 1
15x
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Trapezfolge Fall 2
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Beispiel für Fall 2
21x
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Effizienz I - Erwartungswerte
Der oben beschriebene Algorithmus hat folgende Erwartungswerte (gemittelt über alle Permutationen von n Segmenten):
l Konstruktion von T(S) und Aufbau von D(S): O(n log n)
l Speicherplatz von D(S): O(n)
l Punkt-in-Polygon-Suche mittels D(S): O(log n)
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Effizienz II - Bemerkungen
l Der Erwartungswert bezieht sich auf die Menge aller Permutationen
l Pech bei der Permutation kann zum Worst – Case O(n) für die Suche und zu entsprechender Tiefe der Suchstruktur führen
l Abhilfe durch Stop-Loss-Punkt setzen: Brich ab, falls D(S) zu tief wird, und fange neu an mit einer neuen Permutation
l Differenz zum Worst-Case O(n) für die Suche und O(n2) für die Konstruktion kann beliebig klein gemacht werden, ohne daß man von der O(n log n) – Laufzeit für die Konstruktion von D(S) sehr stark abweicht
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Sonderfallbetrachtung I
Annahme war : Keine zwei Knoten haben die gleiche x-Koordinate!
l Übung: An welcher Stelle im Algorithmus treten Probleme auf, falls zwei Punkte die gleiche x-Koordinaten haben?
l In der Praxis darf dieser Sonderfall natürlich nicht ausgeschlossen werden!
l Mögliche Lösung: Rotation der Achse um einen kleinen Winkel Schwierigkeit: Numerik bei der Rotation um kleine Winkel
l Lösung: >>Symbolische Transformation in Form einer Scherung entlang der x- Achse:
l ist so klein, dass die Reihenfolge der Knoten in x-Richtung erhalten bleibt
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Scherung
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Sonderfallbetrachtung II
Anwendung des Algorithmus "Trapezkarte" auf S := { s : s S } Problem: Numerik bei Punkten p = (x + y, y)
l Wir nutzen statt p = (x + y, y) die Repräsentation ( x, y):
¡ Es werden im Algorithmus keine geometrischen Objekte berechnet, auch wird nicht benötigt
¡ Es genügen qualitative Aussagen: rechts/links an x-Knoten bzw. oben/unten an y-Knoten
¡ Diese Aussagen lassen sich durch Betrachtung der Punkte (x, y) treffen
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Lösungsansatz 3 Sonderfallbetrachtung III
Rechts/links-Vergleich zweier transformierter Punkte (xp + yp, yp) und (xq + yq, yq):
l xp!= xq : Vergleich von xp und xq ergibt Reihenfolge der Knoten in x-Richtung
l xp = xq : Reihenfolge der transformierten Knoten in x-Richtung hängt von den y- Koordinaten ab
Übung: Betrachtung des oben/unten-Vergleichs eines Knotens q = (x + y, y) an einer Kante s mit den Anfangs- bzw. Endknoten p1 = (x1 + y1, y1) und p2 = (x2 +
y2, y2)
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche
Punkt-in-Polygon-Suche Literatur
De Berg, Mark et al.: Computational Geometry: Algorithms and Applications.
Springer Verlag Berlin, Heidelberg, 1997
Lernmodul 7: Geo-Algorithmen und -Datenstrukturen - Punkt-in-Polygon-Suche