Folie 1 von 36 Geometrische Algorithmen Segmentschnitt
Folie 2 von 36 Segmentschnitt Übersicht Zwei Segmente Lage zweier Segmente Prüfung auf Schnittfreiheit Formeln zum Geradenschnitt Feststellen des Schnitts durch Prüfen der Punktlage Sonderfälle n Segmente Paarweiser Schnitt Reduktion von 2-dim auf 1-dim Verfahren des Scan-Line Vorgehen Beispiel/Gegenbeispiel Ausnutzung der Nachbarschaft Ordnungsrelation Beispiel zur dynamischen Ordnung Vereinfachende Annahmen Formulierung des Algorithmus Datenstrukturen
Folie 3 von 36 Zwei Segmente Einfacher Fall
Folie 4 von 36 Zwei Segmente Lage
Folie 5 von 36 Zwei Segmente Prüfung auf Schnittfreiheit I Erste Idee: Berechnung der Geradengleichungen g und g' der Segmente s und s' Berechnung des Schnittpunkts p von g und g' Prüfen ob p in s und s'
Folie 6 von 36 Zwei Segmente Formeln Gegeben: Endpunkte der Segmente Geradengleichung für zwei Punkte
Folie 7 von 36 Zwei Segmente Prüfung auf Schnittfreiheit II Erste Idee: Berechnung der Geradengleichungen g und g' der Segmente s und s' Berechnung des Schnittpunkts p von g und g' Prüfen ob p in s und s' Problem: vertikale Segmente Vermeidung unangenehmer Sonderfälle
Folie 8 von 36 Zwei Segmente Lage und Schnitt
Folie 9 von 36 Zwei Segmente Formulierung des Grundproblems Reduktion auf das Problem: P3, P4 liegen auf der gleichen / verschiedenen Seiten der durch g induzierten Geraden
Folie 10 von 36 Zwei Segmente Prüfen der Punktlage Berechnung der Determinante Vorzeichen der Determinante gibt Auskunft über die Lage des Punktes zur Geraden. Wir unterscheiden 3 Fälle: D > 0: P liegt links von g D < 0: P liegt rechts von g D = 0: P liegt auf g
Folie 11 von 36 Zwei Segmente Prüfen aller Punktlagen Definition: Unter der Voraussetzung, dass alle Determinanten!= 0 sind, schneiden sich g und g' genau dann, wenn S1 und S2 sowie S3 und S4 jeweils verschiedene Vorzeichen haben
Folie 12 von 36 Zwei Segmente Sonderfälle Wenn alle Determinanten gleich Null sind, dann folgt daraus, daß alle vier Punkte kollinear sind. Falls eine Determinante Null ist:
Folie 13 von 36 n Segmente Allgemeiner Fall 1x
Folie 14 von 36 n Segmente Paarweiser Schnitt Naheliegendes Vorgehen: Überprüfe jedes Paar von Segmenten wende den zuvor skizzierten Algorithmus auf diese Paare an Wie viele Paare gibt es? Beispiel für NRW, Massstab 1:500.000* Schnitt der Kanten der Bahnstrecken mit dem Straßennetz: 8454 * 16934 = 143.160.036 geht es auch schneller? optimal wäre O(n * log n) (so schnell wie Sortieren) * Quelle: ArcDeutschland 500, ESRI
Folie 15 von 36 n Segmente Weitere Überlegungen Was wissen wir, was können wir ausnutzen? Vermeidung unnötiger Berechnungen, deren Ergebnis durch systematische Überlegung gewonnen werden kann Was ist eine besonders einfache Variante dieses Problems? alle Segmente liegen auf einer Geraden ( x-achse) eindimensionale Problemstellung Können wir die allgemeine (schwierige) Variante auf die spezielle (einfache) zurückführen?
Folie 16 von 36 n Segmente Reduktion von 2-dim auf 1-dim Überlappung der horizontalen Projektionen ist notwendig, aber nicht hinreichend für einen Schnitt 3x
Folie 17 von 36 n Segmente Was bringt die Reduktion? Nur Segmente, deren horizontale Projektionen sich überlappen, können sich auch schneiden Man kann die Prüfung auf diese Segmente einschränken Überprüfen aller Segmente durch sequentielles Vorgehen von links nach rechts ( Scannen ) Scan-Line
Folie 18 von 36 n Segmente Verfahren Scan-Line
Folie 19 von 36 n Segmente Vorgehen Scan-Line horizontale Scan-Line über die Ebene schieben aktive Elemente: Schnitt mit der Scan-Line nur aktive Elemente können horizontale Überschneidungen haben überprüfe aktive Elemente auf Schnittfreiheit Problem: Wo sind die Haltepunkte der Scan-Line? Anfangspunkt eines Segments Endpunkt eines Segments interessant sind also die x-koordinaten der Anfangs- und Endpunkte 1. Schritt: sortiere alle Punkte nach aufsteigenden x-koordinaten anders ausgedrückt: sortiere die x-koordinaten und statte jede x-koordinate mit einem Verweis auf den zugehörigen Punkt aus
Folie 20 von 36 n Segmente Beispiel Scan-Line 11x
Folie 21 von 36 n Segmente Gegenbeispiel Scan-Line Zu viele Elemente gleichzeitig aktiv: 2x
Folie 22 von 36 n Segmente Weitere Überlegungen zum Scan-Line Scannen allein reicht nicht zu viele Elemente gleichzeitig aktiv wir können uns an jedem Haltepunkt der Scan-Line maximal ein oder zwei (oder konstant viele) Tests erlauben also müssen wir sparen... und zusätzliches Wissen einspeisen nur benachbarte Segmente können sich schneiden
Folie 23 von 36 n Segmente Nachbarschaft 3x
Folie 24 von 36 n Segmente Ausnutzung der Nachbarschaft wie definiert man Nachbarschaft...... so, daß man sehr schnell erkennt, ob zwei Segmente benachbart sind?
Folie 25 von 36 n Segmente Was ist Nachbarschaft?
Folie 26 von 36 n Segmente Ausnutzung der Nachbarschaft wie definiert man Nachbarschaft...... so, daß man sehr schnell erkennt, ob zwei Segmente benachbart sind? Nutzung der Scan-Line Betrachte die Schnittpunkte der aktiven Segmente mit der Scan-Line ordne die Segmente nach den y-koordinaten ihrer Schnittpunkte mit der Scan-Line nenne diese Ordnung
Folie 27 von 36 n Segmente Ordnungsrelation 6x
Folie 28 von 36 n Segmente Ordnung der Segmente ist eine partielle Ordnung...... die nur auf der Menge der aktiven Elemente definiert ist die Ordnung zwischen zwei Elementen wird an ihren Schnittpunkten umgedreht aus wird am Schnittpunkt s von a und b diese Ordnung ist natürlich eindimensional und für die aktiven Elemente vollständig sie ist abhängig vom Haltepunkt x der Scan-Line diese Ordnung ist also dynamisch und hängt von x als Parameter ab tun wir vorübergehend so, als hätten wir diese Ordnung "im Griff"
Folie 29 von 36 n Segmente Beispiel Dynamische Ordnung 18x
Folie 30 von 36 n Segmente Zusatzfrage Scan-Line Wann wird der Schnittpunkt S1 erkannt? Übung: Wird ein Schnittpunkt ggf. mehr als einmal erkannt? 1x
Folie 31 von 36 n Segmente Scan-Line: Vereinfachende Annahmen Annahme: 2 Segmente schneiden sich höchstens in einem Punkt in keinem Punkt schneiden sich mehr als 2 Segmente die x-koordinaten aller Segmente sind paarweise verschieden kein Segment ist vertikal
Folie 32 von 36 n Segmente Algorithmus Scan-Line Input: S: eine Menge von Segmenten Output: die Schnittpunkte der Elemente von S Sei: T = Endpunkte der Segmente von S nach x- Koordinaten sortiert (Haltepunkte) L = // aktive Segmente von S while T do bestimme und entferne den nächsten Punkt p T x ist x-koordinate von p case: p ist linker Endpunkt von s fuege_ein(s,x,l) sl = vorgaenger(s,x,l) sr = nachfolger(s,x,l) schnitt(sl,s,t); schnitt(s,sr,t); p ist rechter Endpunkt von s sl = vorgaenger(s,x,l) sr = nachfolger(s,x,l) entferne(s,x,l) schnitt(sl,sr,t) p ist Schnittpunkt von s und t vertausche(s,t,l,x) // t < s sl = vorgaenger(t,x,l) sr = nachfolger(s,x,l) schnitt(sl,t,t) schnitt(s,sr,t)
Folie 33 von 36 n Segmente Algorithmus Scan-Line - Methoden fuege_ein(s,x,l): entferne(s,x,l): nachfolger(s,x,l): vorgaenger(s,x,l): schnitt(s,t,t): offene Probleme: fügt das Segment s in die Menge L ein entsprechend der Ordnung an der Stelle x entfernt das Segment s aus die Menge L an der Stelle x liefert den Nachfolger von s in L an der Stelle x, falls vorhanden liefert den Vorgänger von s in L an der Stelle x, falls vorhanden prüft s und t auf Schnitt. Berechnet ggf. den Schnittpunkt p und fügt ihn als neuen Haltepunkt in T ein. eine geeignete Datenstruktur für T eine geeignete Datenstruktur für L Prüfung auf Schnitt, Berechnung des Schnittpunkts
Folie 34 von 36 n Segmente Datenstrukturen für T und S Datenstrukur für T AVL-Baum letztes Semester was ist ein AVL-Baum erstens ein Suchbaum zweitens ausgeglichen Datenstruktur für L AVL-Baum? Problem: "Vorgänger"und "Nachfolger" finden das wird vom AVL-Baum nicht unterstützt also: Variante des AVL-Baums alle Informationen sind in Blättern (nicht in inneren Knoten) die Blätter bilden eine doppelt verkettete Liste
Folie 35 von 36 Datenstruktur Variante des AVL-Baums mit einer doppelt verketteten Liste der Blätter für die Menge der aktiven Elemente
Folie 36 von 36 Datenstruktur für die Haltepunkte...mit den Operationen Einfügen eines gefundenen Schnittpunktes Finden und Entfernen des nächsten (also minimalen) Elements...... genügt ein normaler AVL-Baum obwohl man mit Kanonen auf Spatzen schießt besser: ein Heap (wie bei Dijkstra)