Was bisher geschah I I I Motivation, Beispiele maschinelle Repräsentation geometrischer Objekte im und : Punkt, Gerade, Halbebene, Strecke, Polygon, ebene Zerlegung in Regionen (planare Graphen) spezielle Datenstrukturen zur (mehrfachen) effizienten Suche R2 Algorithmen zur I Bestimmung der konvexe Hülle endlicher Punktmengen P⊆ 2 I Bestimmung aller Schnittpunkte einer endlichen Menge 2 2 von Strecken S ⊆ I Bestimmung von Triangulierungen von Polygonen P ⊆ I Punktsuche in Regionen R R R2 1. Konstruktion der Suchstruktur (einmal) 2. Punktsuche darin (mehrmals) 125 Motivation Post Office Problem: Bestimmung der Einzugsgebiete (Anzahl potentieller Kunden) aller Postämter in einem Gebiet vereinfachende Annahmen: I Jedes Postamt bietet dieselben Leistungen (zum selben Preis). I Kunden besuchen immer das (in Luftlinie) nächstgelegene Postamt. I Die Bevölkerungsdichte ist überall gleich. Modellierung der Aufgabe: gegeben: endliche Menge von Punkten P = {p1 , . . . , pn } ⊆ 2 gesucht: Zerlegung der Ebene 2 in Gebiete (Punktmengen) mit gemeinsamem nächsten Punkt pi ∈ P R R 126 Wiederholung: Abstand zwischen Punkten Abstandsfunktion: Funktion d : d × d → mit allen folgenden Eigenschaften d : d(x, y ) = 0 gdw. x = y I ∀x, y ∈ d : d(x, y ) = d(y , x) (kommutativ) I ∀x, y ∈ d : d(x, y ) + d(y , z) ≥ d(x, z) I ∀x, y , z ∈ (Dreiecksungleichung) prominente Abstandsfunktionen: für alle x = (x1 , . . . , xd ) ∈ d , y = (y1 , . . . , yd ) ∈ d : v u d uX k (xi − yi )k dk (x, y ) = t R R R R R R R R i=1 I I I d2 (x, y ) = qP d i=1 (xi Pd − yi )2 d1 (x, y ) = i=1 |xi − yi | d∞ (x, y ) = max {|xi − yi | | i ∈ {1, . . . , d}} (euklidisch) (Manhattan) (Maximum) 127 Voronoi-Zellen R gegeben: endliche Menge P = {p1 , . . . , pn } ⊆ 2 gesucht: Menge Q ⊆ 2 mit ∀q ∈ Q : d(q, pi ) ≤ min{d(q, p) | p ∈ P} Beobachtungen: R R I zwei verschiedene Punkte: P = {p1 , p2 } ∈ 2 : pi ∈ P ist nächster Punkt zu q ∈ 2 gdw. d(q, p1 ) < d(q, p2 ) I zwei verschiedene Punkte p1 , p2 ∈ Halbebenen R R2 teilen R2 in zwei R2 | d(q, p1) < d(q, p2)} h(p2 , p1 ) = {q ∈ R2 | d(q, p2 ) < d(q, p1 )} Trenngerade g(p1 , p2 ) = {q ∈ R2 | d(q, p1 ) = d(q, p2 )} h(p1 , p2 ) = {q ∈ (Mittelsenkrechte zu p1 p2 ) I Menge aller zu einem Punkt pi ∈ P nächsten Punkte \ vor(P, pi ) = h(p1 , pj ) pj ∈P pi 6=pj Voronoi-Zelle des Punktes pi ∈ P immer Schnitt endlich vieler Halbebenen, also konvexes Polyon (evtl. unbeschränkt) 128 Voronoi-Diagramme R gegeben: endliche Menge P = {p1 , . . . , pn } ⊆ 2 gesucht: Karte M im 2 (planarer Graph) Voronoi-Zelle von pi ∈ P in P: vor(P, pi ) = q ∈ 2 | d(q, pi ) ≤ min{d(q, p) | p ∈ P} \ = h(p1 , pj ) R R pj ∈P pi 6=pj Voronoi-Diagramm vor(P) von P: Menge aller Voronoi-Zellen, Zerlegung des 2 (repräsentiert durch planaren Graphen) R I Voronoi-Kante d(q, pi ) = d(q, pi )∧ 2 q∈ | ∃pi , pj ∈ P : ∀pk 6∈ {pi , pj } : d(q, pi ) < d(q, pk ) R I Voronoi-Ecke d(q, pi ) = d(q, pi ) = d(q, pk )∧ q ∈ 2 | ∃pi , pj , pk ∈ P : ∀pk 6∈ {pi , pj , pk } : d(q, pi ) < d(q, pk ) R 129 Voronoi-Diagramme – Beispiele I zwei Punkte P = {p1 , p2 }: vor(P) Gerade (Mittelsenkrechte auf p1 p2 ) I alle pi ∈ P kollinear: vor(P) Menge von Geraden I drei nicht-kollineare Punkte P = {p1 , p2 , p3 }: vor(P) enthält drei unbeschränkte Polygone (begrenzt durch je zwei Halbgeraden) I alle pi ∈ P auf einem Kreis: vor(P) Menge von Halbgeraden vom Mittelpunkt des Kreises (Winkelhalbierende zwischen benachbarten Punkten) I vier nicht-kollineare Punkte P = {p1 , p2 , p3 , p4 } 130 Anzahlen in Voronoi-Diagrammen R gegeben: endliche Menge P = {p1 , . . . , pn } ⊆ 2 gesucht: Voronoi-Diagramm vor(P) (als planarer Graph (V , E)) Voronoi-Zelle vor(P, pi ): Anzahl der Ecken ≤ n − 1 Kanten ≤ n − 1 Voronoi-Diagramm vor(P): Anzahl der P Ecken ≤ pi ∈P (n − 1) (∈ O(n2 )) P Kanten ≤ pi ∈P (n − 1) (∈ O(n2 )) Flächen = n (eine für jeden Punkt pi ∈ P) bessere Abschätzungen: Satz Für jede endliche Menge P = {p1 , . . . , pn } ⊆ existieren in vor(P) I höchstens 2n − 5 Kanten und I höchstens 3n − 6 Ecken. R2 mit n ≥ 3 131 Berechnung des Voronoi-Diagrammes gegeben: gesucht: endliche Menge P = {p1 , . . . , pn } ⊆ Voronoi-Diagramm vor(P) = (V , E) R2 naiver Algorithmus: Für jeden Punkt pi ∈ P Voronoi-Zelle vor(P, pi ) berechnen: Schnitt aller Halbebenen h(pi , pj ) für j 6= i (Laufzeit je Punkt O(n log n), siehe folgende Folien) Laufzeit zur Berechnung des Voronoi-Diagrammes: O(n2 log n) 132 Schnitte von Halbebenen Halbebene h = {(x, y ) ∈ wobei a 6= 0 oder b 6= 0 I R2 | ax + by + c ≤ 0}, gegeben: endliche Menge H = {(a1 , b1 , c1 ), . . . , (an , bn , cn )} ⊆ 3 von Halbebenen hi = {(x, y ) ∈ 2 | ai x + bi y + ci ≤ 0} R I R gesucht: T Polygon P = ni=1 hi (konvex) Idee: Divide-and-Conquer-Verfahren 133 Divide-and-Conquer-Verfahren I Zerlegen der Aufgabe in (etwa gleichgroße) Teilaufgaben (top-down) I rekursive Lösung der Teilaufgaben I Lösungsverfahren für elementare Teilaufgaben (Basisfall, Induktionsanfang) I Zusammenfügen der Lösungen der Teilaufgaben zu einer Lösung der Gesamtaufgabe (bottom-up) Beispiel: Mergesort Laufzeit-Berechnung durch Lösen der Rekurrenz (hier für zwei Teilaufgaben) T (Basisfall) , falls n = 1 T (n) = T (Teilen) + 2T (n/2) + T (Zusammenfügen) , falls n > 1 134 Berechnung von Halbebenen-Schnitten Eingabe: Menge von Halbebenen H = {h1 , . . . , hn } ⊆ R3 Divide-and-Conquer-Algorithmus: I Zerlegen der Aufgabe in Teilaufgaben: H1 = {h1 , . . . , hbn/2c } und H2 = {hbn/2c+1 , . . . hn } I rekursive Lösung der Teilaufgaben I Lösungsverfahren für elementare Teilaufgaben (Induktionsanfang) für |H| = 1: P = H I Zusammenfügen der Lösungen der Teilaufgaben: Bestimmung des Schnittes zweier konvexer Polygone (CPI) 135 Algorithmus HPI zur Berechnung des Schnittes endlich vieler Halbebenen Algorithmus : HPI R 3 (Halbebenen) Eingabe : H = {h T1n, . . . , hn } ⊆ Ausgabe : P = i=1 hi (konvexes Polygon) wenn |H| = 1 dann P←H sonst H1 ← {h1 , . . . , hbn/2c } (Aufgabe teilen) H2 ← {hbn/2c+1 , . . . hn } P1 ← HPI(H1 ) (Teilaufgaben lösen) P2 ← HPI(H2 ) P ← CPI(P1 , P2 ) (Teillösungen zusammenfügen) 136 Repräsentation konvexer Polygone konvexes Polygon P = Tn i=1 hi repräsentiert durch: I rechte und linke Begrenzung L(P), R(P) I L(P), R(P) geordnete Liste von Halbebenen (a, b, c) ∈ R2 Annahme: keine horizontalen Kanten 137 Schnitte konvexer Polygone gegeben: gesucht: konvexe Polygone P1 , P2 , als Paare (L(P1 ), R(P1 )) und (L(P2 ), R(P2 )) geordneter Listen von Halbebenen konvexes Polygon P = P1 ∩ P2 als (L(P), R(P)) Idee: Sweep-line-Algorithmus Zustand : ≤ 4 (Verweise auf) Kanten l1 , r1 , l2 , r2 aus L(P1 ), R(P1 ), L(P2 ), R(P2 ), welche die aktuelle Sweep-line schneiden (je mit Verweis h(e) auf die Halbebene, auf deren Grenze die Kante e liegt) Ereignisse : alle Ecken beider Polygone nächstes Ereignis lässt sich einfach bestimmen: Maximum der y -Koordinaten aller unteren Endpunkte der Strecken im Zustand (keine spezielle Datenstruktur zur Verwaltung der Ereignisse nötig) 138 Ereignisbehandlung für jedes Ereignis p: Ereignisbehandlung abhängig von Zuordnung zu I Polygon (P1 oder P2 ) I Seite (L oder R) Beispiel-Fall (andere Fälle analog): p ist oberer Endpunkt einer Kante e aus L(P1 ) p kommt als Ecke in P vor, wenn 1. p innerhalb P2 und e schneidet keine Kante von P2 , 2. e schneidet eine Kante aus l2 , 3. e schneidet eine Kante aus r2 139 Ereignisbehandlung Ereignis p (oberer Endpunkt einer Kante e aus L(P1 )): I falls p ∈ P2 , d.h. zwischen l2 und r2 : L(P) ← L(P) ∪ {h(e)}, (Teil von) e ist Begrenzung von P I falls e schneidet r2 : Schnittpunkt von e und r2 ist Ecke in P I I I falls p rechts von r2 (Schnittpunkt oberer Punkt in P): L(P) ← L(P) ∪ {h(e)}, R(P) ← R(P) ∪ {h(r2 )}, falls p links von r2 (Schnittpunkt unterer Punkt in P): h(e) und h(r2 ) schon in P falls e schneidet l2 : Schnittpunkt von e und l2 ist Ecke in P I I falls p rechts von l2 : L(P) ← L(P) ∪ {h(l2 )} falls p links von r2 : L(P) ← L(P) ∪ {h(e)} 140 Laufzeiten Laufzeit I der Ereignisbehandlung in CPI jeweils in O(1) I des Algorithmus CPI zum Schnitt konvexer Polygone O(n) des Divide-and-Conquer-Algorithmus HPI zum Schnitt endlich vieler Halbebenen I I I elementare Teilaufgabe (|H| = 1): O(1) rekursiver Fall: I I Teilen: O(1) Zusammenfügen (CPI): O(n) T (HPI, n) ∈ O(1) , falls n = 1 O(1) + 2T (HPI, n/2) + O(n) , falls n > 1 Lösung der Rekurrenz ergibt T (HPI, n) ∈ O(n log n) I des (naiven) Algorithmus zur Berechnung des Voronoi-Diagrammes: O(n2 log n) 141 Leere Kreise gegeben: Voronoi-Diagramm vor(P) (als planarer Graph (V , E)) Ecke q ∈ V größter leerer Kreis um q ∈ C(P, q) = {s ∈ R2 in P = {p1, . . . , pn } R2 | d(q, s) ≤ min{d(q, pi ) | pi ∈ P}} Satz Für jede endliche Menge P = {p1 , . . . , pn } ⊆ vor(P) = (V , E): R2 gilt in R I ∀q ∈ 2 : q ∈ V (Voronoi-Ecke) gdw. |C(P, q) ∩ P| ≥ 3 I ∀(pi , pj ) ∈ P 2 : Mittelsenkrechte (pi , pj ) enthält Voronoi-Kante gdw. ∃q ∈ M(pi , pj ) : C(P, q) ∩ P = {pi , pj } 142 Sweep-line-Algorithmus gegeben: gesucht: endliche Menge P = {p1 , . . . , pn } ⊆ Voronoi-Diagramm vor(P) = (V , E) R2 Idee: I Ereignisse: alle Punkte aus P geordnet nach fallender y -Koordinate I Zustand: alle Schnittpunkte des Voronoi-Diagramms (Kanten) mit Sweep-line Problem: I Grenzen zwischen Voronoi-Zellen hängen auch von Punkten pi noch unterhalb der Sweep-line ab I Es gibt also Punkte oberhalb der Sweep-line, deren Zuordnung zu Voronoi-Zellen noch nicht bekannt ist. 143 Partielles Voronoi-Diagramm Welcher Teil des Voronoi-Diagrammes ist bekannt (kann sich durch Punkte unterhalb der Sweep-line nicht mehr ändern), nachdem die Sweep-line einen Punkt pi ∈ P erreicht hat? R2 | qy = piy } I Abstand eines Punktes q ∈ R2 oberhalb der Sweep-line I Sweep-line bei pi : l = {q ∈ zur Sweep-line l: d(q, l) = qy − piy R I Für Punkte q ∈ oberhalb der Sweep-line mit ∃pj ∈ P : d(q, pj ) < d(q, l) = qy − piy ändert sich die Zuordnung nicht mehr. I Grenze zwischen {q ∈ 2 | d(q, pj ) < qy − piy } (wenn Sweep-line bei pi ) ist eine (nach oben geöffnete) Parabel, Funktion (x − pjx )2 (pjy + piy ) f (x) = + 2(pjy − piy ) 2 R 144 Küste R I Grenze zwischen {q ∈ 2 | min{d(q, pj ) | pj ∈ P} < qy − piy } ist das Minimum einer endlichen Menge von (nach oben geöffneten) Parabeln (Küste) (pjy + piy ) (x − pjx )2 + | pj ∈ P f (x) = min 2(pjy − piy ) 2 I Schnittpunkte der Parabeln liegen immer auf Voronoi-Kanten (Warum ?) I Punkt pi ∈ P auf der Sweepline gdw. neue (entartete) Parabel entsteht I Küste kann mehrere Teile derselben Parabel enthalten (z.B. nach Entstehung einer neuen Parabel) I Parabeln verschwinden (Nachbar-Parabeln verschmelzen) genau in Schnittpunkten von Voronoi-Kanten, also in Voronoi-Ecken Idee: Zustand = Repräsentation der Küste 145 Ereignisse Entstehen neuer Parabeln Punkt-Ereignis pi ∈ P Verschwinden von Parabeln (Entdeckung von Voronoi-Ecken) Kreis-Ereignis v ∈ V Problem: Voronoi-Ecken befinden sich bei Ihrer Entdeckung auf der Küste, also oberhalb der Sweep-line Beobachtung: Bei der Entdeckung einer Voronoi-Ecke r ist die Sweep-Line Tangente an den größten leeren Kreis CP (r ) für die Voronoi-Ecke r mit |CP (r ) ∩ P| ≥ 3 146 Sweep-line-Algorithmus – Idee Ereignisse : geordnet nach fallender y -Koordinate I alle Punkte aus P (zu Beginn bekannt) I alle Voronoi-Ecken (zu Beginn unbekannt) Zustand : Küste als Menge von Parabel-Teilen 147 Repräsentation des Voronoi-Diagrams R Zerlegung des 2 : doppelt verkettete Kantenliste mit Halbkanten : Anfangspunkt, next, prev Ecken : geordnete Liste der inzidenten Kanten Flächen : Verweis auf eine (Innen-)Kante Problem: unbeschränkte Flächen Lösung: bounding box um P 148 Datenstruktur für Ereignismenge Ereignismenge Q: priority queue mit y -Koordinate als Priorität von zwei Typen von Ereignissen: Punkt : Punkt pi ∈ R2 Kreis : I I Berührungspunkt der Sweep-line mit dem Kreis durch die Punkte pi , pj , pk ∈ P oberhalb der Sweep-line Verweis auf verschwindende Parabel (Blatt) 149 Datenstruktur für Zustand Zustand: balancierter Suchbaum I Blätter: (aktive) Parabelteile um Punkte aus P oberhalb der Sweep-line I I I pi ∈ P definierender Punkt der Parabel Verweis auf (Kreis-)Ereignis in Q, an welchem die Parabel verschwindet (zunächst nil) innere Knoten: Schnittpunkte der benachbarten Parabelteile I I Punkte pi , pj ∈ P 2 , die die benachbarten Parabelteile definieren Verweis auf eine der Halbkanten der Zerlegung, die den Schnittpunkt der Parabelteile enthält Finden, Enfügen, Löschen in O(log n) 150 Kreis-Ereignisse Ausschnitt der Küste bei Sweep-line l bei y : drei benachbarte Parabelteile ai−1 , ai , ai+1 zu den Punkten pi , pj , pk Parabelteil ai zu pj verschwindet aus der Küste gdw. ∃r ∈ 2 : d(r , pi ) = d(r , pj ) = d(r , pk ) R wenn Parabelteil ai zu pj verschwindet, gilt I |C(P, r ) ∩ P| ≥ 3 I d(r , pj ) = d(r , l) = ry − y 151 Berechnung der Kreis-Ereignisse Kreis-Ereignis: I Position (y -Koordinate) der Sweep-line beim Zusammentreffen zweier Voronoi-Kanten in einem Punkt q oberhalb der Sweep-line I Position der Sweep-line = kleinste y -Koordinate im leeren Kreis C(P, q) I drei Punkte pi , pj , pk auf dem Kreis C(P, q) gegeben Kreis C(P, q) eindeutig bestimmt (Radius r , Mittelpunkt (qx , qy ) durch Gleichungssystem (px − qx )2 + (py − qy )2 = r 2 bestimmen) kleinste y -Koordinate im Kreis C(P, q) eindeutig bestimmt (qy − r ) 152 Kreis-Ereignisse I I Kreis-Ereignisse können höchstens an vorher benachbarten Tripeln von Parabelteilen auftreten Berechnung potentieller Kreisereignisse, wenn neue benachbarte Tripel von Parabelteilen entstehen Wann geschieht das? I I I Punkt-Ereignis zerlegt einen Parabelteil ai in zwei Teile ai0 und ai00 und fügt neues Patabelteil b dazwischen ein, ≤ 2 neue Tripel ((ai−1 , ai0 , b) und (b, ai00 , ai+1 )) zu paarweise verschiedenen Punkten aus P ≤ 2 potentielle Kreis-Ereignisse Kreis-Ereignis: Parabelteil ai verschwindet Nachbarn ai−1 und ai+1 des verschwundenen Parabelteils werden zueinander benachbart ≤ 2 neue Tripel ((ai−2 , ai−1 , ai+1 ) und (ai−1 , ai+1 , ai+2 ) ) ≤ 2 potentielle Kreis-Ereignisse nicht jedes benachbarte Tripel von Parabelteilen führt zu einem Kreis-Ereignis (falscher Alarm, wird später aus der Ereignis-Queue gelöscht) 153 Punkt-Ereignis-Behandlung Punkt-Ereignis: pi Aufgaben: I Parabelteil a oberhalb pi in Küste (Zustand) finden: I an inneren Knoten (pl , pl+1 ) Berechnung der aktuellen Parabel-Schnittpunkte notwendig I Kreis-Ereignis, auf das a verweist, löschen (falscher Alarm) I a in zwei Parabelteile a0 , a2 teilen (zwei neue Blätter) neue (entartete) Parabel a1 dazwischen (als Blatt) in Z einfügen neue innere Knoten mit Parabelpunkten einfügen, neue potentielle Kreis-Ereignisse berechnen und I I I in Ereignis-Queue einfügen, mit den Parabelteilen verknüpfen 154 Kreis-Ereignis-Behandlung Kreis-Ereignis: I y -Koordinate I Verweis auf Parabelteil (Blatt in Z ), der durch das Ereignis verschwindet I Mittelpunkt q Aufgaben: I verschwindenden Parabelteil a aus Z löschen (dabei innere Knoten aktualisieren) I alle Kreis-Ereignisse, an denen a beteiligt ist, aus Q, löschen (über Verweise von Nachbarn von a in Z ) I Kreis-Ereignisse für neu entstandene Tripel benachbarter Parabelteile bestimmen und in Q einfügen I Voronoi-Knoten q in Voronoi-Diagramm einfügen I Kante zwischen V (P, pi ) und V (P, pk ) mit Ecke q im Voronoi-Diagramm anlegen (und Verweise erstellen) 155 Algorithmus (Fortune’s Sweep) Algorithmus : Voronoi R Eingabe : P = {p1 , . . . , pm } ⊆ 2 Ausgabe : Voronoi-Diagramm D (Zerlegung, doppelt verkettete Kantenliste) D ← ∅ (Voronoi-Diagramm) Q ← ∅ (Ereignisse) Z ← ∅ (Zustand) für jedes i ← 1, . . . , n : Q ← Q ∪ {pi } solange Q 6= ∅ : e ← getmin(Q), Q ← deletemin(Q) wenn e Punkt-Ereignis dann Punkt-Ereignisbehandlung(e, Z , Q, D) sonst Kreis-Ereignisbehandlung(e, Z , Q, D) Nachbearbeitung(D) 156 Nachbearbeitung Voronoi-Diagramm nach Ende der Ereignisbehandlung noch nicht vollständig: Reststruktur Z nach Behandlung aller Ereignisse: innere Knoten repräsentieren Voronoi-Kanten mit nur einer Voronoi-Ecke (Halbgeraden) Idee: bounding box R um P I Berechnung der Schnittpunkte der Halbgeraden mit R als Endpunkte I D aktualisieren (Verweise zwischen Ecken, Kanten, Flächen) 157 Laufzeit I Anzahl der Ereignisse I I I Punkt: |P| = n Kreis: ≤ 2n − 5 insgesamt O(n) Laufzeit für Ereignis-Bearbeitung: I I Punkt: O(log n) Kreis: O(log n) Gesamt-Laufzeit: O(n log n) Speicherbedarf: O(n) (Eingabe, Ereignis-Queue, Voronoi-Diagramm) 158 Robustheit I Punkte mit gleicher y -Koordinate: Kippen der Sweep-line I Punkt- und Kreisereignis mit gleicher y -Koordinate: Kreis- vor Punktereignis bearbeiten I Kreis-Ereignisse für < 3 Punkte aus P für je drei Punkte unabhängig voneinander verwalten, führen zu Kanten der Länge 0, Voronoi-Diagramm nachträglich bereinigen (um überflüssige Voronoi-Knoten und -Kanten) I Punkt-Ereignis auf Parabel-Schnittpunkt: beliebigen der Parabelteile wählen 159 Delone-Triangulierung (auch Delaunay-Triangulierung) Delone-Graph einer endlichen Punktmenge P ∈ 2 : dualer Graph zum Voronoi-Diagramm von P Delone-Zerlegung: Einbettung des dualen Graphen in R 2 mit R I Menge P von Ecken, I Strecken als Kanten I Delone-Zerlegung ist planar (Kanten schneiden einander nicht) I kann Flächen enthalten, die keine Dreiecke sind Delone-Triangulierung: Delone-Zerlegung mit zusätzlicher (geeigneter) Triangulierung der (konvexen) Flächen, die in der Delone-Zerlegung keine Dreiecke sind Anwendung z.B. zur Interpolation von Höhenprofilen aus Messwerten 160