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)