Vorlesung Algorithmische Geometrie Polygone triangulieren INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK Martin Nöllenburg 03.05.2012
Das Kunstgalerie-Problem Aufgabe: Installiere ein Kamerasystem zur Überwachung einer Kunstgalerie, so dass jede Stelle der Galerie gesehen wird. 7 X P Annahme: Beobachtung: Definition: Ziel: Galerie ist ein einfaches Polygon P mit n Ecken (keine Schnitte, keine Löcher) jede Kamera sieht sternförmiges Gebiet Punkt p 2 P ist sichtbar on c 2 P wenn cp 2 P Nutze möglichst wenige Kameras! NP-schwer!! Anzahl hängt on der Komplexität n und der Form on P ab
Vereinfachung des Problems Beobachtung: Idee: Dreiecke sind leicht zu überwachen zerlege P in Dreiecke und überwache die Dreiecke Satz 1: Jedes einfache Polygon mit n Ecken besitzt eine Triangulierung; jede Triangulierung besteht aus n 2 Dreiecken. Beweis liefert rekursien O(n 2 )-Algorithmus!
Vereinfachung des Problems Beobachtung: Dreiecke sind leicht zu überwachen Idee: zerlege P in Dreiecke und überwache die Dreiecke Satz 1: Jedes einfache Polygon mit n Ecken besitzt eine Triangulierung; jede Triangulierung besteht aus n 2 Dreiecken. P lässt sich mit n 2 Kameras in den Dreiecken überwachen P lässt sich mit n/2 Kameras auf den Diagonalen überwachen P lässt sich mit noch weniger Kameras auf den Ecken überwachen
Das Art-Gallery-Theorem [Chátal 75] Satz 2:Für ein einfaches Polygon P mit n Ecken sind manchmal bn/3c Kameras nötig, aber immer ausreichend um P zu überwachen. Beweis: Finde einfaches Polygon für beliebiges n, das n/3 Kameras braucht! Teil 2 an der Tafel. 7 X Fazit: Hat man eine Triangulierung, lassen sich bn/3c Kameras in O(n) Zeit platzieren.
Triangulierung: Überblick Dreistufiges Verfahren: Schritt 1: Zerlege P in y-monotone Teilpolygone Definition: Ein Polygon P ist y-monoton, falls der Schnitt ` \ P für jede horizontale Gerade ` zusammenhängend ist. ` X 7 Schritt 2: Trianguliere y-monotone Teilpolygone Schritt 3: benutze DFS um Triangulierung zu färben
Zerlegen in y-monotone Teile Idee: Unterscheide fünf erschiedene Knotenarten Wendeknoten: ertikale Laufrichtung wechselt Startknoten falls <180 Splitknoten falls >180 Endknoten falls <180 Mergeknoten falls >180 reguläre Knoten
Charakterisierung Lemma 1: Ein Polygon ist y-monoton, wenn es keine Splitoder Mergeknoten besitzt. Beweis: an der Tafel ) Wir müssen alle Split- und Mergeknoten durch Einfügen on Diagonalen entfernen Vorsicht: Diagonalen dürfen weder Kanten on P noch andere Diagonalen schneiden
In Richtung Sweep-Line-Algorithmus 1) Diagonalen für Splitknoten betrachte für jeden Knoten linke Nachbarkante left() bzgl. horizontaler sweep line ` left() erbinde Splitknoten zu niedrigstem Knoten w oberhalb mit left(w) =left() w speichere für jede Kante e den untersten Knoten w mit left(w) =e als helper(e) tri t ` auf Splitknoten : erbinde mit helper(left()) ` e helper(e)
In Richtung Sweep-Line-Algorithmus 2) Diagonalen für Mergeknoten erreicht man Mergeknoten wird helper(left()) = ` 0 erreicht man Splitknoten 0 mit left( 0 )=left() wird Diagonale (, 0 ) eingefügt ersetzt man helper(left()) durch 0 wird Diagonale (, 0 ) eingefügt ` 0 erreicht man das Ende 0 on left() wird Diagonale (, 0 ) eingefügt 0 `
Algorithmus MakeMonotone(P) MakeMonotone(Polygon P ) D doppelt-erkettete Kantenliste für (V (P ),E(P)) Q priority queue für V (P ) lexikographisch sortiert T ; (binärer Suchbaum für Sweep-Line Status) while Q6= ; do Q.nextVertex() Q.deleteVertex() handlevertex() return D handlestartvertex(ertex ) T füge linke Kante e ein helper(e) e = helper(e) e handleendvertex(ertex ) e linke Kante if ismergevertex(helper(e)) then D füge (helper(e),) ein lösche e aus T helper(e)
Algorithmus MakeMonotone(P) MakeMonotone(Polygon P ) D doppelt-erkettete Kantenliste für (V (P ),E(P)) Q priority queue für V (P ) lexikographisch sortiert T ; (binärer Suchbaum für Sweep-Line Status) while Q6= ; do Q.nextVertex() Q.deleteVertex() handlevertex() return D handlesplitvertex(ertex ) e Kante links on in T D füge (helper(e),) ein helper(e) T füge rechte Kante e 0 on ein helper(e 0 ) e e 0 helper(e)
Algorithmus MakeMonotone(P) MakeMonotone(Polygon P ) D doppelt-erkettete Kantenliste für (V (P ),E(P)) Q priority queue für V (P ) lexikographisch sortiert T ; (binärer Suchbaum für Sweep-Line Status) while Q6= ; do Q.nextVertex() Q.deleteVertex() handlemergevertex(ertex ) handlevertex() e rechte Kante return D if ismergevertex(helper(e)) then D füge (helper(e),) ein helper(e 0 ) lösche e aus T e helper(e) e 0 Kante links on in T if ismergevertex(helper(e 0 )) then D füge (helper(e 0 ),) ein e 0 helper(e 0 )
Algorithmus MakeMonotone(P) MakeMonotone(Polygon P ) D doppelt-erkettete Kantenliste für (V (P ),E(P)) Q priority queue für V (P ) lexikographisch sortiert T ; (binärer Suchbaum für Sweep-Line Status) while Q6= ; do handleregularvertex(ertex ) Q.nextVertex() Q.deleteVertex() if P liegt lokal rechts on then handlevertex() e, e 0 obere, untere Kante if ismergevertex(helper(e)) then return D D füge (helper(e),)ein e e 0 helper(e) helper(e) e lösche e aus T T füge e 0 ein; helper(e 0 ) else e Kante links on in T if ismergevertex(helper(e)) then D füge (helper(e),)ein helper(e)
Analyse Lemma 2: Algorithmus MakeMonotone fügt eine Menge on kreuzungsfreien Diagonalen in P ein, die P in y-monotone Teilpolygone zerlegen. Satz 3: Ein einfaches Polygon mit n Knoten kann in O(n log n) Zeit und O(n) Platz in y-monotone Teilpolygone zerlegt werden. priority queue Q erzeugen: O(n) Zeit Sweep-Line Status T initialisieren: O(1) Zeit Eentbehandlung pro Eent: O(log n) Zeit Q.deleteMax: O(log n) Zeit Element aus T suchen, löschen, einfügen: O(log n) Zeit apple 2 Diagonalen in D einfügen: O(1) Zeit Platz: o ensichtlich O(n)
Triangulierung: Überblick Dreistufiges Verfahren: Schritt 1: Zerlege P in y-monotone Teilpolygone Definition: Ein Polygon P ist y-monoton, falls der Schnitt ` \ P für jede horizontale Gerade ` zusammenhängend ist. ` X X 7 Schritt 2: Trianguliere y-monotone Teilpolygone ToDo! Schritt 3: benutze DFS um Triangulierung zu färben X
Triangulieren on y-monotone Polygonen Erinnerung: linker und rechter Grenzpfad sind absteigend Ansatz: Winkel in P > 180 konka greedy, auf beiden Seiten on oben nach unten Inariante? Der besuchte, aber noch nicht triangulierte Teil on P ist trichterförmig. Kette konkaer Knoten konex genauer hinschauen: nur 1 Kette! einfacher Fall
Algorithmus TriangulateMonotonePolygon TriangulateMonotonePolygon(Polygon P als doppelt-erk. Kantenliste) erschmelze linken und rechten Pfad! absteigende Folge u 1,...,u n Stack S ;; S.push(u 1 ); S.push(u 2 ) for j 3 to n 1 do if u j und S.top() auf erschiedenen Pfaden then while not S.empty() do S.pop() if not S.empty() then zeichne (u j,) S.push(u j 1 ); S.push(u j ) u j else S.pop() while not S.empty() and u j sieht S.top() do S.pop() zeichne Diagonale (u j,) S.push(); S.push(u j ) erbinde u n zu allen Knoten in S (außer erstem und letztem) u j u j 1
Zusammenfassung Satz 4: Ein y-monotones Polygon mit n Knoten lässt sich in O(n) Zeit triangulieren. Satz 3: Ein einfaches Polygon mit n Knoten kann in (alt) O(n log n) Zeit und O(n) Platz in y-monotone Teilpolygone zerlegt werden. + Satz 5: Ein einfaches Polygon mit n Knoten kann in O(n log n) Zeit und O(n) Platz trianguliert werden.
Triangulierung: Überblick Dreistufiges Verfahren: Schritt 1: Zerlege P in y-monotone Teilpolygone X Definition: Ein Polygon P ist y-monoton, falls der Schnitt ` \ P für jede horizontale Gerade ` zusammenhängend ist. ` X 7 Schritt 2: Trianguliere y-monotone Teilpolygone Schritt 3: benutze DFS um Triangulierung zu färben X X
Diskussion Lässt sich der Triangulierungs-Algorithmus auch auf Polygone mit Löchern erweitern? Triangulierung: ja Aber reichen weiterhin bn/3c Kameras aus? Nein, eine Verallgemeinerung des Art-Gallery-Theorems besagt, dass manchmal b(n + h)/3c Kameras nötig, aber immer ausreichend sind, wobei h die Anzahl der Löcher ist. [Ho mann et al., 91] Geht es für allgemeine einfache Polygone noch schneller? Ja. Nachdem das Problem lange o en war, und Ende der 1980er Jahre nach und nach schnellere (z.t. randomisierte) Algorithmen orgestelt wurden, beschrieb Chazelle [1990] einen (komplizierten) deterministischen Linearzeit-Algorithmus.