Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik II Vorlesung 4 04.05.00 • Tiefen- und Breitendurchlauf • geometrische Algorithmen, Segmentschnitt Foliendesign: cand. geod. Jörg Steinrücken Übersicht • Abschluss Graph-Algorithmen – Tiefendurchlauf • Beispiel • rekursiver Algorithmus – Breitendurchlauf • Beginn Geo-Algorithmen – Prüfung auf Schnittfreiheit – Heute: Schnitt zweier Segmente – Nächste Woche: Schnitt von n Segmenten Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 2 Was ist neu • In einem binären Baum hat jeder Knoten höchstens zwei Nachfolger, in einem Graphen beliebig viele • Ein Baum ist immer zyklenfrei, ein Graph kann Zyklen enthalten (z.B. Do – Du – D – W im Beispiel) • In einem Zyklus kann man unendlich viel Zeit verbringen • Lösung: Faden der Ariadne (Quelle: Sagen des klassischen Altertums) • Moderne Version: ein Boolescher Array „besucht“ Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 3 Tiefendurchlauf Do Du Ha W D K Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 4 Tiefendurchlauf Do Du aktuell Ha W D K Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 5 Tiefendurchlauf Do Du besucht Ha W D K Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 6 Tiefendurchlauf Do Du Ha W D K Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 7 Tiefendurchlauf Do Du Ha W D kein Nachfolger backtracking K Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 8 Tiefendurchlauf Do Du Ha W D K Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 9 Tiefendurchlauf Do Du Ha W D Alle Nachfolger sind bereits besucht K Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 10 Tiefendurchlauf Do Du Ha W D K Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 11 Tiefendurchlauf Do Du Ha W D K Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 12 Tiefendurchlauf Do Du Ha W D K Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 13 Tiefendurchlauf Do Du Ha W D K Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 14 Tiefendurchlauf Do Du Ha W D K Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 15 Tiefendurchlauf Do Du Ha W D K Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 16 Tiefendurchlauf als rekursiver Algorithmus tiefensuche(k) //Tíefendurchlauf vom Knoten k aus { if(besucht[k] == false) { drucke k; besucht[k] = true; for(jeder Nachfolger ki von k) { tiefensuche(ki); } } } Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 17 Breitendurchlauf (binärer Suchbaum) Test auf Ende entferne class BST { ... void Breitendurchlauf() { SohnListe ws = new SohnListe(); Knoten aktuell; ws.FügeAn(wurzel); while ((aktuell = ws.Entferne()) != null) { System.out.println(aktuell.GibWert()); ws.FügeAn(aktuell.GibLinks()); ws.FügeAn(aktuell.GibRechts()); } } ... } Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 18 Breitendurchlauf class BST { ... void Breitendurchlauf(k) { SohnListe ws = new SohnListe(); Knoten aktuell; besucht[k] = true; ws.FügeAn(k); while ((aktuell = ws.Entferne()) != null) { System.out.println(aktuell.GibWert()); ws.FügeAn(aktuell.GibLinks()); ws.FügeAn(aktuell.GibRechts()); } } ... } Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 19 Breitendurchlauf class BST { ... void Breitendurchlauf(k) { SohnListe ws = new SohnListe(); Knoten aktuell; ws.FügeAn(k); besucht[k] = true; while ((aktuell = ws.Entferne()) != null) { System.out.println(aktuell.GibWert()); ws.FügeAn(aktuell.GibLinks()); ws.FügeAn(aktuell.GibRechts()); } } Verarbeiten ... eines Knotens } Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 20 Breitendurchlauf class BST { ... void Breitendurchlauf(k) { SohnListe ws = new SohnListe(); Knoten aktuell; ws.FügeAn(k); besucht[k] = true; while ((aktuell = ws.Entferne()) != null) { System.out.println(aktuell.GibWert()); for(jeder Nachfolger ki von aktuell) { if(besucht[ki] == false) { ws.FügeAn(ki); besucht[ki] = true; } } } } ... } Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 21 Prüfung auf Schnittfreiheit • 1. Idee – Berechnung der Geradengleichungen g und g‘ der Segmente s und s‘ – Schnittpunkt p von g und g‘ – prüfe ob p in s und s‘ Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 22 Schnittpunktberechnung Gegeben: Endpunkte der Segmente Geradengleichung für zwei Punkte: y2 y1 y y1 ( x x1 ) x 2 x1 g: y a x b g' : y a' x b' Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 23 Prüfung auf Schnittfreiheit • 1. Idee – Berechnung der Geradengleichungen g und g‘ der Segmente s und s‘ – Schnittpunkt p von g und g‘ – prüfe ob p in s und s‘ • Problem – vertikale Segmente – Vermeidung unangenehmer Sonderfälle Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 24 Segmentschnitt I g1 g2 a) g1 g2 g2 g1 b) c) Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 25 Segmentschnitt II • Reduktion auf das Problem: P1, P2 liegen auf der gleichen / verschiedenen Seiten der durch g induzierten Geraden • Homogene Koordinaten: P1 = (x1,y1,w1) P2 = (x2,y2,w2) P = (x,y,w) • w = w1 = w2 = 1 x x1 x2 D( P , P1 , P2 ) D y y1 y2 w w1 w2 y D=0 D>0 P2 P s D<0 P1 x wenn D 0 ist, liegt P links von g wenn D 0 ist, liegt P rechts von g wenn D 0 ist, liegt P auf g Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 26 Was wird durch die Determinante berechnet? Z Vektoren spannen Parallelepiped auf Y x p2 P P2 p 1 p1 P1 y X Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 27 Spatprodukt Das Spatprodukt (a b ) c ergibt einen Skalar, der zahlenmäßig gleich dem Volumen des von den drei Vektoren gebildeten Parallelepipeds ist; das Ergebnis ist positiv, falls a, b und c ein Rechtssystem, negativ, falls sie ein Linkssystem bilden. (a b ) c a b c b c a c a b a x bx c x -a c b -b a c -c b a a y b y c y a z bz c z Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 28 Rechts- oder Linkssystem? Bilden ein Rechtssystem Z p1 p2 Y x p2 P P2 p 1 p1 P1 y X Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 29 Rechts- oder Linkssystem? Z p, p1 und p2 bilden ein Rechtssystem D>0 Y x p2 P P2 p 1 p1 P1 y X Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 30 Rechts- oder Linkssystem? Z Y x p1 P P1 p 1 p1 p2 p2 P2 y X Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 31 Rechts- oder Linkssystem? Z p, p1 und p2 bilden ein Linkssystem D<0 Y x p1 P P1 p 1 p2 P2 y X Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 32 Rechts- oder Linkssystem? Z Es wird kein Parallelepiped aufgespannt D=0 Y x p2 P p 1 P1 p1 P2 y X Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 33 Einfacher Segmentschnitt I P2 g P2 P1 P3 P3 P4 P4 g` P3 S1 = det ( P1,P3,P4) S2 = det ( P2,P3,P4) S3 = det ( P3,P1,P2) S4 = det ( P4,P1,P2) P1 P2 P4 P1 Def.: Vor.: Alle Determinanten sind 0: g und g` schneiden sich genau dann, wenn S1, S2 sowie S3, S4 jeweils verschiedene Vorzeichen haben. Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 34 Einfacher Segmentschnitt II Wenn alle Determinanten gleich Null sind, dann folgt daraus, daß alle vier Punkte kollinear sind. - eine Determinante ist Null: => Algorithmus: Einsparen von Multiplikationen Lutz Plümer - Diskrete Mathematik II - SS 2000 - Vorlesung 4 - 04.05.00 35 Schönen Dank für Ihre Aufmerksamkeit und Auf Wiedersehen