Folien zur 3. Übung

Werbung
Übung zur Vorlesung Algorithmische Geometrie
Dipl.-Math. Jens Fangerau
Arbeitsgruppe Computergraphik und Visualisierung
Interdisziplinäres Zentrum für Wissenschaftliches Rechnen
30. Mai 2012
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
1 / 34
Überblick
Besprechung der letzten Aufgaben
Wiederholung der Datenstruktur der doppelt verknüpften
Halbkantenlisten (mit Aufgaben)
Schnittberechnung für zwei Fälle
Neue Aufgaben
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
2 / 34
Vorlesung
Die Vorlesung
Fragen?
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
3 / 34
Aufgabenbesprechung
Besprechung der letzten Aufgaben
Aufgabe 1.1
Zeigen Sie durch Angabe eines Gegenbeispiels, dass die Vereinigung von
zwei konvexen Mengen im Allgemeinen nicht konvex ist.
Zeigen Sie, dass der Schnitt von zwei konvexen Mengen wieder konvex ist.
Aufgabe 1.2
Sei P ⊆ R2 eine Menge von Punkten. Zeigen Sie durch einen
Widerspruchsbeweis, dass das Polygon P mit dem kleinsten Umfang, das
P vollständig enthält, konvex ist. Eine Skizze zum Beweis ist ausreichend.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
4 / 34
Aufgabenbesprechung
Es sei eine gerichtete Strecke von p = (px , py ) nach q = (qx , qy ) gegeben.
Weiterhin sei r = (rx , ry ) ein beliebiger Punkt.
Aufgabe 2.1
Zeigen Sie, dass das Vorzeichen der Determinante


1 px py
D = det 1 qx qy 
1 rx ry
angibt, auf welcher Seite der Strecke r liegt.
Aufgabe 2.2
Zeigen Sie, dass |D| genau das Doppelte der Fläche des von p, q, r
aufgespannten Dreiecks ist.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
5 / 34
Aufgabenbesprechung
Aufgabe 2.3
Begründen Sie, warum der in 2.1 vorgestellte Weg zur Entscheidung, auf
welcher Seite r liegt, sich besonders gut implementieren lässt.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
6 / 34
Aufgabenbesprechung
Aufgabe 3
Verwenden Sie den vorgestellten Rot-Schwarz-Baum in einem eigenen
Projekt mit dem Datentyp double. Erzeugen Sie 10 Zufallszahlen und
fügen Sie diese in den Baum ein.
Passen Sie für den Streamingoperator die Anzahl der
Nachkommastellen (5) sowie das Format (wissenschaftliche Notation)
an. Verwenden Sie hierzu Templatespezialisierung von operator<<.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
7 / 34
Doppelt verknüpfte Halbkantenlisten
Doppelt verknüpfte Halbkantenlisten (DCEL)
Wiederholung der Datenstruktur
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
8 / 34
Doppelt verknüpfte Halbkantenlisten
Um den Schnitt von planaren Unterteilungen zu berechnen, betrachtet
man diese als Einbettung von Graphen mit folgenden Eigenschaften:
Eigenschaften
Unterteilung ist zusammenhängend,
wenn der Graph zusammenhängend
ist.
Graph besteht aus Knoten, Kanten
und Facetten.
Kanten sind offen (ohne Knoten).
Facette ist eine maximal
zusammenhängende Teilmenge der
Ebene (ohne Kanten und Knoten).
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
9 / 34
Doppelt verknüpfte Halbkantenlisten
Eigenschaften
Die Komplexität einer Unterteilung ist die Summe aller existierenden
Knoten, Kanten und Facetten im Graph.
Knoten und Kante sind benachbart wenn der Knoten ein Endpunkt
der Kante ist.
Facette und Kante sind benachbart wenn die Kante zur Abgrenzung
gehört.
Facette und Knoten sind benachbart wenn der Knoten zur
Abgrenzung gehört.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
10 / 34
Doppelt verknüpfte Halbkantenlisten
Datenstruktur
Typische Operationen auf Datenstruktur
Alle Kanten gegen den Uhrzeigersinn um einen Punkt angeben.
Alle Kanten gegen den Uhrzeigersinn um eine Facette angeben.
Alle Ränder von Löchern in Facetten als Kanten im Uhrzeigersinn
angeben.
Zu einer Facette die Nachbarfacette an einer gemeinsamen Kante
angeben.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
11 / 34
Doppelt verknüpfte Halbkantenlisten
Diese Operationen werden von der doppelt verknüpften Halbkantenliste
unterstützt.
Datenstruktur
Seiten einer Kante werden als zwei
orientierte Halbkanten identifiziert mit
Ursprung und Zielpunkt.
Zwei Halbkanten derselben Kante
werden als Zwilling bezeichnet.
Für Halbkante ~e mit Ursprung v und
Zielpunkt w gilt dann:
Halbkante Twin(~e ) hat Ursprung w
und Zielpunkt v .
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
12 / 34
Doppelt verknüpfte Halbkantenlisten
Datenstruktur
Wir wollen gegen den Uhrzeigersinn
entlang der Halbkanten einer Facette
laufen, so dass die Facette immer auf
der linken Seite einer Halbkante liegt.
Für Löcher in einer Facette gehen wir
entlang der Halbkanten im
Uhrzeigersinn.
Liste speichert drei Felder für
Eckpunkte, Halbkanten und Facetten.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
13 / 34
Doppelt verknüpfte Halbkantenlisten
Speicherung von Informationen in Feldern
Knotenfeld
Speicherung der Koordinaten vom Knoten v in Coordinates(v ).
Zeiger IncidentEdge(v ) auf beliebige Halbkante mit v als Ursprung.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
14 / 34
Doppelt verknüpfte Halbkantenlisten
Kantenfeld
Zeiger Origin(~e ) auf Ursprungspunkt von
Halbkante ~e .
Zeiger Twin(~e ) auf Zwillingshalbkante.
Zeiger IncidentFace(~e ) auf Facette, die
durch Kante ~e begrenzt ist.
Origin(~e ) wird so gewählt, dass
IncidentFace(~e ) immer links von der
Halbkante ~e liegt, ausgehend vom Ursprung
bis zum Zielpunkt.
Zielpunkt ist gegeben durch Origin(Twin(~e ))
und muss nicht zusätzlich gespeichert
werden.
Zeiger Next(~e ) und Prev (~e ) zeigen auf die
nächste und vorherige Halbkante auf der
Abgrenzung von IncidentFace(~e ).
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
15 / 34
Doppelt verknüpfte Halbkantenlisten
Facettenfeld
Zeiger OuterComponent(f ) zeigt auf beliebige Halbkante am Rand
der Facette f .
OuterComponent(f ) ist NULL für unbegrenzte Facetten.
Liste von Zeigern InnerComponents(f ), die für jedes Loch in der
Facette f einen Zeiger auf eine Halbkante auf der Abgrenzung des
Loches speichert.
InnerComponents(f ) ist NULL, wenn Facette f keine Löcher hat.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
16 / 34
Doppelt verknüpfte Halbkantenlisten
1. Beispiel
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
17 / 34
Doppelt verknüpfte Halbkantenlisten
2. Beispiel
Knoten
v1
v2
v3
v4
v5
v6
Coordinates
(0, 3)
(1, 2)
(3, 2)
(3, 0)
(1, 0)
(2, 1)
IncidentEdge
...
...
...
...
...
...
J. Fangerau (CoVis)
Facette
f1
...
OuterComponent
...
...
Halbkante
~e1,1
...
Origin
v1
...
Algorithmische Geometrie
Twin
...
...
InnerComponents
...
...
IncidentFace
...
...
Next
...
...
Prev
...
...
30. Mai 2012
18 / 34
Doppelt verknüpfte Halbkantenlisten
2. Beispiel
Knoten
v1
v2
v3
v4
v5
v6
Facette
f1
f2
f3
f4
Coordinates
(0, 3)
(1, 2)
(3, 2)
(3, 0)
(1, 0)
(2, 1)
OuterComponent
nil
{~e2,2 ,~e3,2 ,~e7,1 }1
{~e6,2 ,~e7,2 ,~e8,2 }1
{~e8,1 ,~e4,2 ,~e5,2 }1
IncidentEdge
~e1,1
{~e2,1 ,~e6,1 ,~e7,1 }1
{~e2,2 ,~e3,1 }1
{~e5,1 ,~e4,2 }1
{~e5,2 ,~e8,2 ,~e6,1 }1
{~e3,2 ,~e4,1 ,~e8,1 ,~e7,2 }1
InnerComponents
{~e1,1 ,~e1,2 ,~e2,1 ,~e3,1 ,~e4,1 ,~e5,1 ,~e6,1 }1
nil
nil
nil
Halbkante
~e1,1
~e1,2
~e2,1
~e2,2
~e3,1
~e3,2
~e4,1
~e4,2
~e5,1
~e5,2
~e6,1
~e6,2
~e7,1
~e7,2
~e8,1
~e8,2
Origin
v1
v2
v2
v3
v3
v6
v6
v4
v4
v5
v5
v2
v2
v6
v6
v5
Twin
~e1,2
~e1,1
~e2,2
~e2,1
~e3,2
~e3,1
~e4,2
~e4,1
~e5,2
~e5,1
~e6,2
~e6,1
~e7,2
~e7,1
~e8,2
~e8,1
IncidentFace
f1
f1
f1
f2
f1
f2
f1
f4
f1
f4
f1
f3
f2
f3
f4
f3
Next
~e2,1
~e1,1
~e3,1
~e7,1
~e4,1
~e2,2
~e5,1
~e8,1
~e6,1
~e4,2
~e1,2
~e8,2
~e3,2
~e6,2
~e5,2
~e7,2
Prev
~e1,2
~e6,1
~e1,1
~e3,2
~e2,1
~e7,1
~e3,1
~e5,2
~e4,1
~e8,1
~e5,1
~e7,2
~e2,2
~e8,2
~e4,2
~e6,2
1
Aus der angegebenen Menge wird ein Element beliebig aber fest
ausgewählt.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
19 / 34
Doppelt verknüpfte Halbkantenlisten
Beispielfragen
1
Alle Punkte einer Facette
2
Alle Kanten einer Facette
3
Alle Facetten eines Knoten
4
Nachbarfacette zu Facette
5
Alle Nachbarknoten eines
Knoten
6
Pro Knoten alle eingehenden
Kanten
7
Pro Knoten alle ausgehenden
Kanten
8
Alle Facetten einer
Zusammenhangskomponente
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
20 / 34
Doppelt verknüpfte Halbkantenlisten
Schnitte planarer Unterteilungen
Schnitt von Kante mit Knoten/Kante
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
21 / 34
Doppelt verknüpfte Halbkantenlisten
Definition
Sind S1 und S2 zwei Unterteilungen, so bezeichnet O(S1 , S2 ) die
Überlagerung von S1 und S2 .
O(S1 , S2 ) enthält eine Facette f gdw wenn es eine Facette f1 ∈ S1 und
eine Facette f2 ∈ S2 gibt, so dass f eine maximale zusammenhängende
Teilmenge von f1 ∩ f2 ist.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
22 / 34
Doppelt verknüpfte Halbkantenlisten
Schnitt von Kante mit Knoten
Vorgehen
Sei e eine Kante in S1 und v ein Knoten aus S2 .
e muss durch zwei Kanten e 0 und e 00 ersetzt werden, d.h. wir erhalten
aus 2 vorherigen Halbkanten 4.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
23 / 34
Doppelt verknüpfte Halbkantenlisten
Vorgehen
Wir erhalten zwei neue Halbkanteneinträge, die v als Ursprung haben
während die vorherigen Halbkanten von e die Endpunkte als ihre
Ursprungspunkte erhalten.
Der Zeiger Twin() wird in der Art aktualisiert, dass jeweils immer ein
Paar von neuer und alter Halbkante zusammen gehören und somit e 0
und e 00 erzeugen.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
24 / 34
Doppelt verknüpfte Halbkantenlisten
Die Zeiger Prev () und Next() müssen auch noch aktualisiert werden:
Vorgehen an den Endpunkten von e
Der Next() Zeiger der neuen
Halbkanten kopiert jeweils den
Next() Zeiger der alten
Halbkante, die nicht ihr Zwilling
ist.
Bei den so referenzierten
Halbkanten zeigen die Prev ()
Zeiger dann auf die neuen
Halbkanten.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
25 / 34
Doppelt verknüpfte Halbkantenlisten
Vorgehen am Knoten v
Um die Situation bei v zu
klären, müssen wir berechnen,
an welcher Stelle in der
zyklischen Ordnung um v die
neuen Halbkantenpaare e 0 und
e 00 angenommen werden
müssen.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
26 / 34
Doppelt verknüpfte Halbkantenlisten
In unserem Beispiel müssen insgesamt 12 Zeiger angepasst werden.
Update
4 Twin() Zeiger für die 2 neuen und 2 alten Halbkanten.
2 Prev () Zeiger für die beiden alten Halbkanten.
2 Next() Zeiger für die beiden neuen Halbkanten.
4 Zeiger für die referenzierten Kanten aus S2 .
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
27 / 34
Doppelt verknüpfte Halbkantenlisten
Schnitt von Kante mit Kante
Vorgehen
Sei e1 eine Kante in S1 und e2 eine Kante aus S2 .
Weiterhin sei v der Schnittpunkt zwischen beiden Kanten.
Sowohl e1 als auch e2 müssen durch vier Kanten e (1) , e (2) , e (3) und
e (4) ersetzt werden, d.h. wir erhalten aus 4 vorherigen Halbkanten
nun 8.
Wir erhalten vier neue Halbkanteneinträge, die v als Ursprung haben
während die vorherigen Halbkanten von e1 und e2 jeweils die
Endpunkte als ihre Ursprungspunkte erhalten.
Der Zeiger Twin() wird in der Art aktualisiert, dass jeweils immer ein
Paar von neuer und alter Halbkante zusammen gehören und somit
e (1) , e (2) , e (3) und e (4) erzeugen.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
28 / 34
Doppelt verknüpfte Halbkantenlisten
Die Zeiger Prev () und Next() müssen wieder aktualisiert werden:
Vorgehen an den Endpunkten von e1 und e2
Der Next() Zeiger der neuen Halbkanten kopiert jeweils den Next()
Zeiger der alten Halbkante, die nicht ihr Zwilling ist.
Bei den so referenzierten Halbkanten zeigen die Prev () Zeiger dann
auf die neuen Halbkanten.
Vorgehen am Knoten v
Um die Situation bei v zu klären, müssen wir berechnen, an welcher
Stelle in der zyklischen Ordnung um v die neuen Halbkantenpaare
e (1) , e (2) , e (3) und e (4) angenommen werden müssen.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
29 / 34
Doppelt verknüpfte Halbkantenlisten
Es müssen insgesamt 16 Zeiger angepasst werden.
Update
8 Twin() Zeiger für die 4 neuen und 4 alten Halbkanten.
4 Prev () Zeiger für die beiden alten Halbkanten.
4 Next() Zeiger für die beiden neuen Halbkanten.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
30 / 34
Aufgaben
Aufgaben
Neue Hausaufgaben
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
31 / 34
Aufgaben
Aufgabe zum Schnitt von Liniensegmenten
Aufgabe 1
Sei S eine Menge von n disjunkten Liniensegmenten, deren obere
Endpunkte bei y = 1 liegen und deren untere Endpunkte bei y = 0 liegen.
Die Segmente teilen also die Menge (−∞, +∞) × [0, 1] in n + 1 Regionen
auf. Skizzieren Sie einen Algorithmus, der in O(n log n) einen Binärbaum
aufbaut, sodass die Region, in der sich ein gegebener Punkt p befindet, in
O(log n) bestimmt werden kann.
Funktioniert der Algorithmus auch für nicht disjunkte Liniensegmente?
Begründen Sie Ihre Antwort.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
32 / 34
Aufgaben
Aufgaben zur doppelt verknüpften Halbkantenliste
Aufgabe 2.1
Welche der folgenden Gleichungen sind immer wahr?
Twin(Twin(~e )) = ~e
Next(Prev (~e )) = ~e
Twin(Prev (Twin(~e ))) = Next(~e )
IncidentFace(~e ) = IncidentFace(Next(~e ))
Aufgabe 2.2
Geben Sie ein Beispiel einer doppelt verknüpften Halbkantenliste, bei der
für eine Kante ~e die Facetten IncidentFace(~e ) und IncidentFace(Twin(~e ))
gleich sind.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
33 / 34
Aufgaben
Aufgabe 2.3
Gegeben sei eine doppelt verknüpfte Halbkantenliste, in der für jede
Halbkante ~e gilt:
Twin(~e ) = Next(~e )
Wieviele Facetten kann diese Unterteilung höchstens haben?
Aufgabe 2.4
Gegeben sei eine doppelt verknüpfte Halbkantenliste einer
zusammenhängenden Unterteilung. Geben Sie einen Algorithmus in
Pseudocode an, der alle Facetten auflistet, deren Knoten auf dem äußeren
Rand liegen.
J. Fangerau (CoVis)
Algorithmische Geometrie
30. Mai 2012
34 / 34
Herunterladen