Schnitte von Liniensegmenten - Algorithmische Geometrie
-
Upload
khangminh22 -
Category
Documents
-
view
0 -
download
0
Transcript of Schnitte von Liniensegmenten - Algorithmische Geometrie
Algorithmische Geometrie
Schnitte von Liniensegmenten
Dr. Stefan Jänicke Abteilung für Bild- und Signalverarbeitung
GIS: Speichern verschiedenergeografischer Daten, z.B.Städte, Flüsse, Straßen,Niederschlag, Temperatur,Verbreitung von Spezies, ...
Geographical Information Systems (GIS)
Aufgabe:→ Ermittle alle Schnittpunkte von Liniensegmenten aus den Mengen S
1 und S
2
→ 2 Segmente schneiden sich auch, falls der Endpunkt des einen Segmentes auf dem anderen liegt
→ Verallgemeinerung: betrachte Schnitte in S = S1 S∪
2
(bei verschiedenen Mengen prüft man einfach, ob zwei Segmente aus der gleichen Menge stammen oder nicht)
Schnitte von Liniensegmenten
Brute-Force Lösung:
– Schnittest zweier Segmente in konstanter Zeit→ Komplexität: O(n2) bei n Liniensegmenten
Input-sensitiver Algorithmus meist ineffizient in Praxis, da wesentlich weniger als n2 Schnitte vorhanden! Wieviel Schnitte erwarten wir?
→ Ziel: output-sensitiver Algorithmus (schnitt-sensitiv)
Schnitte von Liniensegmenten
Idee:– nur nahe gelegene Segmente können sich auch schneiden, z.B.:
→ Segmente können sich nur dann schneiden, wenn sich die jeweiligen y-Intervalle überlappen
→ ist das nicht der Fall, brauchen wir keinen Schnitttest durchführen
Schnitte von Liniensegmenten
Problemstellung in 1D:– Finde alle sich überlappenden Linienpaare!
Algorithmus:→ initialisiere leere Datenstruktur T→ sortieren Segmente nach aufsteigendem x-Wert der Endpunkte→ wenn linker Endpunkt von Segment s: mit jedem Segment in T gibt es eine Überlappung; füge s in T ein→ wenn rechter Endpunkt von Segment s: lösche s aus T
Output-sensitiver Algorithmus!
Schnitte von Liniensegmenten
Problemstellung in 2D (Beobachtung):Überlappung zweier Segmente nur dann möglich, wenn:→ sich die y-Intervalle überlappen→ Segmente in x-Richtung „irgendwann einmal“ benachbart sind
Lösung über Plane Sweep Algorithmus!
Schnitte von Liniensegmenten
Idee:→ horizontale Linie (Sweep Line) wandert über Ebene und löst das gegebene Problem von oben nach unten
● an bestimmten Positionen hält die Sweep Line und berechnet → Events
● an Eventpunkten wird der aktuelle Zustand der Sweep Line gespeichert → Status
● oberhalb der Sweep Line hat der Algorithmus alle notwendigen Informationen gesammelt
Plane Sweep Algorithmus
Status:– Liste der Liniensegmente aus S, die von der Sweep Line geschnitten werden– aufsteigend sortiert
Events:– Punkte, an denen sich der Status ändert bzw. Output generiert wird
● oberer Endpunkt eines Liniensegments● unterer Endpunkt eines Liniensegments● Schnittpunkt zweier Linien
Schnitte von Liniensegmenten
Liste von Events:– speichert alle Events in der Reihenfolge ihres Auftretens→ nach absteigendem y-Wert
Statusstruktur:– speichert aktuellen Status der Sweep Line→ geschnittene Liniensegmente nach aufsteigendem x-Wert sortiert
Schnitte von Liniensegmenten
Weitere Fälle:– Sweep Line erreicht unteren Endpunkt: lösche Segment von Statusstruktur– Sweep Line erreicht Schnittpunkt: tausche Segmente in Statusstruktur
Eventpunkte:– Start- und Endpunkte sind vor dem Verfahren bekannt– Schnittpunkte müssen ermittelt werden → Schnitte sind nur zwischen benachbarten Segmenten möglich → Test auf Schnitt wenn benachbart
Frage:Gibt es für zwei sich schneidende Segmente immer einen anderen Eventpunkt auf der Sweep-Line, der die Segmente benachbart und daher auf Schnitt prüft?
Schnitte von Liniensegmenten
Schnitte von Liniensegmenten
Zusammenfassung:– Sweep-line wird von oben nach unten bewegt.– sie hält an Ereignispunkten (Endpunkte der Liniensegmente, Schnittpunkte)– die Sweep-Status-Struktur speichert die von der Sweep-line geschnittenen Liniensegmente in geordneter Folge
Datenstrukturen:– Event queue Q : speichert alle Events nach absteigendem y-Wert– Sweep-Line Statusstruktur T : speichert alle von der Sweep Line berührten Segmente nach aufsteigendem x-Wert→ jeweils Implementierung als balancierter binärer Suchbaum mit O(log m) Schritte für m Elemente
An den Ereignispunkten:– ändert sich die Anordnung der Liniensegmente– muss der Sweep-Status-Struktur (geschnittene Liniensegmente) angepasst werden und auf Schnitte getestet werden
HandleEventPoint: p ist oberer Endpunkt
Schnitte von Liniensegmenten
1) Suche mit p in T und füge s in T ein
2) wenn s linken Nachbar schneidet, füge den zugehörigen Schnittpunkt in Q ein
3) wenn s rechten Nachbar schneidet, füge den zugehörigen Schnittpunkt in Q ein
HandleEventPoint: p ist unterer Endpunkt
Schnitte von Liniensegmenten
1) Suche mit p in T und entferne s aus T
2) sleft
und sright
seien die Nachbarn von s vor dem Löschen von s→ wenn es einen Schnittpunkt unterhalb der Sweep Line gibt, wird dieser in Q eingefügt
HandleEventPoint: p ist Schnittpunkt
Schnitte von Liniensegmenten
1) Tausche s mit s' in T
2) wenn es einen Schnittpunkt zwischen s und dem neuen rechten Nachbar von s unterhalb der Sweep Line gibt, wird dieser in Q eingefügt
3) wenn es einen Schnittpunkt zwischen s' und dem neuen linken Nachbar von s' unterhalb der Sweep Line gibt, wird dieser in Q eingefügt
Schnitte von Liniensegmenten
Ist es möglich, dass sich neu erkannte Nachbarn bereits oberhalb der Sweep Line
geschnitten haben?
Ist es möglich, dass ein Schnittpunkt bereits in Q auftritt,
aber noch nicht behandelt wurde?
KomplexitätWieviel Zeit ist nötig für einen Eventpunkt?
Schnitte von Liniensegmenten
– Lokalisierung des Punktes: maximal eine Suche in T→ je nach Eventtyp eine Insertion, Deletion oder ein Swap
– es müssen maximal zwei Nachbarn gefunden werden
– maximal eine Deletion in Q
– maximal zwei Insertions in Q
→ sowohl T als auch Q sind balancierte Binärbäume→ jeder Schritt kostet maximal O(log n) Zeit
→ Bearbeiten eines Eventpunktes kostet O(log n) Zeit
KomplexitätWie viele Events gibt es bei n Liniensegmenten?
Schnitte von Liniensegmenten
– n obere Endpunkte– n untere Endpunkte– k Schnittpunkte→ O(n+k) Events→ Komplexität: O(n log n + k log n)
Hinweis: Bei sehr großem k ist die Brute-Force Lösung effektiver!
Degenerierte Fälle 1:
Events mit gleichen y-Werten→ bearbeite von links nach rechts
„oberer“ Endpunkt „unterer“ Endpunkt
Schnitte von Liniensegmenten
Degenerierte Fälle 2:
– kolineare Liniensegmente si=(p
1,p
2) und s
j=(q
1,q
2)
– Kolinearität wird festgestellt, wenn sich Liniensegmente benachbarn und auf Schnitt geprüft wird → im Fall einer Überlappung muss adaptiert werden
→ Lösung 1: verschmelze si=(p
1,p
2) und s
j=(q
1,q
2) zu (siehe Beispiel): s
ij=(p
1,q
2)
→ da si schon in T liegt, muss T nicht angepasst werden
→ si wird überschrieben mit s
ij
→ in Q wird unterer Endpunkt von si (p
2) durch unteren Endpunkt von s
i (q
2)
ersetzt
Schnitte von Liniensegmenten
si
si
sjs
j
p1
p2q
1
q2
Degenerierte Fälle 2:
– kolineare Liniensegmente si=(p
1,p
2) und s
j=(q
1,q
2)
– Kolinearität wird festgestellt, wenn sich Liniensegmente benachbarn und auf Schnitt geprüft wird → im Fall einer Überlappung muss adaptiert werden
→ Lösung 2: kolineare Liniensegmente werden nicht als Schnitt interpretiert→ es muss jediglich eine Ordnung der überlappenden Segmente geben→ Ordung nach oberem Endpunkt, bei Gleichheit nach unterem Endpunkt
Schnitte von Liniensegmenten
si
si
sjs
j
p1
p2q
1
q2
Degenerierte Fälle 3:
→ definiere 3 Mengen von Segmenten:– U(p) mit Segmenten, die p als oberen Endpunkt haben– L(p) mit Segmenten, die p als unteren Endpunkt haben– C(p) mit Segmenten, die sich in p schneiden
Schnitte von Liniensegmenten
Schnitte von Liniensegmenten
→ bisher haben wir die Anzahl an Schnitten k betrachtet
→ da Duplikate nicht mehrfach in Q eingefügt werden, kann man die Anzahl an Events genau quantifizieren mit 2n Endpunkten + I Schnittpunkte
Speicherbedarf: – T speichert jedes Segment höchstens ein Mal → O(n)– die Größe von Q beträgt maximal O(n+I)→ linear ist besser!
Abhilfe:– speichere nur die Schnittpunkte von benachbarten Kanten → linearer Speicher– erkannte Schnittpunkte werden entfernt, wenn die zugehörigen Segmente nicht mehr benachbart sind– es gibt irgend ein Event, welches dazu führt, dass die Segmente wieder benachbart sind und der zugehörige Event Point wieder in Q eingefügt wird
Theorem:Sei S eine Menge von n Liniensegmenten in der Ebene. Alle Schnittpunkte in Smit den betroffenen Segmenten können in O(n log n + I log n) Schritten undO(n) Speicherplätzen gefunden werden, wobei I die Anzahl der Schnittpunkte ist.
Schnitte von Liniensegmenten
Appendix: Rotating Calipers
Breite einer Punktemenge: – entspricht der minimalen Breite eines Streifens, der alle Punkte der Punktemenge einschließt
Minimal Enclosing Rectangle: – Rechteck mit minimaler Fläche, welches alle Punkte einschließt
Toussaint, G. T. (2014). The Rotating Calipers: An efficient, multipurpose, computational Tool. The International Conference on Computing Technology and Information Management (ICCTIM2014) (pp. 215-225). The Society of Digital Information and Wireless Communication.