Was bisher geschah I Motivation, Beispiele I maschinelle Repräsentation geometrischer Objekte im Punkt, Gerade, Halbebene, Strecke, Polygon, ebene Zerlegung in Regionen (planare Graphen) I 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 (Suchstruktur) I Voronoi-Diagramme, Delone-Triangulierungen R R R2 161 Konvexe Hülle im R3 Anwendung z.B. I zur Kollisionserkennung I in Computergraphik I Konvexe Hülle von n Punkten hat höchstens n Ecken. Jedes konvexe Polyeder im 3 mit n Ecken hat I R I I höchstens 3n − 6 Kanten und höchstens 2n − 4 Flächen. Beobachtung: Menge der Kanten jedes konvexen Polyeders P ⊆ planarer Graph R3 ist ein 162 Repräsentation der konvexen Hülle im R3 Menge der Kanten jedes konvexen Polyeders P ⊆ planarer Graph. R3 ist ein Repräsentation als doppelt verkettete Kantenliste (mit Ecken v ∈ 3 ) R Aufgabe conv-3d: gegeben: endliche Punktmenge P = {p1 , . . . , pn } ⊆ 3 gesucht: conv(P), repräsentiert als doppelt verkettete Kantenliste R Vereinbarung: Kantenfolge entlang der Flächen entegegen Uhrzeigersinn (von außerhalb des Polygons gesehen) 163 Berechnung der konvexen Hülle Idee: randomisierter Algorithmus I Beginn: Auswahl von P 0 = {p1 , . . . , p4 } ⊆ P, die nicht in einer Ebene liegen, konvexe Hülle conv(P 0 ) ist Tetraeder I restliche Punkte q ∈ P in zufälliger Reihenfolge zu P 0 hinzufügen: mögliche Fälle 1. q ∈ conv(P 0 ): conv(P 0 ∪ {q}) = conv(P 0 ) 2. q ∈ 6 conv(P 0 ): von q sichtbare Flächen aus conv(P 0 ) entfernen und für jede Kante uv auf dem Horizont Dreieck (u, v , q) zu conv(P 0 ) hinzufügen 164 Sichtbarkeit von Punkten gegeben: R konvexes Polygon P ⊆ 3 (als doppelt verkettete Kantenliste), Punkt q ∈ 3 R Fläche f in P ist von q (von außen) sichtbar gdw. q 6∈ h(f ) (Halbraum mit f in Grenzebene) Beobachtung: von Punkten innerhalb des Polygons ist keine Polygonfläche sichtbar von q sichtbarer Bereich von P: I = Menge aller von q sichtbaren Flächen in P I ist zusammenhängender Bereich in P (dualer Graph zusammenhängend) Horizont von P bzgl. q: äußere Begrenzung des von q sichtbaren Bereiches in P (geschlossener Kantenzug) 165 Bestimmung der sichtbaren Flächen naiv: I jede Fläche testen (O(|F |), für n Punkte O(n)) I Gesamtlaufzeit zur Bestimmung der konvexen Hülle: O(n2 ) bessere Idee: Verwaltung von Zusatzinformation zur (bisher berechneten) konvexen Hülle conv(P 0 ) mit P 0 ⊆ P Konfliktmengen: I zu jeder Fläche f ∈ conv(P 0 ) PC0 (f ) = {q ∈ P \ P 0 | f von q sichtbar} I zu jeder Ecke q ∈ P \ P 0 FC (q) = {f ∈ conv(P 0 ) | f von q sichtbar} 166 Konflikt-Graph gegeben: R endliche Punktmenge P = {p1 , . . . , pn } ⊆ 3 , P 0 ⊆ P, conv(P 0 ) als doppelt verkettete Kantenliste Konfliktgraph für conv(P 0 ): bipartiter Graph G = (Vp ∪ Vf , E) mit I Vp = P \ P 0 I Vf = {f | f ∈ conv(P 0 )} I Kanten E ∈ Vp × Vf mit (p, f ) ∈ E gdw. f von p sichtbar 167 Verwaltung des Konflikt-Graphen I zu Beginn des Algorithmus: |P 0 | = 4, conv(P 0 ) Tetraeder für jeden Punkt q ∈ P \ P 0 und jede der 4 Tetraeder-Flächen Sichtbarkeit bestimmen I Aktualisierung bei neu hinzukommendem Punkt q ∈ P \ P 0 : 1. q und alle Nachbarn von q aus G entfernen (von q sichtbare Flächen) 2. Knoten für neu erzeugte Flächen f 0 zu G hinzufügen (Dreiecke f 0 = (q, u, v ) zwischen q und Horizontkante (u, v ) aus conv(P 0 )) 3. Sichtbarkeit für Punkte r ∈ P \ (P 0 ∪ {q}) und jede neue Fläche f 0 = (q, u, v ) feststellen, ggf. Konfliktkante (r , f 0 ) in G einfügen (wichtige) Beobachtung: neue Fläche f 0 höchstens von den Punkten r ∈ P \ (P 0 ∪ {q}) sichtbar, die wenigstens eine der an der Kante (u, v ) benachbarten Flächen f1 , f2 sehen (nur Punkte r ∈ Gp (f1 ) ∪ GP (f2 )) Spezialfall: Dreieck f 0 = (q, u, v ) in derselben Ebene wie eine (nicht sichtbare) Fläche f aus conv(P 0 ) 168 Algorithmus Algorithmus : conv-3d R Eingabe : P ⊆ 3 endlich Ausgabe : C = conv(P) als doppelt verkettete Kantenliste P ← P \ P 0 , C ← conv(P 0 ) (für P 0 = {p1 , p2 , p3 , p4 } ⊆ P beliebig, aber nicht in einer Ebene) Initialisierung Konfliktgraph G solange P 6= ∅ : Auswahl q ∈ P (beliebig), P ← P \ {q} wenn GF (q) 6= ∅ (Konflikte exisitieren) dann C 0 ← C, C ← C \ GF (q) (sichtbare Flächen aus C entfernen) H ← Horizont (als Liste von Kanten) für jedes e ∈ H : f ← Dreieck(q, e), C ← C ∪ f (Fläche hinzufügen) (f1 , f2 ) ← Flächen in C 0 mit gemeinsamer Kante e K ← GP (f1 ) ∪ GP (f2 ) (potentielle Konfliktpunkte mit f ) für jedes r ∈ K \ {q} : wenn r sieht f dann G ← G ∪ Kante (r , f ) G ← G \ q, G ← G \ GF (q) (Konfliktflächen aus G entfernen) 169 Schnitte von Halbräumen und -ebenen Dualität: Paar (a, b) ∈ R2 repräsentiert I Punkt mit den Koordinaten (a, b) I Gerade y = ax − b R zu Punkt p = (px , py ) ∈ 2 duale Gerade: zu Gerade l : y = mx + n dualer Punkt: p∗ : y = px x − py l ∗ = (m, −n) Beobachtungen: R2 : p ∈ l gdw. l ∗ ∈ p∗ I ∀p, l ∈ R2 : p oberhalb von l gdw. l ∗ oberhalb von p ∗ I ∀p, l ∈ I Punkte p in oberer (unterer) konvexer Hülle von P gdw. min (max) über alle p∗ enthält ein Teil der Gerade p∗ 170 Lifting auf Einheits-Paraboloid R Einheits-Paraboloid in 3 : n U = (x, y , z) ∈ Lifiting: Projektion l : 2 → Einheitsparaboloid: R R 3 2 |z =x +y 2 o R3 von Punkten p ∈ R2 auf ∀p = (px , py ) ∈ R2 : l(p) = (px , py , px2 + py2) für gegebene Punktmenge p ∈ R2: R3 I Punktmenge l(P) = {l(p) | p ∈ P} ⊆ I konvexe Hülle conv(l(P)) ⊆ I Projektion (der Kanten) der konvexen Hülle auf Delone-Zerlegung von P (im 2 ) R3 R R2: 171 Tangentialebenen an U R euklidischer Abstand zwischen Punkten p, q ∈ 2 : q d(p, q) = (px − qx )2 + (py − qy )2 (d(p, q))2 = (px − qx )2 + (py − qy )2 R R Tangentialebene h : 2 → an Einheits-Paraboloid U im Punkt l(p): h(p) = 2px x + 2py y − (px2 + py2 ) Höhe der Tangentialebene h(p) in beliebigem Punkt q ∈ R2: h(p)(q) = 2px qx + 2py qy − (px2 + py2 ) l(q) = qx2 + qy2 l(q) − h(p)(q) = (qx2 + qy2 ) + (px2 + py2 ) − 2px qx − 2py qy = (d(x, y ))2 172 Voronoi-Diagramm I Höhe der Tangentialebene h(p) in q repräsentiert (zusammen mit l(q)) den Abstand zwischen p und q I Tangentialebenen h(p), h(q) schneiden sich in Punkten (rx , ry , . . .) mit d(r , p) = d(r , q) (Voronoi-Kanten) Für jede Punktmenge P ⊆ R2 : H(P) = {h(p) | p ∈ P} E(H) = max h h∈H Projektion der Schnitte (Strecken) der in E benachbarten Ebenen auf die Ebene z = 0: Voronoi-Diagramm von P R Berechnung von Voronoi-Diagrammen im 2 durch Berechnung konvexer Hüllen im 3 möglich R 173 Höher-dimensionale konvexe Hüllen Einheits-Paraboloid in ( U= Rd+1: (x1 , . . . , xd+1 ) ∈ R d+1 d X | xd+1 = ) x 2 i=1 Lifiting: Projektion l : durch ∀x ∈ Rd → Rd+1 von Punkten auf Einheitsparaboloid Rd : l(x) = l(x1, . . . , xd ) = (x1, . . . , xd , d X x 2) i=1 für gegebene Punktmenge p ∈ Rd : Rd+1 I Punktmenge l(P) = {l(p) | p ∈ P} ⊆ I konvexe Hülle conv(l(P)) I Delone-Zerlegung für P: Projektion der (unteren) konvexen Hülle auf I Voronoi-Diagramm für P: Projektion der Schnitte der Tangentialräume Rd 174 Kantenanzahl in konvexen Hüllen Anzahl der Kanten der konvexen Hülle von P ⊆ Rd mit |P| = n: d = 1: ≤ 2, O(1) d = 2: ≤ n, O(n) d = 3: ≤ 3n − 6, d > 3: (Upper bound theorem) O(n) O(nbd/2c ) 175