20. Mai 2014

Werbung
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
Herunterladen