Ü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