04.11.2012 Aufrufe

Algorithmische Geometrie - Vorlesungsskript

Algorithmische Geometrie - Vorlesungsskript

Algorithmische Geometrie - Vorlesungsskript

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>Algorithmische</strong> <strong>Geometrie</strong><br />

Oliver Karch<br />

Entwurf vom 4. Februar 2000<br />

Vorlesung im Wintersemester 1998/99<br />

Lehrstuhl für Informatik I


ii<br />

Dies ist das vorläufige Skript zur Vorlesung »<strong>Algorithmische</strong><br />

<strong>Geometrie</strong>« (10703) im Wintersemester<br />

1998/99. Über Kritik, Verbesserungsvorschläge<br />

oder gefundene Tippfehler würde ich<br />

mich sehr freuen!<br />

¡<br />

Oliver Karch<br />

���������������������������������


Inhaltsverzeichnis<br />

1 Einleitung 1<br />

1.1 Was ist »<strong>Algorithmische</strong> <strong>Geometrie</strong>«? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1<br />

1.2 Beispiele geometrischer Fragestellungen . . . . . . . . . . . . . . . . . . . . . . . . . . . 2<br />

1.3 Literatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />

1.4 Informationsquellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4<br />

1.5 WWW-Seiten zur Vorlesung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4<br />

2 Grundbegriffe 5<br />

2.1 Topologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />

2.1.1 Der Abstandsbegriff und innere Punkte . . . . . . . . . . . . . . . . . . . . . . . 5<br />

2.1.2 Stetigkeit, Wege und Zusammenhang . . . . . . . . . . . . . . . . . . . . . . . . 8<br />

2.2 Graphentheorie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />

2.2.1 Gerichtete Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />

2.2.2 Ungerichtete Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12<br />

2.2.3 Wege und Kreise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />

2.2.4 Geometrische Realisierungen und Planarität . . . . . . . . . . . . . . . . . . . . 14<br />

2.3 Komplexität von Algorithmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />

2.3.1 Größenordnung von Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />

2.3.2 Berechnungsmodell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />

2.3.3 Komplexitätsklassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />

2.3.4 Das Entscheidungsbaummodell . . . . . . . . . . . . . . . . . . . . . . . . . . . 20<br />

3 Grundlegende <strong>Geometrie</strong> in der Ebene 23<br />

3.1 Elementare geometrische Objekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />

3.2 Elementare Lokationsprobleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25<br />

3.2.1 Point-in-half-plane-Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25<br />

3.2.2 Lage eines Punktes bezüglich eines Strahls . . . . . . . . . . . . . . . . . . . . . 25<br />

3.2.3 Schnitt zweier Strecken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27<br />

3.2.4 Die angulare Ordnung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28<br />

3.2.5 Sektorbestimmung – Single-shot-Anfrage . . . . . . . . . . . . . . . . . . . . . . 30<br />

3.2.6 Sektorbestimmung – Multiple-shot-Anfrage . . . . . . . . . . . . . . . . . . . . 30


iv<br />

4 Polygone 33<br />

4.1 Spezialfall »Konvexe Polygone« . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34<br />

4.1.1 Test auf Konvexität . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />

4.1.2 Point-in-polygon-Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />

4.2 Spezialfall »Sternförmige Polygone« . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />

4.2.1 Point-in-polygon-Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41<br />

4.2.2 Erzeugen eines (sternförmigen) Polygons mit vorgegebener Eckenmenge . . . 43<br />

4.3 Point-in-polygon-Test bei allgemeinen Polygonen . . . . . . . . . . . . . . . . . . . . . 44<br />

5 Das Plane-sweep-Paradigma 47<br />

5.1 Das Problem des dichtesten Punktepaares . . . . . . . . . . . . . . . . . . . . . . . . . . 47<br />

5.2 Schnitt konvexer Polygone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51<br />

5.3 Anwendung »Schnitt von Halbebenen« . . . . . . . . . . . . . . . . . . . . . . . . . . . 52<br />

5.4 Schnitt von Liniensegmenten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55<br />

5.4.1 Schnittest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56<br />

5.4.2 Bestimmen aller Schnittpunkte . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58<br />

5.5 Anwendung »Test auf Einfachheit« . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61<br />

5.6 Anwendung »Überlagerung von PSLGs« und »Arrangement-Berechnung« . . . . . . 62<br />

6 Konvexe Hüllen ebener Punktmengen 67<br />

6.1 Eigenschaften und untere Schranke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67<br />

6.2 Inkrementelle Konstruktion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69<br />

6.3 Jarvis’s march . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71<br />

6.4 Graham’s scan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73<br />

6.5 Konstruktion mittels Divide-and-conquer . . . . . . . . . . . . . . . . . . . . . . . . . . 74<br />

6.6 Quickhull . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77<br />

6.7 Dynamische Verfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77<br />

7 Lokationsprobleme in der Ebene 79<br />

7.1 Die Slab-Methode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80<br />

7.2 Das Verfahren der verfeinerten Triangulationen . . . . . . . . . . . . . . . . . . . . . . 81<br />

7.2.1 Einschub »Die Eulersche Formel« . . . . . . . . . . . . . . . . . . . . . . . . . . 81<br />

7.2.2 Die Methode von Kirkpatrick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84<br />

7.2.3 Subdivision-Hierarchien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85<br />

8 Nachbarschaftsprobleme 89<br />

8.1 Definition und Eigenschaften des Voronoi-Diagramms . . . . . . . . . . . . . . . . . . 89<br />

8.2 Der Delaunay-Graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94<br />

8.3 Verallgemeinerungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96<br />

8.4 Konstruktion des Voronoi-Diagramms . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98<br />

8.4.1 Divide-and-conquer-Verfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98<br />

8.4.2 Sweep-line-Verfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100<br />

A Abkürzungen und Symbole 103<br />

Literaturverzeichnis 107


Einleitung<br />

1.1 Was ist »<strong>Algorithmische</strong> <strong>Geometrie</strong>«?<br />

Die <strong>Algorithmische</strong> <strong>Geometrie</strong> (engl. computational geometry) ist ein Teilgebiet<br />

der theoretischen Informatik, welches sich mit geometrischen Objekten<br />

(wie z. B. Punkten, Linien, Kreisen, Ebenen) beschäftigt.<br />

Die Ziele und Aufgabenstellungen hierbei sind<br />

• der Entwurf von effizienten Algorithmen zur Lösung geometrischer<br />

Probleme, bei denen sehr oft große Mengen geometrischer Objekte<br />

involviert sind,<br />

• die Bestimmung der algorithmischen Komplexität geometrischer<br />

Probleme, d. h. die Beantwortung von Fragen wie z. B. »Was sind<br />

untere Schranken für die Laufzeit und den Speicherbedarf eines<br />

Algorithmus?« oder »Gibt es zur Lösung eines Problems überhaupt<br />

einen praktikablen Algorithmus?«.<br />

Hierdurch grenzt sich die <strong>Algorithmische</strong> <strong>Geometrie</strong> von anderen Gebieten<br />

ab, die sich ebenfalls mit geometrischen Objekten beschäftigen<br />

(z. B. die Algebraische <strong>Geometrie</strong> oder die Differentialgeometrie). Als eigenständiges<br />

Gebiet der Informatik hat sich die <strong>Algorithmische</strong> <strong>Geometrie</strong><br />

Ende der 70er Jahre etabliert und spielt mittlerweile in vielen realen Anwendungen<br />

eine große Rolle:<br />

Computergrafik Möglichst realistische Berechnung von Bildern oder<br />

Filmen geometrisch modellierter Szenen, z. B. mittels Ray Tracingund<br />

Radiosity-Verfahren (Schlagwort Virtual Reality)<br />

1<br />

CAD/CAM (engl. computer aided design/manufacturing) Erzeugung<br />

geometrischer Objekte, beispielsweise mittels Vereinigung und<br />

Durchschnitt von Grundobjekten (z. B. Quader, Kugel usw.) oder<br />

mittels interpolierender Flächen durch vorgegebene Stützpunkte.<br />

Bekanntes Beispiel ist die Dresdner Frauenkirche, die im Zweiten Dresdner Frauenkirche<br />

Weltkrieg fast vollständig zerstört und zunächst am Computer<br />

realitätsgetreu rekonstruiert wurde (siehe z. B. ���������������<br />

�������������������). Weitere Schlagworte: Assemblierpla- WWW☞


2 Einleitung<br />

Map Overlay<br />

Industrieroboter<br />

KUKA KR 125/1<br />

konvexe Hülle<br />

nung und Digital Mock-Up bei der Fertigung von aus mehreren<br />

Teilen bestehenden Gütern (z. B. den Motorraum eines Autos), die<br />

in der richtigen Reihenfolge zusammengesetzt werden müssen<br />

Geographische Informationssysteme (GIS) Ein geographisches Informationssystem<br />

speichert geographische Daten (z. B. Länderkonturen,<br />

Flüsse, Bevölkerungsdichten usw.) und dient dazu, Anfragen<br />

zu beantworten, bei denen geometrische Eigenschaften miteinander<br />

kombiniert werden müssen. Beispielsweise könnte man<br />

einen Platz für ein neues Naherholungsgebiet suchen: ein günstiges<br />

Stück Land (Quadratmeterpreis ≤ x DM) einer gewissen Mindestfläche<br />

≥ y km 2 , das außerdem von den zu versorgenden Städten<br />

gut zu erreichen ist (Entfernung ≤ z km). Dies würde drei<br />

Anfragen an verschiedene geographische Datenbanken nach sich<br />

ziehen; die resultierenden Gebiete, welche die Kriterien erfüllen,<br />

müssen dann noch überlagert werden; ihre Schnittmenge (Stichwort<br />

Map Overlay) beantwortet dann die ursprüngliche Anfrage.<br />

Robotik (engl. robotics) Roboter sind meist Fahrzeuge (Fahrerlose<br />

Transportsysteme, FTS) oder mit Manipulatoren ausgestattete<br />

Industrieroboter. Typische Problemstellungen für solche Roboter<br />

sind<br />

• die Bewegungs- bzw. Bahnplanung, d. h. das Finden einer Bewegung<br />

von einer Anfangskonfiguration in eine Endkonfiguration,<br />

die zum einen Kollisionen mit der Umgebung vermeidet<br />

und zum anderen möglichst effizient ist,<br />

• die Lokalisation, d. h. die Bestimmung der eigenen Position anhand<br />

von Sensoren und Karten,<br />

• die Exploration einer unbekannten Umgebung, um z. B. eine<br />

Karte zu generieren.<br />

1.2 Beispiele geometrischer Fragestellungen<br />

Die folgenden realen Probleme lassen sich jeweils als geometrische Fragestellung<br />

modellieren und motivieren eine theoretische Untersuchung<br />

des jeweiligen Gebietes:<br />

Einzäunen von Apfelbäumen Auf einem Feld stehen einige Apfelbäume,<br />

die eingezäunt werden sollen.<br />

Frage: Wieviel Meter Zaun braucht man mindestens, um alle Bäume<br />

einzuzäunen? Wie muß der Zaun verlaufen?<br />

Geometrische Formulierung: Modelliere die Bäume als Punkte in<br />

der Ebene und bestimme die konvexe Hülle (siehe Kapitel 6) dieser<br />

Punktmenge.<br />

Christos Reichstag Gegeben die Pläne des Berliner Reichstages.


1.3 Literatur 3<br />

Frage: Wieviel Stoff wird mindestens benötigt, um den Reichstag<br />

zu verhüllen? Wie muß der Stoff zugeschnitten werden?<br />

Geometrische Formulierung: Bestimme die dreidimensionale konvexe<br />

Hülle des Reichstages.<br />

Nähestes Telefon Sie sind auf dem Unicampus und wollen telefonieren.<br />

Frage: Welches Telefon ist das näheste?<br />

Geometrische Formulierung: Modelliere die Telefone wieder als<br />

Punkte in der Ebene und bestimme eine Einteilung in Regionen<br />

mit gleichem nähesten Telefon. Diese Karte nennt man das Voronoi-Diagramm<br />

(siehe Kapitel 8). Voronoi-Diagramm<br />

Versorgung Mit einem Sender möglichst geringer Leistung wollen Sie<br />

eine Menge von Haushalten erreichen.<br />

Frage: Wo soll der Sender plaziert werden? Welche Leistung muß<br />

der Sender besitzen?<br />

Geometrische Formulierung: Suche die kleinste Kreisscheibe<br />

(engl. smallest enclosing circle), die alle Häuser überdeckt. smallest enclosing circle<br />

1.3 Literatur<br />

Lehrbücher zum Thema sind<br />

Buch Preis<br />

[5] M. de Berg, M. v. Kreveld, M. Overmars,<br />

O. Schwarzkopf. Computational Geometry: Algorithms<br />

and Applications.<br />

[8] H. Edelsbrunner. Algorithms in Combinatorial<br />

Geometry.<br />

54,– DM<br />

102,– DM<br />

[14] R. Klein. <strong>Algorithmische</strong> <strong>Geometrie</strong>. 58,– DM<br />

[19] J. O’Rourke. Computational Geometry in C. ca. 50,– DM<br />

[22] F. P. Preparata, M. I. Shamos. Computational Geometry:<br />

An Introduction.<br />

102,– DM<br />

Das Buch von Preparata und Shamos [22] zählt hierbei sicherlich zu<br />

den „Klassikern“ der <strong>Algorithmische</strong>n <strong>Geometrie</strong> und gibt einen guten<br />

Überblick über das Stoffgebiet. Es ist allerdings schon etwas in die Jahre<br />

gekommen; randomisierte Algorithmen werden dort beispielsweise<br />

überhaupt nicht behandelt.<br />

Einen aktuelleren Querschnitt erhält man in den Büchern von de Berg<br />

et al. [5] (jeweils anhand motivierender Beispiele und Anwendungen)<br />

und Klein [14], die beide sehr empfehlenswert sind. Das Buch von


4 Einleitung<br />

☞ WWW<br />

☞ WWW<br />

☞ WWW<br />

☞ WWW<br />

Edelsbrunner [8] ist ebenfalls ein „Klassiker“, behandelt aber mehr kombinatorische<br />

Aspekte der <strong>Algorithmische</strong>n <strong>Geometrie</strong>.<br />

Im Buch von O’Rourke [19], dessen überarbeitete zweite Auflage gerade<br />

erschienen ist, wird besonders auf die Implementierung geometrischer<br />

Algorithmen in C (und auch in Java) eingegangen.<br />

1.4 Informationsquellen<br />

Nützliche Informationen (z. B. zu Tagungen, Literaturdatenbanken,<br />

Mailinglisten usw.) finden sich auf der Homepage der GI-<br />

Fachgruppe 0. 1. 2 unter<br />

�������������������������������������������������<br />

Darüberhinaus sind die WWW-Seiten von Jeff Erickson (»Computational<br />

Geometry Pages«) unter<br />

�������������������������������������������<br />

und von David Eppstein (»Geometry in Action«) unter<br />

������������������������������������������<br />

sehr empfehlenswert.<br />

1.5 WWW-Seiten zur Vorlesung<br />

Die WWW-Seiten zur Vorlesung sind zu erreichen unter<br />

���������������������������������������������<br />

��������������������������������������


2.1 Topologie<br />

Referenzwerke: [9, 11, 23]<br />

Grundbegriffe<br />

In vielen Bereichen der <strong>Algorithmische</strong>n <strong>Geometrie</strong> spielen Abstände<br />

geometrischer Objekte eine Rolle, deshalb soll dieser Begriff zunächst<br />

formal dargestellt werden, um danach Begriffe wie »Stetigkeit«, »Weg«<br />

usw. ableiten zu können.<br />

2.1.1 Der Abstandsbegriff und innere Punkte<br />

Definition 2.1 (Metrik) Sei X eine Menge und d: X × X → R≥0 eine<br />

Abbildung, die je zwei Elementen x und y aus X einen Abstand d(x, y)<br />

zuordnet.<br />

Die Abbildung d ist eine Metrik, falls für alle x, y, z aus X folgendes gilt: Metrik<br />

d(x, y) = 0 ⇐⇒ x = y<br />

d(x, y) = d(y, x) (Symmetrie)<br />

d(x, z) ≤ d(x, y) + d(y, z) (Dreiecksungleichung)<br />

Das Paar (X, d) heißt dann metrischer Raum. metrischer Raum<br />

Befinden wir uns im d-dimensionalen reellen Raum R d , dann ist für zwei<br />

Punkte x = (x1, . . . , xd) und y = (y1, . . . , yd) die euklidische Metrik euklidische Metrik<br />

�<br />

�<br />

�<br />

|x y| := � d �<br />

(xi − yi) 2 (2.1)<br />

i=1<br />

definiert. Der Einfachheit halber bezeichnet man den R d zusammen<br />

mit der euklidischen Metrik auch als den d-dimensionalen euklidischen<br />

Raum, oder kurz E d . Im Rahmen dieser Vorlesung wird für uns fast ausschließlich<br />

der E 2 oder der E 3 eine Rolle spielen. Hier beschreibt die euklidische<br />

Metrik den gewohnten (euklidischen) Abstand zweier Punkte<br />

in der Ebene bzw. im Raum.<br />

2


6 Grundbegriffe<br />

Skalarprodukt<br />

Minkowski-Metriken<br />

x<br />

ε<br />

U ε(x)<br />

ε-Umgebung<br />

innerer Punkt<br />

Berührpunkt<br />

Randpunkt<br />

Bemerkung 2.2 Eine andere Möglichkeit die euklidische Metrik zu definieren,<br />

ist mittels des kanonischen Skalarprodukts des R d ,<br />

〈x, y〉 :=<br />

d�<br />

i=1<br />

xiyi .<br />

Bekanntlich ist das Skalarprodukt 〈x, y〉 = |x| |y| cos α, wobei |x| die euklidische<br />

Länge des Vektors x bezeichnet und α der Winkel zwischen den<br />

beiden Vektoren x und y ist.<br />

Somit gilt dann für die euklidische Distanz |x y| = |x − y| =<br />

� 〈x − y, x − y〉. ⊳<br />

Die euklidische Metrik ist nur ein spezielles Mitglied aus der Familie der<br />

Minkowski-Metriken Lp(x, y), die folgendermaßen definiert sind:<br />

Lp(x, y) :=<br />

und<br />

� d�<br />

i=1<br />

|xi − yi| p<br />

L∞(x, y) := d<br />

max<br />

i=1 |xi − yi|<br />

�1/p<br />

für 1 ≤ p < ∞<br />

(2.2)<br />

Für p = 2 erhält man also die euklidische Metrik, für p = 1 die sog.<br />

Manhattan-Metrik und für p = ∞ die sog. Maximum-Metrik.<br />

Mittels des Metrikbegriffes können nun auch die üblichen topologischen<br />

Begriffe definiert werden.<br />

Definition 2.3 Sei x ∈ X ein Punkt und A ⊆ X eine Teilmenge eines<br />

metrischen Raumes (X, d).<br />

• Für eine reelle Zahl ε > 0 heißt die Menge<br />

die ε-Umgebung von x.<br />

U ε(x) := { y ∈ X � � d(x, y) < ε } (2.3)<br />

• Ein Punkt x ∈ X heißt innerer Punkt von A, wenn es eine<br />

ε-Umgebung Uε(x) von x gibt, die ganz in A enthalten ist. Die<br />

Menge aller inneren Punkte von A heißt das Innere oder der offene<br />

Kern von A und wird mit A ◦ bezeichnet.<br />

• Ein Punkt x ∈ X heißt Berührpunkt von A, wenn in jeder<br />

ε-Umgebung Uε(x) von x ein Punkt aus A liegt. Die Menge aller<br />

Berührpunkte von A heißt die abgeschlossene Hülle von A und<br />

wird mit A bezeichnet.<br />

• Ein Punkt x ∈ X heißt Randpunkt von A, wenn in jeder<br />

ε-Umgebung Uε(x) von x sowohl ein Punkt aus A als auch ein<br />

Punkt aus dem Komplement A c := X \ A liegt, d. h. wenn x Berührpunkt<br />

von A und von A c ist. Die Menge aller Randpunkte<br />

von A heißt der Rand von A und wird mit ∂A bezeichnet.


2.1 Topologie 7<br />

• Die Menge A heißt offen (in X), falls jeder ihrer Punkte ein innerer offen und abgeschlossen<br />

Punkt ist. Sie heißt abgeschlossen (in X), falls ihr Komplement A c<br />

offen ist. Die Familie aller offenen Teilmengen eines metrischen<br />

Raumes (X, d) bezeichnet man auch als eine Topologie von X.<br />

Für eine Menge A ⊆ X erhalten wir hieraus einige einfache Folgerungen:<br />

• Die Menge A ist genau dann abgeschlossen, wenn sie alle ihre Berührpunkte<br />

enthält. Denn es gilt<br />

A ist abgeschlossen ⇐⇒ A c = X \ A ist offen<br />

⇐⇒ ∀ x∈X\A ∃ε>0 U ε(x) ⊆ X \ A<br />

⇐⇒ ∀ x∈X\A ∃ε>0 U ε(x) ∩ A = ∅<br />

⇐⇒ ∀ x∈X\A x ist kein Berührpunkt von A<br />

⇐⇒ (X \ A) ∩ A = ∅<br />

⇐⇒ A ⊆ A .<br />

• Es gilt immer die Inklusion A ◦ ⊆ A ⊆ A, denn jede<br />

ε-Umgebung U ε(x) für einen Punkt x enthält diesen selbst.<br />

Daraus folgt<br />

A ist offen ⇐⇒ A = A ◦ ∧ A ist abgeschlossen<br />

⇐⇒ A = A .<br />

• Es gelten die beiden Dualitätsbeziehungen<br />

(A ◦ ) c = X \ A ◦ = X \ A = A c , und<br />

(A) c = X \ A = (X \ A) ◦ = (A c ) ◦ , wegen<br />

x ∈ X \ A ◦ ⇐⇒ ∄ε>0 U ε(x) ⊆ A<br />

⇐⇒ ∀ε>0 U ε(x) � A<br />

⇐⇒ ∀ε>0 U ε(x) ∩ X \ A �= ∅<br />

⇐⇒ x ∈ X \ A , und<br />

x ∈ X \ A ⇐⇒ x /∈ A<br />

⇐⇒ ¬∀ε>0 U ε(x) ∩ A �= ∅<br />

⇐⇒ ¬∀ε>0 U ε(x) � X \ A<br />

⇐⇒ ∃ε>0 U ε(x) ⊆ X \ A<br />

⇐⇒ x ∈ (X \ A) ◦ .<br />

Damit erhält man dann für den Rand ∂A einer Menge A<br />

∂A = A ∩ A c = A ∩ (A ◦ ) c = A \ A ◦ .


8 Grundbegriffe<br />

E 2<br />

1<br />

U ε<br />

−1 S 1 E<br />

−1<br />

Relativtopologie<br />

stetig<br />

Weg<br />

einfacher Weg<br />

Beispiel 2.4 Die Strecke S = [−1, 1] ist in E abgeschlossen, ihr Rand ist<br />

die Menge R = {−1, 1} und ihr Inneres die Menge I = (−1, 1). Die punktierte<br />

Strecke S ′ = S \ {0} ist weder abgeschlossen noch offen und ihr<br />

Rand ist die Menge R ′ = {−1, 0, 1}.<br />

Faßt man E als Teilmenge des E 2 auf (in der Form E × {0} ⊆ E 2 ), dann<br />

ist S (genauer, die Menge S × {0}) immer noch abgeschlossen. Im E 2<br />

besitzt S aber keine inneren Punkte mehr, denn eine ε-Umgebung im E 2<br />

ist eine (offene) Kreisfläche, die in S keinen Platz findet. ⊳<br />

Oft möchte man über das Innere einer Menge reden können, auch wenn<br />

diese wie im letzten Beispiel in einen höherdimensionalen Raum eingebettet<br />

ist.<br />

Definition 2.5 (Relativtopologie) Sei R ⊆ X eine Teilmenge eines metrischen<br />

Raumes (X, d), dann ist für einen Punkt x ∈ R dessen ε-Umgebung<br />

in R definiert durch<br />

U R ε (x) := { y ∈ R � � d(x, y) < ε } = U ε(x) ∩ R . (2.4)<br />

Die hierdurch auf R entstehende Topologie heißt die von X induzierte<br />

Topologie oder Relativtopologie.<br />

Die übrigen Definitionen übertragen sich, indem man jeweils U ε(x)<br />

durch U R ε (x) und X durch R ersetzt. Im obigen Beispiel verwenden<br />

wir R = E × {0} und erhalten dann – wie erwartet – für das relative Innere<br />

von S × {0} die Menge (−1, 1) × {0} in Analogie zu Beispiel 2.4.<br />

2.1.2 Stetigkeit, Wege und Zusammenhang<br />

Mit Hilfe des durch die Metrik festgelegten Abstandsmaßes können wir<br />

nun definieren, wann eine Abbildung von einem metrischen Raum in<br />

einen anderen stetig ist und darauf aufbauend den Begriff des Weges<br />

einführen.<br />

Definition 2.6 (Stetigkeit) Seien (X, d) und (Y, e) metrische Räume<br />

und f: X → Y eine Abbildung. f ist genau dann im Punkt ˜x ∈ X stetig,<br />

wenn zu jedem ε > 0 ein δ > 0 existiert, so daß<br />

e(f(x), f(˜x)) < ε für alle x ∈ X mit d(x, ˜x) < δ .<br />

Definition 2.7 (Wege und Zusammenhang)<br />

Unter einem Weg w von a ∈ X nach b ∈ X verstehen wir das Bild einer<br />

stetigen Abbildung<br />

�w: [0, 1] → X mit �w(0) = a und �w(1) = b<br />

und nennen �w eine Parametrisierung des Weges w.<br />

• Der Weg w heißt geschlossen, wenn �w(0) = �w(1) gilt.<br />

• Der Weg w heißt einfach oder doppelpunktfrei, wenn �w auf [0, 1)<br />

injektiv ist.


2.1 Topologie 9<br />

• Eine Menge A ⊆ X heißt wegzusammenhängend, wenn je zwei wegzusammenhängend<br />

Punkte von A durch einen Weg verbunden werden können, der<br />

ganz in A verläuft.<br />

»Wegzusammenhang« ist eine Äquivalenzrelation und induziert<br />

eine Zerlegung von A in disjunkte Zusammenhangskomponenten.<br />

Abbildung 2.1 zeigt einige Beispiele für Wege in der Ebene: Alle vier<br />

Wege mit Ausnahme von w1 sind geschlossen; nur die Wege w1 und w4<br />

sind doppelpunktfrei.<br />

Bemerkung 2.8 Zu jedem Weg w (außer zum trivialen Weg �w([0, 1]) ≡<br />

a) gibt es unendlich viele Parametrisierungen. Wir können uns eine Parametrisierung<br />

vorstellen als die Art und Weise, wie der Weg abgelaufen<br />

wird. Die Ableitung �w ′ entspräche dann der „Geschwindigkeit“ beim<br />

Ablaufen des Weges. ⊳<br />

Zusammenhangskomponenten<br />

Für einen einfachen geschlossenen Weg w im E 2 (wie z. B. der Weg w4<br />

in Abbildung 2.1) besagt der Jordansche Kurvensatz, daß R 2 \ w aus ge- Jordanscher Kurvensatz<br />

nau zwei Gebieten (offene und wegzusammenhängende Mengen) besteht,<br />

deren Rand w ist: einem von w umschlossenen inneren und einem<br />

unbeschränkten äußeren Gebiet. Der Beweis dieser alles andere als<br />

trivialen Aussage findet sich für Interessierte z. B. in [17].<br />

Definition 2.9 (Einfacher Wegzusammenhang) Eine wegzusammenhängende<br />

Menge A ⊆ E2 heißt einfach-wegzusammenhängend, wenn<br />

für jeden in A verlaufenden einfachen geschlossenen Weg sein inneres<br />

Gebiet ebenfalls in A enthalten ist.<br />

Anschaulich bedeutet der einfache Wegzusammenhang einer Menge,<br />

daß sie keine „Löcher“ besitzt. Siehe hierzu das Beispiel in Abbildung<br />

2.2 auf der folgenden Seite.<br />

Beim Umgang mit den oben definierten Wegen interessiert natürlich<br />

auch deren Länge. Diese kann man durch Approximation mit Streckenzügen<br />

definieren: Man wählt n Stützstellen 0 = t1 < . . . < tn = 1<br />

und bildet die Summe �i=n−1 i=1 d( �w(ti), �w(ti+1) über alle Abstände. Der<br />

Limes für n → ∞ des Supremums dieser Summe für alle möglichen<br />

Wahlen von n aufeinanderfolgenden Stützstellen im Intervall [0, 1] bezeichnet<br />

man als die Länge des Weges w. Wenn dieser Wert endlich ist,<br />

nennt man w rektifizierbar.<br />

Für einen Weg w im E 2 , der durch �w(t) = (x(t), y(t)) parametrisiert ist,<br />

kann man die Integralformel für die Weglänge<br />

a<br />

w1<br />

b<br />

a = b<br />

w2<br />

a = b<br />

w3<br />

a = b<br />

w4<br />

einfachwegzusammenhängend<br />

a<br />

Weglänge mittels<br />

Approximation durch<br />

Streckenzüge<br />

Integralformel für die<br />

Weglänge<br />

b<br />

Abbildung 2.1<br />

Die Wege w1 und w4 sind<br />

einfach, w2, w3, w4 sind<br />

geschlossen


10 Grundbegriffe<br />

Abbildung 2.2<br />

Menge A ist einfach<br />

wegzusammenhängend,<br />

Menge B nicht<br />

gerichteter Graph<br />

Schlinge<br />

A<br />

w<br />

Länge(w) =<br />

� 1<br />

0<br />

B<br />

�<br />

x ′ (t) 2 + y ′ (t) 2 dt (2.5)<br />

benutzen, sofern die Koordinatenfunktionen stetig differenzierbar sind.<br />

2.2 Graphentheorie<br />

Referenzwerke: [12, 15, 18]<br />

Für viele Aufgabenstellungen in der <strong>Algorithmische</strong>n <strong>Geometrie</strong> ist eine<br />

Modellierung mittels eines Graphen hilfreich oder die auftretenden Objekte<br />

selbst sind Graphen bzw. durch solche beschreibbar (siehe z. B. das<br />

Voronoi-Diagramm und der dazu duale Delaunay-Graph in Kapitel 8).<br />

2.2.1 Gerichtete Graphen<br />

Definition 2.10 (Gerichteter Graph) Ein Quadrupel G = (V, R, α, ω) ist<br />

ein gerichteter Graph (oder kurz Graph), wenn folgendes gilt:<br />

1. Die Eckenmenge V �= ∅ und die Pfeilmenge R des Graphen sind<br />

disjunkt, V ∩ R = ∅.<br />

2. Die Abbildungen α: R → V und ω: R → V weisen jedem Pfeil r ∈<br />

R eine Anfangsecke α(r) und eine Endecke ω(r) zu.<br />

Der Graph G heißt endlich, wenn |V ∪ R| < ∞ gilt.<br />

Definition 2.11 Sei G = (V, R, α, ω) ein Graph. Ein Pfeil r ∈ R heißt<br />

Schlinge, wenn α(r) = ω(r). Der Graph G heißt schlingenfrei, wenn er<br />

keine Schlingen enthält.<br />

Zwei Pfeile r �= r ′ heißen parallel, wenn α(r) = α(r ′ ) und ω(r) = ω(r ′ ).<br />

Die Pfeile r �= r ′ heißen invers, wenn α(r) = ω(r ′ ) und ω(r) = α(r ′ ).<br />

w


2.2 Graphentheorie 11<br />

α ω<br />

r1 v1 v2<br />

r2 v1 v2<br />

r3 v2 v3<br />

r4 v3 v3<br />

r5 v4 v3<br />

r6 v3 v4 v1 v5<br />

r1<br />

r2<br />

Der Graph G heißt einfach oder schlicht, wenn er schlingenfrei ist und einfach<br />

keine Parallelen enthält. In diesem Fall ist jeder Pfeil r eindeutig durch<br />

das Paar (α(r), ω(r)) charakterisiert. Man kann dann auch einfach G =<br />

(V, R) schreiben, mit R ⊆ V × V.<br />

Beispiel 2.12 Der in Abbildung 2.3 dargestellte Graph besitzt eine<br />

Schlinge (r4), zwei parallele Pfeile (r1 und r2), sowie zwei inverse Pfeile<br />

(r5 und r6). Aufgrund der Schlinge und der beiden Parallelen ist er also<br />

nicht einfach. ⊳<br />

v2<br />

r3<br />

r5<br />

v3<br />

v4<br />

r4<br />

r6<br />

Abbildung 2.3<br />

Ein Graph und seine<br />

geometrische Realisierung<br />

im E 2<br />

Definition 2.13 Sei G = (V, R, α, ω) ein Graph. Zwei Ecken u und v<br />

heißen adjazent oder benachbart, wenn es einen Pfeil r ∈ R gibt mit adjazente Ecken<br />

α(r) = u ∧ ω(r) = v oder α(r) = v ∧ ω(r) = u.<br />

Eine Ecke u und ein Pfeil r heißen inzident, wenn u ∈ {α(r), ω(r)}. Zwei inzident<br />

Pfeile r und r ′ heißen inzident, wenn es eine Ecke v gibt, die mit r und<br />

mit r ′ inzidiert.<br />

Für eine Ecke v ∈ V heißt<br />

B + (v) := { r ∈ R � � α(r) = v }<br />

das von v ausgehende Pfeilbüschel,<br />

B − (v) := { r ∈ R � � ω(r) = v }<br />

das in v mündende Pfeilbüschel,<br />

N(v) := { u ∈ V � � ∃r∈R α(r) = v ∧ ω(r) = u }<br />

die Nachfolgermenge von v,<br />

V(v) := { u ∈ V � � ∃r∈R α(r) = u ∧ ω(r) = v }<br />

die Vorgängermenge von v,<br />

g + (v) := |B + (v)| der Außengrad von v,<br />

g − (v) := |B − (v)| der Innengrad von v,<br />

g(v) := g + (v) + g − (v) der Grad von v.<br />

Beispiel 2.14 Im Graph von Abbildung 2.3 münden in die Ecke v2 zwei<br />

Pfeile (r1 und r2) und ihr Innengrad ist somit gleich 2. Ihre Vorgängermenge<br />

enthält dagegen nur die eine Ecke v1.<br />

Für die isolierte Ecke v5 gilt: B + (v5) = B − (v5) = N(v5) = V(v5) = ∅<br />

und g + (v5) = g − (v5) = g(v5) = 0. ⊳


12 Grundbegriffe<br />

Teilgraph<br />

Obergraph<br />

Partialgraph<br />

Subgraph<br />

ungerichteter Graph<br />

Bemerkung 2.15 Für Graphen mit endlicher Pfeilmenge, d. h. |R| < ∞,<br />

gilt<br />

1. �<br />

v∈V g+ (v) = �<br />

v∈V g− (v) = |R| und<br />

2. �<br />

v∈V g(v) = 2 |R|. ⊳<br />

Definition 2.16 (Teilgraph und Obergraph)<br />

Ein Graph G ′ = (V ′ , R ′ , α ′ , ω ′ ) heißt Teilgraph eines Graphen G =<br />

(V, R, α, ω) (i. Z. G ′ ⊑ G), wenn gilt<br />

1. V ′ ⊆ V und R ′ ⊆ R sowie<br />

2. α|R ′ = α ′ und ω|R ′ = ω ′ .<br />

In diesem Fall heißt G dann Obergraph von G ′ (i. Z. G ⊒ G ′ ).<br />

Bemerkung 2.17 Die Relation „⊑“ ist (ebenso wie „⊒“)<br />

1. reflexiv (G ⊑ G),<br />

2. antisymmetrisch (G ⊑ G ′ ∧ G ′ ⊑ G =⇒ G = G ′ ) und<br />

3. transitiv (G ⊑ G ′ ∧ G ′ ⊑ G ′′ =⇒ G ⊑ G ′′ ). ⊳<br />

Definition 2.18 (Partialgraph und Subgraph)<br />

Sei G = (V, R, α, ω) ein Graph und R ′ ⊆ R eine Kantenteilmenge.<br />

Der durch R ′ induzierte Partialgraph GR ′ ist definiert durch GR ′<br />

(V, R<br />

:=<br />

′ , α|R ′, ωR ′).<br />

Für eine Eckenteilmenge V ′ ⊆ V ist der durch V ′ induzierte Subgraph<br />

definiert durch G[V ′ ] := (V ′ , RV ′, α|R V ′ , ωR V ′ ) mit RV ′ := { r ∈ R � �<br />

α(r) ∈ V ′ ∧ ω(r) ∈ V ′ }.<br />

Ein Graph H heißt Partialgraph (bzw. Subgraph) von G, wenn es eine<br />

Kantenteilmenge R ′ ⊆ R (bzw. Eckenteilmenge V ′ ⊆ V) gibt, so daß<br />

H = GR ′ (bzw. H = G[V ′ ]) gilt.<br />

2.2.2 Ungerichtete Graphen<br />

Definition 2.19 (Ungerichteter Graph) Ein Tripel G = (V, E, γ) ist ein<br />

ungerichteter Graph, wenn folgendes gilt:<br />

1. Die Eckenmenge V �= ∅ und die Kantenmenge E des Graphen<br />

sind disjunkt, V ∩ E = ∅.<br />

2. Die Abbildung γ: E → { X � � X ⊆ V ∧ 1 ≤ |X| ≤ 2 } weist jeder<br />

Kante zwei Endpunkte zu (bzw. einen Endpunkt im Fall einer<br />

Schlinge).<br />

Der Graph G heißt endlich, wenn |V ∪ R| < ∞ gilt.


2.2 Graphentheorie 13<br />

Begriffe wie parallel, einfach, Adjazenz, Inzidenz usw. sind analog zu den<br />

Begriffen in gerichteten Graphen definiert.<br />

Im Falle eines einfachen Graphen G = (V, E, γ), der also weder Schlingen<br />

noch Parallelen enthält, ist jede Kante e ∈ E eindeutig durch die zweielementige<br />

Menge γ(e) = {u, v} ihrer Endpunkte charakterisiert. Man<br />

kann dann auch G = (V, E) für den ungerichteten Graphen schreiben.<br />

Bemerkung 2.20 Oft werden wir unter leichtem Mißbrauch der Notation<br />

auch (u, v) anstelle von {u, v} für eine ungerichtete Kante schreiben.<br />

⊳<br />

2.2.3 Wege und Kreise<br />

Definition 2.21 (Weg und Kreis) Ein Weg w in einem Graphen G = Weg<br />

(V, R, α, ω) ist eine endliche Folge w = (r1, . . . , rn), n ≥ 1, von Pfeilen<br />

ri ∈ R (für i = 1, . . . , n), für die gilt<br />

ω(ri) = α(ri+1) für i = 1, . . . , n − 1.<br />

Die Startecke des Weges ist α(w) := α(r1) und die Endecke ist ω(w) :=<br />

ω(rn). Die Länge |w| des Weges w ist die Anzahl n der durchlaufenen<br />

Pfeile.<br />

Ein Weg w mit α(w) = ω(w) heißt Kreis. Kreis<br />

Die Eckenmenge s(w) := {α(r1), . . . , α(rn), ω(rn)} bezeichnen wir als<br />

die Spur des Weges w. Eine Ecke v wird von w berührt, wenn v ∈ s(w)<br />

gilt.<br />

Ein Weg w heißt einfach, wenn ri �= rj für i �= j, d. h. wenn er keinen<br />

Pfeil mehr als einmal durchläuft.<br />

Ein Weg w heißt elementar, wenn α(ri) �= α(rj) und ω(ri) �= ω(rj)<br />

für i �= j, d. h. wenn er keine Ecke mehr als einmal durchläuft – mit<br />

Ausnahme des Falles, daß Anfangs- und Endecke übereinstimmen.<br />

Beispiel 2.22 In Abbildung 2.3 auf Seite 11 ist der Weg w =<br />

(r1, r3, r6, r5) zwar einfach, aber nicht elementar, da die Ecke v3 zweimal<br />

besucht wird.<br />

Der Weg w = (r5, r6) ist ein elementarer (und damit auch einfacher)<br />

Kreis. ⊳<br />

Definition 2.23 (Weg und Kreis im ungerichteten Graphen)<br />

Ein Weg w in einem ungerichteten Graphen G = (V, E, γ) ist eine endli- Weg<br />

che Folge w = (e1, . . . , en), n ≥ 1, von Kanten ei ∈ E (für i = 1, . . . , n),<br />

für die es Ecken v0, . . . , vn ∈ V gibt, so daß gilt<br />

γ(ei) = {vi−1, vi} für i = 1, . . . , n.<br />

Die Startecke des Weges ist α(w) := v0 und die Endecke ist ω(w) := vn.


14 Grundbegriffe<br />

erreichbar<br />

Zusammenhang<br />

geometrische Realisierung<br />

geometrischer Graph<br />

Die Begriffe Länge, Spur, einfach und elementar sind analog zum gerichteten<br />

Fall definiert.<br />

Definition 2.24 (Erreichbarkeit) Eine Ecke v ′ in einem (gerichteten oder<br />

ungerichteten) Graphen G heißt von einer Ecke v aus erreichbar, wenn<br />

entweder v = v ′ gilt oder es einen Weg w gibt mit α(w) = v und ω(w) =<br />

v ′ . Die (in G) von v aus erreichbaren Ecken werden mit EG(v) bezeichnet,<br />

oder kurz E(v), wenn klar ist, um welchen Graphen es sich handelt.<br />

Beispiel 2.25 In Abbildung 2.3 auf Seite 11 ist die Menge der von v2 erreichbaren<br />

Ecken E(v2) = {v2, v3, v4} und die Menge der von v5 erreichbaren<br />

Ecken E(v5) = {v5}. ⊳<br />

Definition 2.26 (Zusammenhang)<br />

Ein gerichteter Graph G = (V, R, α, ω) heißt (stark) zusammenhängend,<br />

wenn für jede Ecke v ∈ V gilt EG(v) = V.<br />

Ein ungerichteter Graph G = (V, E, γ) heißt zusammenhängend, wenn<br />

für jede Ecke v ∈ V gilt EG(v) = V.<br />

Anschaulich bedeutet also der (starke) Zusammenhang eines Graphen,<br />

daß jede Ecke eines Graphens jede andere Ecke über einen Weg erreichen<br />

kann.<br />

2.2.4 Geometrische Realisierungen und Planarität<br />

Einen Graphen durch Angabe seiner Ecken- und Pfeilmenge sowie der<br />

Abbildungen α und ω zu beschreiben ist meist mühsam, wie Abbildung<br />

2.3 auf Seite 11 (links) zeigt. Intuitiver ist eine geometrische Realisierung<br />

des Graphen, z. B. in der Ebene (rechte Seite der Abbildung).<br />

Definition 2.27 (Geometrischer Graph) Sei G = (V, R, α, ω) ein Graph<br />

und (X, d) ein metrischer Raum. Eine geometrische Realisierung des<br />

Graphen G bildet die Ecken auf paarweise verschiedene Punkte in X ab.<br />

Die Pfeile werden auf einfache Wege abgebildet, welche die Bildpunkte<br />

der entsprechenden Ecken verbinden und sonst keine Bildpunkte anderer<br />

Ecken berühren. Das Ergebnis nennt man einen zu G gehörenden<br />

geometrischen Graphen.<br />

Bemerkung 2.28 Oftmals werden wir unter leichtem Mißbrauch der<br />

Notation die beiden Begriff »(abstrakter) Graph« und »geometrischer<br />

Graph« gleichsetzen und schlicht von einem Graphen sprechen. ⊳<br />

Für uns spielen fast ausschließlich geometrische Realisierungen in der<br />

Ebene E 2 (oder in anderen „flächigen“ Räumen, z. B. auf der Oberfläche<br />

einer Kugel) eine Rolle. Besonders interessant sind hierbei solche<br />

Realisierungen, bei denen sich keine Pfeile kreuzen.


2.3 Komplexität von Algorithmen 15<br />

Definition 2.29 (Planarer Graph) Ein geometrischer Graph, dessen<br />

Pfeile sich ausschließlich in den Endpunkten berühren, heißt<br />

kreuzungsfrei. kreuzungsfrei<br />

Ein Graph, der sich in der Ebene E 2 kreuzungsfrei realisieren läßt, heißt<br />

planar. planar<br />

Beispiel 2.30 In Abbildung 2.4 sehen wir links zwei verschiedende geometrische<br />

Realisierungen desselben planaren Graphen: eine kreuzungsfreie<br />

und eine, bei der der Pfeil r6 den Pfeil r5 schneidet. (Genauer: Das<br />

Bild des Pfeiles r6 schneidet das Bild des Pfeiles r5.)<br />

Der in der Abbildung rechts dargestellte Graph besitzt dagegen keine<br />

geometrische Realisierung in der Ebene (wohl aber auf der Oberfläche<br />

eines Torus) und ist somit nicht planar. ⊳<br />

r1<br />

v2<br />

v1<br />

r6<br />

r5<br />

r2<br />

r4<br />

r3<br />

v3<br />

v4<br />

r1<br />

v2<br />

v1<br />

2.3 Komplexität von Algorithmen<br />

Referenzwerke: [21, 10, 4]<br />

r5<br />

r2<br />

r4<br />

Die Effizienz eines Algorithmus ermittelt man üblicherweise anhand<br />

seines Verbrauchs an Rechenzeit und Speicherplatz. Außer bei ganz einfachen<br />

Problemen hängt dieser Bedarf in irgendeiner Weise von der Problemgröße<br />

ab, z. B. von der Anzahl n der einzuzäunenden Apfelbäume<br />

in unserem Einführungsbeispiel in Abschnitt 1.2 auf Seite 2).<br />

Beim Vergleich zweier Algorithmen interessiert uns hierbei nicht der<br />

exakte Zeit- und Platzbedarf einer Implementation für eine konkrete<br />

Eingabe. Stattdessen wollen wir für einen Algorithmus seine Laufzeit<br />

und seinen Speicherplatzbedarf als Funktion der Eingabegröße darstellen<br />

und diese – größenordnungsmäßig – mit den Zeit- und Speicheranforderungen<br />

anderer Algorithmen vergleichen.<br />

2.3.1 Größenordnung von Funktionen<br />

Sei M die Menge aller reellwertigen Funktionen f: N → R auf den natürlichen<br />

Zahlen.<br />

r3<br />

v3<br />

v4<br />

r6<br />

Abbildung 2.4<br />

Zwei geometrische<br />

Realisierungen eines<br />

planaren Graphen sowie<br />

ein nicht-planarer Graph<br />

Rechenzeit und<br />

Speicherplatz


16 Grundbegriffe<br />

O-Notation<br />

Ω-Notation<br />

Θ-Notation<br />

o-Notation<br />

anonyme Funktion<br />

insertion sort<br />

Definition 2.31 Für eine Funktion g ∈ M definieren wir die folgenden<br />

Klassen von Funktionen:<br />

• O(g) := { f ∈ M � � ∃c∈R≥0 ∃n0∈N ∀n≥n0 |f(n)| ≤ c · |g(n)| },<br />

alle Funktionen höchstens von der Größenordnung von g<br />

• Ω(g) := { f ∈ M � � ∃c∈R≥0 ∃n0∈N ∀n≥n0 |f(n)| ≥ c · |g(n)| },<br />

alle Funktionen mindestens von der Größenordnung von g<br />

• Θ(g) := O(g) ∩ Ω(g),<br />

alle Funktionen genau von der Größenordnung von g<br />

• o(g) := { f ∈ M � � ∀c∈R>0 ∃n0∈N ∀n≥n0 |f(n)| < c · |g(n)| },<br />

alle Funktionen von geringerer Größenordnung als g<br />

Am häufigsten wird uns die O-Notation zur Angabe von oberen Schranken<br />

und die Ω-Notation zur Angabe von unteren Schranken (z. B. für die<br />

Laufzeit eines Algorithmus) begegnen.<br />

Bemerkung 2.32 Die oben definierten Klassen sind Mengen von Funktionen.<br />

Deshalb sollte man korrekterweise für eine Funktion f(n) von<br />

genau quadratischer Größenordnung auch schreiben f(n) ∈ Θ(n 2 ) und<br />

nicht f(n) = Θ(n 2 ).<br />

Manchmal möchte man aber auch mit dem Klassensymbol rechnen können,<br />

z. B. um eine untere Schranke für die Funktion h(n) zu definieren:<br />

h(n) = g(n) + Ω(f(n)). Das Symbol Ω(f(n)) spielt dann die Rolle ei-<br />

ner anonymen Funktion mindestens von der Größenordnung von f(n),<br />

die wir aber nicht genau spezifieren wollen (oder können). Beim Rechnen<br />

mit solchen anonymen Funktionen, sollte man sich immer an die<br />

zugrundeliegende Definition erinnern! ⊳<br />

Beispiel 2.33 Der Ausdruck �n i=1 O(i) beschreibt eine obere Laufzeitschranke<br />

für das naive Sortieren von n Zahlen durch Einfügen (engl. insertion<br />

sort). Hier ist es nicht zulässig, die anonyme Funktion O(i) in der<br />

Summe in n verschiedene anonyme Funktionen aufzuteilen. Dies würde<br />

zum falschen Ergebnis �n i=1 O(i) = O(1) + O(2) + · · · + O(n) = O(n)<br />

führen.<br />

Denn in �n i=1 O(i) gibt es nur eine einzige anonyme Funktion, die von i<br />

(und nicht von n) abhängt, nämlich i ↦→ i. Richtig ist deshalb<br />

n�<br />

n�<br />

O(i) = { f ∈ M � � ∃c∈R≥0 ∃i0∈N ∀i≥i0 |f(i)| ≤ c · |i| }<br />

i=1<br />

i=1<br />

= { f ∈ M � � ∃c∈R≥0 ∃n0∈N<br />

n�<br />

∀n≥n0 |f(n)| ≤ c · |i| }<br />

i=1<br />

= { f ∈ M � � ∃c∈R≥0 ∃n0∈N<br />

� �<br />

�<br />

∀n≥n0 |f(n)| ≤ c · �<br />

n(n + 1) �<br />

�<br />

� 2 � }<br />

= O(n 2 ) .<br />

Die Summation muß also in den O-Ausdruck „hineingezogen“ werden!<br />


2.3 Komplexität von Algorithmen 17<br />

2.3.2 Berechnungsmodell<br />

Bei Laufzeitanalysen verwenden wir das Maschinenmodell der Unit-<br />

Cost Real RAM (Random Access Machine), siehe [22,21]. Diese Maschine Unit-Cost Real RAM<br />

verfügt über abzählbar unendlich viele Speicherzellen, die jeweils eine<br />

beliebige reelle Zahl aufnehmen können. Folgende Operationen können<br />

jeweils in einem Maschinentakt ausgeführt werden:<br />

Ein- oder Ausgabe eines Registers, Vergleich zweier Register E/A, �, (+, −, ·, /),<br />

und bedingte Verzweigung sowie die arithmetischen Operationen<br />

Addition, Subtraktion, Multiplikation und Division.<br />

if . . . then . . .<br />

Die Speicherzellen können dabei jeweils direkt oder indirekt adressiert<br />

werden.<br />

Für bestimmte Fälle wird manchmal die Menge der erlaubten arithmetischen<br />

Grundoperationen noch erweitert, so daß auch analytische Funktionen<br />

(also z. B. das Ziehen der k-ten Wurzel, trigonometrische Funktionen<br />

usw.) in einem Takt berechnet werden können. Hierauf wird dann<br />

aber gesondert hingwiesen.<br />

Obwohl die Arbeitsweise der Unit-Cost Real RAM derjenigen realer<br />

Rechner sehr ähnlich ist, muß man beachten, daß sie in einem Takt Zah- reale Rechner<br />

len beliebiger Größe verarbeiten kann. Auf diese Weise können ausgedehnte<br />

Berechnungen durch eine geeignete Codierung in einem einzigen<br />

Takt „versteckt“ werden. Damit ist dieses Modell echt mächtiger als<br />

das der Turing-Maschine.<br />

Um dieses Problem auszuschließen, kann man fordern, daß alle auftretenden<br />

Zahlen eine nach oben beschränkte Codierungslänge besitzen,<br />

d. h. rational sind in der Form p<br />

q mit p, q ∈ Q und |p| , |q| ≤ C für eine<br />

Konstante C. Dann kann die Real RAM mit polynomiellem Mehraufwand<br />

auch auf einem realen Rechner simuliert werden. Der Einfachheit<br />

halber bleiben wir aber beim Modell der Unit-Cost Real RAM.<br />

2.3.3 Komplexitätsklassen<br />

Sei Π ein Problem, welches ein Algorithmus1 A lösen kann (z. B. das<br />

Sortieren einer Menge von Zahlen). Um die Komplexität des Algorith-<br />

mus A zu beschreiben, sei die Funktion TA : Π → N definiert als die Zahl<br />

der Taktzyklen, die zur Lösung einer konkreten Probleminstanz P ∈ Π<br />

(z. B. das Sortieren der Zahlen {8.1, 24, −3.4, 56}) benötigt werden. Die<br />

Funktion SA : Π → N sei hierbei die maximale Anzahl belegter Speicherzellen<br />

während der Ausführung des Algorithmus. Die Größe der<br />

Probleminstanz (d. h. die Anzahl der zu sortierenden Zahlen in obigem<br />

Beispiel) bezeichnen wir mit |P|.<br />

1 Ein solcher Algorithmus kann auch nichtdeterministisch sein, d. h. er kann seine Berechnung<br />

in mehrere parallele Wege aufspalten, von denen nur einer das gewünschte Resultat<br />

liefern muß. Bei einem deterministischen Algorithmus gibt es solche Verzweigungen nicht.<br />

beschränkte<br />

Codierungslänge<br />

Instanz<br />

Problem Π<br />

Lösung<br />

Algorithmus<br />

A


18 Grundbegriffe<br />

Worst-case-Laufzeit<br />

Worst-case-Speicherbedarf<br />

Average-case-Analyse<br />

randomisierter<br />

Algorithmus<br />

Definition 2.34 (Worst-case-Laufzeit und -Speicherbedarf)<br />

Sei A ein Algorithmus für ein Problem Π, dann bezeichnen<br />

die Worst-case-Laufzeit und<br />

tA(n) := max<br />

P∈Π,|P|=n TA(P)<br />

sA(n) := max<br />

P∈Π,|P|=n SA(P)<br />

den Worst-case-Speicherbedarf des Algorithmus A.<br />

Bemerkung 2.35 Wir betrachten hier ausschließlich den Worst case, der<br />

sich für die schlimmstmögliche Probleminstanz der Größe n ergibt und<br />

unter Umständen nur in ganz wenigen Fällen auftritt. Hat man für die<br />

auftretenden Probleminstanzen eine Wahrscheinlichkeitsverteilung zur<br />

Hand, kann in obiger Definition anstelle des Maximums auch der Erwartungswert<br />

der Laufzeit bzw. des Speicherbedarfs verwendet werden<br />

und man erhält eine Average-case-Analyse.<br />

Schließlich kann auch der Algorithmus selbst Zufallsentscheidungen<br />

treffen, die seine weitere Ausführung bestimmen (z. B. die Reihenfolge,<br />

in der die Zahlen beim Sortieren abgearbeitet werden). Für einen sol-<br />

chen randomisierten Algorithmus gibt es nicht nur eine Möglichkeit die<br />

korrekte Lösung des Problems zu berechnen (wie beim deterministischen<br />

Algorithmus), sondern mehrere. Die Zahlen TA(P) und SA(P) ergeben<br />

sich dann als Erwartungswert der entsprechenden Zahlen über alle<br />

verschiedenen Möglichkeiten des Algorithmus ans Ziel zu gelangen.<br />

Hierbei ist wichtig, daß diese Zahlen nicht von der Wahrscheinlichkeitsverteilung<br />

der zu bearbeitenden Probleminstanzen abhängen. ⊳<br />

Probleme mit vergleichbarer Komplexität können zu Komplexitätsklassen<br />

zusammengefaßt werden. Einige wichtige Klassen (für Entscheidungsprobleme<br />

2 ) sind<br />

• P := { Π � � Π kann von einem deterministischen Algorithmus A<br />

gelöst werden mit tA(n) ∈ O(n k ) für ein k ∈ N },<br />

• NP := { Π � � Π kann von einem nichtdeterministischen Algorithmus<br />

A gelöst werden mit tA(n) ∈ O(n k ) für ein k ∈ N } und<br />

• PSPACE := { Π � � Π kann von einem deterministischen Algorithmus<br />

A gelöst werden mit sA(n) ∈ O(n k ) für ein k ∈ N }.<br />

Zwischen diesen Klassen gelten die Inklusionsbeziehungen<br />

P ⊆ NP ⊆ PSPACE<br />

und die Frage, ob diese Inklusionen echt sind (d. h., ob P = NP oder<br />

P �= NP gilt), ist ein zentrales Problem der Theoretischen Informatik<br />

und noch immer unbeantwortet, obwohl vieles auf P �= NP hindeutet.<br />

Man vergleiche hierzu auch [21, 10].<br />

2 Bei einem Entscheidungsproblem muß der Algorithmus nur eine Ja/Nein-Antwort<br />

zurückliefern.


2.3 Komplexität von Algorithmen 19<br />

Definition 2.36 (Reduktion) Seien Π1 und Π2 zwei Probleme. Wir sagen,<br />

Problem Π1 ist auf Problem Π2 τ(n)-reduzierbar (i. Z. Π1 �τ(n) Π2)<br />

für eine Funktion τ: N → R, wenn es Algorithmen A1→2 und A2→1<br />

gibt mit tA1→2 (n), tA2→1 (n) ∈ O(τ(n)), so daß für alle Probleminstanzen<br />

P1 ∈ Π1 folgendes gilt:<br />

1. Algorithmus A1→2 transformiert die Probleminstanz P1 ∈ Π1 in<br />

eine Instanz P2 des Problems Π2.<br />

2. Algorithmus A2→1 transformiert die Lösung für die Probleminstanz<br />

P2 ∈ Π2 zurück in eine korrekte Lösung der ursprünglichen<br />

Instanz P1.<br />

Die Idee einer solchen Reduktion besteht darin, ein Problem auf ein anderes<br />

Problem zu reduzieren, um damit untere oder obere Schranken für<br />

die Laufzeit eines der beiden Probleme zu erhalten:<br />

Untere Schranken Falls wir wissen, daß jeder Algorithmus für ein Problem<br />

Π1 mindestens einen Zeitbedarf von Ω(t1(n)) besitzt und Π1<br />

auf das Problem Π2 τ(n)-reduziert werden kann, dann hat jeder<br />

Algorithmus zur Lösung von Π2 mindestens einen Zeitbedarf<br />

von Ω(t1(n) − τ(n)). Hierbei wird natürlich vorausgesetzt, daß<br />

τ(n) ∈ O(t1(n)). Sonst wäre die Reduktion nämlich völlig nutzlos,<br />

da der Zeitbedarf zum Transformieren des Problems Π1 größer<br />

wäre als der zu seiner Lösung.<br />

Π1<br />

Π1<br />

A1→2<br />

τ(n)-Reduktion<br />

A2→1<br />

untere Schranke<br />

τ(n)-Reduktion<br />

obere Schranke<br />

Durch die Reduktion von Π1 auf Π2 haben wir also aus einer unteren<br />

Schranke für Π1 eine untere Schranke für Π2 erhalten. untere Laufzeitschranke<br />

Obere Schranke Falls wir ein Problem Π2 mit einem Zeitbedarf<br />

von O(t2(n)) lösen können und ein Problem Π1 auf Π2<br />

τ(n)-reduziert werden kann, dann kann das Problem Π1 mit<br />

einem Zeitbedarf von O(t2(n) + τ(n)) gelöst werden.<br />

Durch die Reduktion von Π1 auf Π2 haben wir also aus einer oberen<br />

Schranke für Π2 eine obere Schranke für Π1 erhalten. obere Laufzeitschranke<br />

Beispiel 2.37 Das Problem des dichtesten Paares (engl. closest pair) closest pair<br />

im E 1 besteht darin, für n reelle Zahlen x1, . . . , xn zwei Zahlen xi und xj<br />

mit minimalem Abstand |xi − xj| (unter allen Zahlenpaaren) zu bestimmen.<br />

Da wir hierzu nur solche Paare betrachten müssen, die der Größe<br />

nach benachbart sind, können wir dieses Problem in linearer Zeit auf<br />

das Sortierproblem reduzieren: Sortierproblem<br />

1. Algorithmus A1→2 bleibt leer, da wir die n Zahlen direkt als Eingabe<br />

für das Sortierproblem benutzen können.<br />

2. Das Sortieren der n Zahlen hat einen Zeitbedarf von O(n log n),<br />

indem wir beispielsweise Heapsort verwenden.<br />

3. Algorithmus A2→1 durchläuft die sortierte Folge x ′ 1 ≤ . . . x ′ n in<br />

einem Sweep vom kleinsten zum größten Element und bestimmt in Sweep<br />

linearer Zeit das Paar (x ′ i , x ′ i+1 ) aufeinanderfolgender Zahlen mit<br />

kleinstem Abstand.<br />

Π2<br />

Π2


20 Grundbegriffe<br />

Entscheidungsbaum<br />

algebraisches<br />

Entscheidungsbaummodell<br />

Somit haben wir auch für das Closest-pair-Problem eine obere Laufzeitschranke<br />

von O(n log n) + O(n) = O(n log n) gewonnen. ⊳<br />

2.3.4 Das Entscheidungsbaummodell<br />

Die Ausführung eines (deterministischen) Algorithmus A auf unserem<br />

Maschinenmodell der Unit-Cost Real RAM können wir uns vorstellen<br />

als das Durchlaufen eines Baums von höchstens dem Grad 2, ausgehend<br />

von der Wurzel bis zu einem Blatt. Die inneren Knoten entsprechen<br />

dabei den durchzuführenden Aktionen:<br />

• In Knoten der Ordnung 1 werden Ein-/Ausgabe- sowie arithmetische<br />

Operationen durchgeführt.<br />

• An einem Knoten der Ordnung 2 erfolgt eine bedingte Verzweigung<br />

zu einem seiner beiden Söhne.<br />

Jeder Eingabe P entspricht also einem Weg von der Wurzel des Baums<br />

zu einem seiner Blätter, wobei die Länge des Weges der Zahl der benötigten<br />

Taktzyklen TA(P) entspricht. Einen solchen Baum nennen wir<br />

einen Entscheidungsbaum.<br />

Bemerkung 2.38 Man kann den Entscheidungsbaum auch als reinen<br />

Binärbaum, der ausschließlich aus Entscheidungsknoten besteht, definieren.<br />

Die übrigen (Rechen-) Operationen werden denn vernachlässigt.<br />

Ebenso kann man auch mächtigere Entscheidungsbaumkonzepte<br />

betrachten, bei denen in den Entscheidungsknoten nicht nur<br />

zwei Zahlen miteinander verglichen werden können, sondern beispielsweise<br />

das Vorzeichen linearer oder algebraischer Ausdrücke ermittelt<br />

werden kann. Dies führt dann zum linearen bzw. algebraischen<br />

Entscheidungsbaummodell. Allerdings würde diesen Modellen auch ein<br />

mächtigeres Maschinenmodell als das unsrige entsprechen. ⊳<br />

Mit dem Konzept des Entscheidungsbaums können wir nun eine untere<br />

Schranke für das Sortierproblem bestimmen:<br />

Satz 2.39 Das Sortieren von n Zahlen durch Vergleichen hat im Entscheidungsbaummodell<br />

die Komplexität Ω(n log n).<br />

Beweis: Sei A ein Algorithmus, der das Sortierproblem löst. Für jede der<br />

n! Permutationen der n Zahlen muß mindestens ein Blatt im Entscheidungsbaum<br />

zu A vorhanden sein. Denn sonst gäbe es zwei verschiedene<br />

Permutationen, die von dem Sortieralgorithmus nicht unterschieden<br />

werden könnten, und der Algorithmus A wäre nicht korrekt. Somit können<br />

wir die Höhe des Entscheidungsbaums folgendermaßen ganz grob


2.3 Komplexität von Algorithmen 21<br />

nach unten abschätzen: 3<br />

Höhe ≥ log2 (n!)<br />

�<br />

n<br />

� n<br />

2<br />

≥ log2 2<br />

≥ n<br />

2 log �<br />

n<br />

�<br />

2 2<br />

∈ Ω(n log n)<br />

Somit gibt es mindestens eine Permutation, für die der Algorithmus A<br />

mindestens Ω(n log n) Vergleiche ausführen muß. ✷<br />

3 Die Knoten der Ordnung 1 brauchen wir hier gar nicht zu betrachten, denn sie ver-<br />

größern die Höhe ja nur.


Grundlegende <strong>Geometrie</strong><br />

in der Ebene<br />

3.1 Elementare geometrische Objekte<br />

Wir definieren zunächst einige wichtige geometrische Grundobjekte<br />

im R d . 1<br />

Definition 3.1 Seien p und q zwei verschiedene Punkte im R d .<br />

• Das Liniensegment oder die Strecke zwischen den beiden Punk-<br />

ten ist die Menge<br />

[p q] := { p + λ(q − p) � � λ ∈ R mit 0 ≤ λ ≤ 1 } . (3.1)<br />

• Der Halbstrahl (oder kurz Strahl) von p aus in Richtung q ist de-<br />

finiert durch<br />

[p q} := { p + λ(q − p) � � λ ∈ R mit λ ≥ 0 } . (3.2)<br />

Analog ist der Strahl {p q] definiert, obwohl man dafür auch [q p}<br />

schreiben kann.<br />

• Die Gerade durch die beiden Punkte ist die Menge<br />

p q := { p + λ(q − p) � � λ ∈ R } . (3.3)<br />

Bemerkung 3.2 Neben der parametrisierten Zwei-Punkte-Darstellung in<br />

obiger Definition läßt sich insbesondere die Gerade noch auf viele andere<br />

Arten beschreiben. Eine wichtige Darstellung einer Geraden g im R 2<br />

ist die Normalenform,<br />

g(n, a) := { x ∈ R 2 � � n T x − a = 0 }<br />

= { x ∈ R 2 � � 〈n, x〉 = a } .<br />

(3.4)<br />

1 Obwohl wir in diesem Kapitel und im Rahmen fast der gesamten Vorlesung nur zweidimensionale<br />

Objekte benötigen, werden wir – wo dies ohne Mehraufwand möglich ist –<br />

die Definitionen so allgemein wie möglich halten.<br />

q<br />

[p q]<br />

p<br />

Liniensegment<br />

[p q}<br />

p<br />

Halbstrahl<br />

p q<br />

p<br />

Gerade<br />

3<br />

q<br />

q


24 Grundlegende <strong>Geometrie</strong> in der Ebene<br />

Normalenvektor<br />

n<br />

g(n, a)<br />

a<br />

0<br />

Hesseform einer Geraden<br />

Abstand eines Punktes von<br />

einer Geraden<br />

H +<br />

H −<br />

positive und negative<br />

Halbebene<br />

Hierbei ist n ∈ R2 \ (0, 0) ein Normalenvektor der Geraden (d. h. n steht<br />

senkrecht auf g) und a eine reelle Zahl.<br />

Hat der Vektor n außerdem die Länge 1 und ist a ∈ R≥0 (d. h. der Vektor<br />

n muß „vom Ursprung weg zeigen“), dann spricht man von der Hes-<br />

seform der Geraden g. Die Zahl a gibt in diesem Fall den (euklidischen)<br />

Abstand der Geraden zum Ursprung an. Eine einfache Merkregel für<br />

die Richtung des Normalenvektors bei der Hesseform: Für jeden Vektor<br />

x auf der Geraden muß das Skalarprodukt 〈n, x〉 = n T x positiv sein.<br />

Mit Hilfe der Hesseform läßt sich sehr einfach der Abstand eines Punktes<br />

p von einer Geraden g(n, a) bestimmen. Es gilt nämlich<br />

dist(p, g) = � � n T p − a � � , (3.5)<br />

wobei das Vorzeichen des Ausdrucks n T p − a darüber entscheidet, auf<br />

welcher Seite der Geraden der Punkt p liegt:<br />

positives Vorzeichen p liegt auf der Seite von g(n, a), in die auch der<br />

Normalenvektor n zeigt; somit liegen p und der Koordinatenursprung<br />

auf verschiedenen Seiten von g(n, a).<br />

negatives Vorzeichen p liegt auf der dem Normalenvektor abgewandten<br />

Seite von g; somit liegen p und der Koordinatenursprung auf<br />

derselben Seite von g(n, a).<br />

Ganz analog definiert man im R 3 die Normalenform einer Ebene<br />

bzw. allgemein im R d die Normalenform einer (d − 1)-dimensionalen<br />

Hyperebene (d. h. eines (d − 1)-dimensionalen affinen Unterraums<br />

des R d ). ⊳<br />

Definition 3.3 (Halbebene/Halbraum) Sei g(n, a) die Normalenform<br />

einer Geraden im R 2 . Dann nennt man<br />

• H + (n, a) := { x ∈ R 2 � � n T x − a ≥ 0 } = { x ∈ R 2 � � 〈n, x〉 ≥ a }<br />

die (abgeschlossene) positive Halbebene (engl. positive halfplane)<br />

zu g(n, a),<br />

• H − (n, a) := { x ∈ R 2 � � n T x − a ≤ 0 } = { x ∈ R 2 � � 〈n, x〉 ≤ a }<br />

die (abgeschlossene) negative Halbebene (engl. negative halfplane)<br />

zu g(n, a).<br />

Die offenen Halbebenen H + (n, a) ◦ und H − (n, a) ◦ erhält man, indem<br />

man in obiger Definition anstelle von »≥« (bzw. »≤«) jeweils »>«<br />

(bzw. »


3.2 Elementare Lokationsprobleme 25<br />

3.2 Elementare Lokationsprobleme<br />

3.2.1 Point-in-half-plane-Test<br />

Gegeben eine (abgeschlossene positive) Halbebene H + (n, a) = { x ∈<br />

R d � � n T x − a ≥ 0 } und ein Punkt p ∈ R d . Dann kann der Test<br />

„p ∈ H + (n, a)?“ mit einem Zeitbedarf von O(d) beantwortet werden.<br />

Denn aus der Definition von H + (n, a) folgt sofort „p ∈ H + (n, a) ⇐⇒<br />

n T p − a ≥ 0“ und die Berechnung dieses Ausdrucks erfordert O(d)<br />

Additionen und Multiplikationen. Da die Komplexität der Eingabe<br />

»(n, a, p)« schon aus Ω(d) ist, ist diese Schranke scharf und der Zeitbedarf<br />

ist aus Θ(d).<br />

Ist die Dimension d fest, dann kann der Point-in-half-plane-Test also in<br />

konstanter Zeit entschieden werden.<br />

3.2.2 Lage eines Punktes bezüglich eines Strahls<br />

Gegeben ein Strahl [p q} ⊂ R 2 (bzw. eine orientierte Strecke [p q] oder<br />

eine orientierte Gerade p q) und ein Punkt r ∈ R 2 , dann interessiert uns,<br />

ob r links oder rechts vom Strahl [p q} liegt (oder auf der vom Strahl induzierten<br />

Geraden).<br />

Ein naheliegender Ansatz ist, dieses Problem auf einen Point-in-halfplane-Test<br />

zurückzuführen. Hierzu muß aber zunächst eine Normalenform<br />

g(n, a) der durch den Strahl induzierten Geraden bestimmt werden,<br />

und zwar so, daß der Normalenvektor n z. B. immer in die linke<br />

Halbebene zeigt. Denn andernfalls wäre nicht sofort klar, ob auf eine<br />

positive oder auf eine negative Halbebene hin getestet werden muß und<br />

es wären Fallunterscheidungen nötig, um dies zu unterscheiden.<br />

� � � �<br />

p1<br />

q1<br />

Sei nun p = und q =<br />

gegen den<br />

p2<br />

q2<br />

, dann ist z. B. der um π<br />

2<br />

Uhrzeigersinn gedrehte Richtungsvektor des Strahls [p q},<br />

� �<br />

p2 − q2<br />

n =<br />

,<br />

q1 − p1<br />

ein Normalenvektor zu p q, der immer in die linke Halbebene zeigt.<br />

Durch Auflösen der Normalenform nach a und Einsetzen eines Punktes,<br />

der auf dem Strahl liegt (z. B. p), erhält man dann den passenden<br />

Wert für a,<br />

a = n T p<br />

= (p2 − q2)p1 + (q1 − p1)p2<br />

= p2q1 − p1q2 .<br />

Nun kann man den im letzten Abschnitt beschriebenen Point-in-halfplane-Test<br />

auf den Punkt r und die (offene) Halbebene H + (n, a) ◦ an-<br />

konstanter Zeitbedarf bei<br />

fester Dimension<br />

p<br />

links<br />

rechts<br />

q<br />

Reduktion auf<br />

Point-in-half-plane-Test


26 Grundlegende <strong>Geometrie</strong> in der Ebene<br />

p<br />

a × b<br />

b<br />

r1<br />

a<br />

r2<br />

q<br />

Vektorprodukt<br />

wenden und erhält die Äquivalenz:<br />

mit<br />

„r liegt (echt) links von [p q}“<br />

⇐⇒<br />

r ∈ H + (n, a) ◦<br />

⇐⇒<br />

n T r − a > 0<br />

n T r − a = (p2 − q2)r1 + (q1 − p1)r2 − p2q1 + p1q2<br />

= p2r1 − q2r1 + q1r2 − p1r2 − p2q1 + p1q2 .<br />

Bemerkung 3.4 Obige Formel zum Testen der Lage eines Punktes läßt<br />

sich auch noch auf andere Weise herleiten, nämlich unter Verwendung<br />

des Vektorprodukts:<br />

Denn offensichtlich gilt folgender Zusammenhang:<br />

„r liegt (echt) links von [p q}“<br />

⇐⇒<br />

„Die drei Punkte (p, q, r) sind im Gegenuhrzeigersinn orientiert“<br />

Dies läßt sich mittels des Vektorprodukts auf einfache Weise testen. Für<br />

zwei Vektoren a, b ∈ R3 ergibt nämlich das Vektorprodukt<br />

⎛<br />

a × b := ⎝<br />

a2b3 − a3b2<br />

a3b1 − a1b3<br />

a1b2 − a2b1<br />

⎞<br />

(∗)<br />

⎠ (3.6)<br />

einen zu a und b senkrecht stehenden Vektor, dessen Länge dem Flächeninhalt<br />

des von a und b aufgespannten Parallelogramms entspricht<br />

und der so orientiert ist, daß (a, b, a × b) ein Rechtssystem 2 bilden.<br />

Für zwei Vektoren a, b ∈ R 2 ergibt sich dann für das Vektorprodukt der<br />

in die x1-x2-Ebene eingebetteten Vektoren<br />

⎛<br />

⎝ a1<br />

a2<br />

⎞<br />

⎛<br />

b1<br />

⎞<br />

⎛<br />

⎠ × ⎝b2⎠<br />

= ⎝<br />

0 0<br />

0<br />

0<br />

a1b2 − a2b1<br />

und für die dritte Komponente des Vektorprodukts gilt die Äquivalenz:<br />

„Die drei Punkte (0, a, b) sind im Gegenuhrzeigersinn orientiert“<br />

⇐⇒<br />

a1b2 − a2b1 > 0<br />

2 Drei Vektoren bilden ein Rechtssystem, wenn sie die gleiche Orientierung zueinander<br />

besitzen wie Daumen, Zeigefinger und Mittelfinger der rechten Hand.<br />

⎞<br />


3.2 Elementare Lokationsprobleme 27<br />

Setzt man jetzt a = q − p und b = r − p, dann erhält man für diese dritte<br />

Komponente des Vektorprodukts<br />

a1b2 − a2b1 = (q1 − p1)(r2 − p2) − (q2 − p2)(r1 − p1)<br />

= q1r2 − p2q1 − p1r2 + p1p2<br />

− q2r1 + p1q2 + p2r1 − p1p2<br />

= (p1q2 − p2q1) + (q1r2 − q2r1) + (p2r1 − p1r2)<br />

(∗∗)<br />

und kann damit die Orientierung der drei Punkte p, q und r bestimmen.<br />

⊳<br />

Die beiden identischen Ausdrücke (∗) und (∗∗) lassen sich auch als<br />

Determinante einer 3×3-Matrix schreiben. Wir definieren deshalb die<br />

Funktion ccw: R2 × R2 × R2 → R (von engl. counter clockwise)<br />

� �<br />

�p1<br />

p2 � 1�<br />

�<br />

ccw(p, q, r) := �q1<br />

q2 � 1�<br />

� . (3.7)<br />

� �<br />

Somit gilt<br />

ccw(p, q, r)<br />

⎧<br />

⎪⎨<br />

⎪⎩<br />

r1 r2 1<br />

< 0 falls r (echt) rechts von [p q} liegt,<br />

= 0 falls r auf p q liegt,<br />

> 0 falls r (echt) links von [p q} liegt.<br />

Der Zeitbedarf für diesen Test ist wiederum aus Θ(1).<br />

(3.8)<br />

Bemerkung 3.5 Aufgrund der Eigenschaft des Vektorprodukts hat<br />

das Dreieck mit den Eckpunkten a, b und c gerade den Flächenin-<br />

|ccw(a, b, c)|. ⊳<br />

halt 1<br />

2<br />

3.2.3 Schnitt zweier Strecken<br />

Gegeben zwei Strecken p := [p1 p2] und q := [q1 q2] im R2 , dann möch- p2<br />

ten wir wissen, ob die beiden Strecken sich schneiden (und gegebenenfalls<br />

die Schnittmenge p ∩ q bestimmen).<br />

Offensichtlich ist „p und q schneiden sich“ äquivalent zu<br />

1. Die Strecken p und q sind kollinear und überlappen sich, oder<br />

2. die Strecken p und q sind nicht kollinear und es gilt<br />

die Endpunkte von q liegen auf verschiedenen<br />

Seiten von p<br />

und<br />

die Endpunkte von p liegen auf verschiedenen<br />

Seiten von q.<br />

(3.9)<br />

Flächeninhalt eines<br />

Dreiecks<br />

q1<br />

p1<br />

q2


28 Grundlegende <strong>Geometrie</strong> in der Ebene<br />

Abbildung 3.1<br />

Sonderfälle beim Schnitt<br />

zweier Strecken<br />

Fall „p und q sind<br />

kollinear“<br />

Die verschiedenen Fälle können jeweils durch Verwendung der ccw-<br />

Funktion getestet werden:<br />

1. „p und q sind kollinear“ ⇐⇒<br />

ccw(p1, p2, q1) = ccw(p1, p2, q2) = 0<br />

(bzw. ccw(q1, q2, p1) = ccw(q1, q2, p2) = 0, aber es muß nur eine<br />

der beiden Aussagen überprüft werden)<br />

Der Test auf Überlappung (bzw. Inklusion, siehe Abbildung 3.1<br />

links) soll hier nicht weiter ausgeführt werden, ist jedoch nicht<br />

schwierig, z. B. indem man für die Punkte q1 und q2 die entsprechenden<br />

λ-Werte in<br />

q1 = p1 + λ1(p2 − p1) q2 = p1 + λ2(p2 − p1)<br />

ausrechnet und das sich so ergebende [λ1, λ2]- bzw.<br />

[λ2, λ1]-Intervall mit dem Intervall [0, 1] schneidet.<br />

Fall „p und q sind nicht 2. Falls p und q nicht kollinear sind, ist Eigenschaft (3.9) auf der<br />

kollinear“ vorhergehenden Seite äquivalent zu<br />

konstanter Zeitbedarf für<br />

Streckenschnitt<br />

ccw(p1, p2, q1) · ccw(p1, p2, q2) ≤ 0<br />

∧<br />

ccw(q1, q2, p1) · ccw(q1, q2, p2) ≤ 0 .<br />

(3.10)<br />

Hierbei werden auch gleich die Sonderfälle berücksichtigt (durch<br />

Verwendung von »≤« anstelle von »


3.2 Elementare Lokationsprobleme 29<br />

welche Punkte gleichen Winkels zu Äquivalenzklassen („Richtungen“)<br />

[a]R := { b ∈ R 2 \ (0, 0) � � a ∼R b }<br />

zusammenfaßt und bezeichnen mit<br />

�<br />

W := { [a]R � a ∈ R 2 \ (0, 0) }<br />

die Menge aller Äquivalenzklassen (bez. der Relation R).<br />

Nun wählen wir eine beliebige Richtung [z] ∈ W als „minimales Element“<br />

und definieren die Relation »� [z]« wie folgt:<br />

[a] � [z] [b]<br />

def<br />

⇐⇒<br />

ccw(a, z) ≤ 0 ∧ ccw(b, z) > 0 ∨<br />

ccw(a, z) · ccw(b, z) > 0 ∧ ccw(a, b) ≥ 0 ∨<br />

ccw(a, z) ≤ 0 ∧ ccw(b, z) = 0 ∧ 〈b, z〉 ≤ 0 ∨<br />

ccw(a, z) = 0 ∧ ccw(b, z) ≤ 0 ∧ 〈a, z〉 ≥ 0 .<br />

(3.12)<br />

0<br />

Die Menge W der<br />

Äquivalenzklassen<br />

Diese etwas längliche Definition ist notwendig, um auch alle Sonderfälle<br />

(z. B. »a, b, z sind kollinear«) zu berücksichtigen: Vorsicht bei Sonderfällen!<br />

• Die erste Zeile behandelt den Fall, daß a links von z und b (echt)<br />

rechts von z liegt;<br />

• die zweite Zeile ermittelt die Relation von a und b zueinander,<br />

wenn beide Punkte auf derselben Seite von z liegen;<br />

• die letzten beiden Zeilen behandeln die Sonderfälle, wenn (mindestens)<br />

einer der beiden Punkte kollinear zu z liegt.<br />

Die Relation »�« besitzt die folgenden Eigenschaften:<br />

∀ [a] [a] � [a] (Reflexivität)<br />

∀ [a],[b] [a] � [b] ∧ [b] � [a] =⇒ [a] = [b] (Antisymmetrie)<br />

∀ [a],[b] [a] � [b] ∨ [b] � [a] (Linearität)<br />

∀ [a],[b],[c] [a] � [b] ∧ [b] � [c] =⇒ [a] � [c] (Transitivität)<br />

Somit ist »� [z]« eine Ordnungsrelation auf der Menge W der Richtungen,<br />

die angulare Ordnung (bez. des Strahls [0 z}), und wir können »� [z]« angulare Ordnung<br />

verwenden, um z. B. Punkte nach ihrem Winkel zu sortieren.<br />

Bemerkung 3.6 Die Wahl des „minimalen Elements“ [z] hat keinen Wahl des „minimalen<br />

Elements“ [z]<br />

großen Einfluß auf die angulare Ordnung. Denn sei<br />

[p1] � [z1] [p2] � [z1] · · · � [z1] [pn] ,<br />

dann gibt es für jedes andere „minimale Element“ [z2] ein k ∈ {1, . . . , n−<br />

1}, so daß gilt<br />

[p1+k] � [z2] [p2+k] � [z2] · · · � [z2] [pn+k] ,<br />

wobei [pn+1] = [p1], . . . , [p2n−1] = [pn−1] ist (siehe Abbildung 3.2 auf<br />

der nächsten Seite; hier ist k = 8 beim Wechsel von [z1] zu [z2]). ⊳


30 Grundlegende <strong>Geometrie</strong> in der Ebene<br />

Abbildung 3.2<br />

Einfluß des „minimalen<br />

Elements“ auf die angulare<br />

Ordnung<br />

0<br />

pl<br />

q<br />

pr<br />

Linearer Zeitbedarf bei<br />

Single-shot-Anfrage<br />

4<br />

5<br />

3<br />

6<br />

2<br />

1<br />

10<br />

z1<br />

0<br />

9 7<br />

0<br />

7<br />

8<br />

Bemerkung 3.7 Im folgenden benutzen wir der Einfachheit halber beim<br />

Vergleichen von Punkten anstelle der etwas umständlichen Notation<br />

[a] � [z] [b] die intuitivere Schreibweise a �z b, sind uns dabei jedoch<br />

im klaren, daß anstelle der Punkte eigentlich deren Äquivalenzklassen<br />

gemeint sind. ⊳<br />

Bemerkung 3.8 Oft ist es gar nicht notwendig, die Richtung [z] bezüglich<br />

derer die angulare Ordnung bestimmt wird, besonders auszuzeichnen.<br />

Deshalb verwenden wir im folgenden – wenn nicht anders angegeben<br />

– die positive x-Achse als Referenzstrahl für die angulare Ordnung<br />

und schreiben dafür kurz »�«. ⊳<br />

3.2.5 Sektorbestimmung – Single-shot-Anfrage<br />

Gegeben n Punkte p1, . . . , pn ∈ R 2 , die n Sektoren induzieren, sowie<br />

ein weiterer Anfragepunkt q ∈ R 2 . In welchem Sektor befindet sich q?<br />

Bei einer Single-shot-Anfrage wird für die gegebene Datenmenge (hier,<br />

die n Punkte) nur eine einzige Anfrage gestellt, im Gegensatz zu einer<br />

Multiple-shot-Anfrage, bei der für dieselbe Datenmenge mehrere Anfragen<br />

bearbeitet werden müssen (z. B. hier, m Anfragepunkte q1, . . . , qm).<br />

Eine evtl. aufwendige Vorverarbeitung (engl. preprocessing) lohnt sich also<br />

in der Regel nicht.<br />

Zur Lösung des Problems betrachten wir die angulare Ordnung »�q«<br />

der Punkte bez. des Strahl [0 q}. Dann wird offensichtlich der gesuchte<br />

Sektor von denjenigen Punkten pl und pr begrenzt, für die gilt<br />

∀1≤i≤n pl �q pi und ∀1≤i≤n pi �q pr .<br />

Diese beiden Punkte werden von Algorithmus 3.1 auf der folgenden Seite<br />

mit einem Zeitaufwand von O(n) bestimmt.<br />

3.2.6 Sektorbestimmung – Multiple-shot-Anfrage<br />

Gegeben wiederum n Punkte p1, . . . , pn ∈ R 2 wie in Abschnitt 3.2.5.<br />

Dieses Mal ist es uns jedoch erlaubt, einen gewissen Preprocessing-Aufwand<br />

zu investieren, damit eine Folge von Anfragen schneller beantwortet<br />

werden kann als in Abschnitt 3.2.5, d. h. schneller als in Ω(n) pro<br />

Anfrage.<br />

6<br />

5<br />

8<br />

4<br />

9<br />

3<br />

10<br />

2<br />

1<br />

z2


3.2 Elementare Lokationsprobleme 31<br />

Algorithmus 3.1 Sektorbestimmung – Single-shot-Anfrage<br />

SEKTORSS(q)<br />

Input: n Punkte p1, . . . , pn ∈ R 2<br />

Anfragepunkt q<br />

1 r ← 1 {pr ist der rechte Randpunkt des gesuchten Sektors}<br />

2 l ← 1 {pl ist der linke Randpunkt des gesuchten Sektors}<br />

3 for i ← 2, . . . , n do<br />

4 if pi �q pl then<br />

5 l ← i<br />

6 end if<br />

7 if pr �q pi then<br />

8 r ← i<br />

9 end if<br />

10 end for<br />

Output: q befindet sich im Sektor der beiden Punkte pl und pr<br />

Hierzu sortieren wir in der Preprocessing-Phase die Punkte p1, . . . , pn Preprocessing<br />

bez. ihrer angularen Ordnung »�«. Dies erfordert einen einmaligen Preprocessing-Zeitbedarf<br />

von O(n log n).<br />

Für einen Anfragepunkt q können wir dann denjenigen Sektor, der q<br />

enthält, mittels binärer Suche gemäß Algorithmus 3.2 auf der folgenden binäre Suche<br />

Seite bestimmen. Somit erhalten wir folgenden Satz:<br />

Satz 3.9 Für n Punkte p1, . . . , pn ∈ R 2 , die gemäß ihrer angularen<br />

Ordnung sortiert sind (d. h. p1 � · · · � pn), und einen Anfragepunkt<br />

q ∈ R 2 kann der Sektor, in dem sich q befindet, mit einem Zeitbedarf<br />

von O(log n) bestimmt werden.<br />

logarithmischer Zeitbedarf<br />

bei Multiple-shot-Anfrage


32 Grundlegende <strong>Geometrie</strong> in der Ebene<br />

Algorithmus 3.2 Sektorbestimmung – Multiple-shot-Anfrage<br />

SEKTORMS(q)<br />

Input: n Punkte p1 � · · · � pn ∈ R 2<br />

Anfragepunkt q<br />

1 r ← 0 {pr ist der rechte Randpunkt des gesuchten Sektors}<br />

2 l ← n + 1 {pl ist der linke Randpunkt des gesuchten Sektors}<br />

3 while l − r > 1 do<br />

4 m ← ⌊ l+r<br />

2 ⌋<br />

5 if q � pm then<br />

6 l ← m {q ist „rechts“ von pm, also streiche linke Hälfte}<br />

7 else<br />

8 r ← m {q ist „links“ von pm, also streiche rechte Hälfte}<br />

9 end if<br />

10 end while<br />

11 if r = 0 then<br />

12 r ← n<br />

13 end if<br />

14 if l = n + 1 then<br />

15 l ← 1<br />

16 end if<br />

Output: q befindet sich im Sektor der beiden Punkte pl und pr


Polygone<br />

Definition 4.1 (Polygon) Ein Weg w ⊆ E d , der aus einer endlichen Folge<br />

von Liniensegmenten [p1 p2], [p2 p3], . . . , [pn−1 pn] besteht, heißt eine<br />

polygonale Kette. polygonale Kette<br />

Für eine einfache, geschlossene polygonale Kette w ⊆ E 2 in der Ebene,<br />

nennt man das von w umschlossene innere Gebiet zusammen mit w<br />

selbst ein (einfaches) Polygon P. 1<br />

Polygon<br />

Die Liniensegmente s1 = [p1 p2], s2 = [p2 p3], . . . , sn = [pn p1] heißen<br />

Kanten, ihre Endpunkte p1, . . . , pn Ecken des Polygons. Kanten und Ecken<br />

O. B. d. A. gehen wir dabei davon aus, daß das Polygon entgegen dem<br />

Uhrzeigersinn orientiert ist, d. h. das Polygoninnere liegt immer links<br />

der (orientierten) Liniensegmente [p1 p2], . . . , [pn−1 pn].<br />

Abbildung 4.1 auf der nächsten Seite zeigt links zwei polygonale Ketten,<br />

die beide keine Polygone sind, weil sie entweder nicht geschlossen oder<br />

nicht einfach sind.<br />

Bemerkung 4.2 Ein Polygon speichern wir – wenn nicht ausdrücklich<br />

anders angegeben – durch seine Kantenfolge (s1, s2, . . . , sn) oder seine<br />

Eckenfolge (p1, p2, . . . , pn). Im Gegensatz zu einer Speicherung als Kan-<br />

tenmenge hat dies z. B. den Vorteil, daß beim Zugriff auf das Polygon die<br />

einzelnen Kanten nicht erst wieder einander zugeordnet werden müssen.<br />

Eine Speicherung als Eckenmenge ist sowieso indiskutabel, da dann<br />

das Polygon nur in wenigen Fällen eindeutig bestimmt wäre.<br />

Offenbar sind i. allg. Kanten- und Eckenfolgen nicht ohne weiteres dazu<br />

geeignet, um zu entscheiden, ob zwei Polygone identisch sind, denn<br />

1. können die Folgen zyklisch permutiert sein, und<br />

2. kann ein Polygon auch mehrere strukturell verschiedene Kantenund<br />

Eckenfolgen besitzen, nämlich genau dann, wenn diese aufeinanderfolgende<br />

kollineare Ecken enthalten.<br />

1 Manchmal läßt man die Forderung, daß der Rand ∂P (also w) einfach sein muß, auch<br />

fallen oder erlaubt sogar, daß ∂P unzusammenhängend ist, das Polygon also Löcher besitzen<br />

darf. Um solche Fälle explizit auszuschließen, nennt man P oft ein einfaches Polygon.<br />

4<br />

Speicherung als Kantenoder<br />

Eckenfolge<br />

Nichteindeutige Kantenund<br />

Eckenfolgen aufgrund<br />

kollinearer Ecken


34 Polygone<br />

Abbildung 4.1<br />

Zwei polygonale Ketten<br />

(links) und zwei einfache<br />

Polygone (rechts)<br />

< 0<br />

> 0<br />

Knickwinkel<br />

konvex<br />

konvexe Hülle<br />

Solche Fälle müssen also gesondert behandelt werden, z. B. durch Eliminieren<br />

kollinearer Ecken. ⊳<br />

Um beim Aufzählen von Kanten- und Eckenfolgen nicht immer unnötige<br />

Fallunterscheidungen machen zu müssen, numerieren wir in einem<br />

Polygon mit n Ecken und Kanten diese immer „modulo n“, d. h. sn+1 =<br />

s1, sn+2 = s2, . . . und s0 = sn, s−1 = sn−1, . . . sowie analog für die<br />

Ecken.<br />

Definition 4.3 (Knickwinkel) Für zwei aufeinanderfolgende Segmente<br />

si = [pi pi+1] und si+1 = [pi+1 pi+2] einer polygonalen Kette ist de-<br />

ren Knickwinkel α(si, si+1) ∈ (−π, π) definiert als der Drehwinkel, der<br />

nötig ist, um den Strahl [0 (pi+1 − pi)} in den Strahl [0 (pi+2 − pi+1)} zu<br />

überführen. Linksdrehungen werden hierbei positiv und Rechtsdrehungen<br />

negativ gezählt.<br />

Für j > i ist α(si, sj) := � j−1<br />

k=i α(sk, sk+1) die Summe der Knickwinkel<br />

vom i-ten bis zum j-ten Segment.<br />

Für die Summe α(s1, sn+1) aller Knickwinkel in einem Polygon kann<br />

nun folgendes bewiesen werden:<br />

Satz 4.4 Sei P ein beliebiges Polygon mit n Ecken, dann gilt für die Gesamtsumme<br />

aller Knickwinkel<br />

α(s1, sn+1) = 2π . (4.1)<br />

4.1 Spezialfall »Konvexe Polygone«<br />

Definition 4.5 (Konvexität) Eine Menge A ⊆ Rd heißt konvex, wenn<br />

für je zwei verschiedene Punkte a, b ∈ A auch die Strecke [a b] in A liegt<br />

(siehe Abbildung 4.2 auf der folgenden Seite).<br />

Für eine Menge A ⊆ R d heißt<br />

CH(A) := �<br />

K⊇A<br />

K konvex<br />

K (4.2)<br />

die konvexe Hülle von A (engl. convex hull) und ist die kleinste konve-<br />

xe Menge, die A enthält.


4.1 Spezialfall »Konvexe Polygone« 35<br />

a<br />

b<br />

Bemerkung 4.6 Für konvexe Mengen und Polygone kann man folgendes<br />

zeigen:<br />

1. Der gemeinsame Schnitt endlich vieler konvexer Mengen ist wieder<br />

konvex.<br />

2. Eine Menge A ⊆ E d ist genau dann konvex, wenn es für jeden<br />

Punkt p ∈ ∂A auf dem Rand von A eine (d − 1)-dimensionale<br />

Hyperebene H(n, a) mit p ∈ H(n, a) gibt, so daß A ganz im Halbraum<br />

H + (n, a) liegt.<br />

3. Ein konvexes Polygon P = (p1, . . . , pn) ist gleich der konvexen<br />

Hülle seiner Eckpunkte,<br />

b<br />

P = CH({p1, . . . , pn}) .<br />

Umgekehrt ist die konvexe Hülle einer n-elementigen Punktmenge<br />

(die nicht alle auf einer Geraden liegen) ein konvexes Polygon<br />

mit höchstens n Ecken.<br />

4. Ein konvexes Polygon P = (s1, . . . , sn) ist gleich dem Schnitt von<br />

n Halbebenen,<br />

P =<br />

n�<br />

H + (ni, ai) ,<br />

i=1<br />

wobei die Geraden g(ni, ai) von den Polygonkanten si induziert<br />

werden; die Normalenvektoren ni zeigen dabei in Richtung des<br />

Polygoninneren.<br />

Umgekehrt ist der Schnitt von n Halbebenen – sofern dieser zweidimensional<br />

(d. h. im E 2 innere Punkte besitzt) und beschränkt<br />

(d. h. keinen Halbstrahl enthält) ist – ein konvexes Polygon mit<br />

höchstens n Ecken.<br />

5. Ein konvexes Polygon P = (p1, . . . , pn) ist das einzige Polygon, das<br />

genau {p1, . . . , pn} als Eckenmenge besitzt.<br />

Denn jede Kante [pi pi+k], die nicht zwei benachbarte Ecken verbindet<br />

(d. h. k /∈ {1, n − 1}), trennt die Punkte pi+1, . . . , pi+k−1<br />

von den übrigen Punkten pi+k+1, . . . , pi+n−1 ab, d. h. die Punkte<br />

liegen jeweils auf verschieden Seiten der durch [pi pi+k] induzierten<br />

Geraden. (Sonst wäre P entweder nicht konvex oder – im Fall<br />

a<br />

Abbildung 4.2<br />

Eine konvexe (links) und<br />

eine nicht-konvexe Menge<br />

(rechts) im E 2<br />

si<br />

H + (ni, ai)<br />

P


36 Polygone<br />

a<br />

b<br />

notw. Voraussetzung:<br />

positiver Knickwinkel<br />

pi+2<br />

pi+1<br />

ccw(pi, pi+1,<br />

pi+2) ≥ 0<br />

pi<br />

kollinearer Strecken – nicht einfach.) In jeder der beiden Eckenmengen<br />

muß es jeweils genau eine Ecke geben, die mit [pi pi+k]<br />

verbunden wird, und eine Ecke p, die mit einer Ecke q der anderen<br />

Menge verbunden wird, sonst ergäbe sich keine geschlossene<br />

Kette. Das Segment [p q] schneidet pi pi+k, da p und q auf verschiedenen<br />

Seiten der Geraden liegen. Da aufgrund der Konvexität<br />

von P gilt P ∩ pi pi+k = [pi pi+k], schneidet [p q] auch das<br />

Segment [pi pi+k], denn andernfalls würde [p q] teilweise im Äußeren<br />

von P verlaufen und P wäre nicht konvex.<br />

Somit kann es nur eine einfache polygonale Kette geben, die alle<br />

Punkte p1, . . . , pn verbindet, nämlich P. ⊳<br />

4.1.1 Test auf Konvexität<br />

Wenn wir ein beliebiges Polygon P (in Kanten- oder Eckendarstellung)<br />

gegeben haben, auf welche Weise (und mit welchem Zeitaufwand) können<br />

wir entscheiden, ob das Polygon konvex ist?<br />

Eine notwendige Voraussetzung für die Konvexität ist offenbar, daß al-<br />

le Knickwinkel des Polygons positiv sind (d. h. der Innenwinkel an der<br />

betreffenden Ecke ist kleiner oder gleich π), 2 denn sonst findet man<br />

leicht in der Umgebung der fraglichen Ecke zwei Punkte a und b, so<br />

daß [a b] � P gilt. Mittels der ccw-Funktion (siehe Gleichung (3.7)) können<br />

wir diese Eigenschaft leicht testen, denn für die n Ecken des Polygons<br />

muß in diesem Fall gelten<br />

∀1≤i≤n pi+2 liegt links vom Strahl [pi pi+1}<br />

⇐⇒<br />

∀1≤i≤n ccw(pi, pi+1, pi+2) ≥ 0 ,<br />

wobei wieder pn+1 = p1 und pn+2 = p2 ist.<br />

(4.3)<br />

Es stellt sich nun die Frage, ob diese Eigenschaft auch hinreichend für<br />

die Konvexität ist, d. h. ob jedes Polygon mit ausschließlich positiven<br />

Knickwinkeln konvex ist. Folgendes Lemma beantwortet diese Frage:<br />

Lemma 4.7 Sei P = (p1, . . . , pn) ein Polygon (in Eckendarstellung) mit<br />

ausschließlich positiven Knickwinkeln, d. h. mit ccw(pi, pi+1, pi+2) ≥ 0<br />

für i = 1, . . . , n. Dann ist P konvex.<br />

Beweis: Wir zeigen, daß das gesamte Polygon P links von der Kante<br />

s1 = [p1 p2] liegen muß. Angenommen, dem wäre nicht so, dann<br />

müßte es einen Punkt p ′ ∈ p1 p2 geben, wo die polygonale Kette<br />

[p1 p2], [p2 p3], . . . zum ersten Mal die von der Geraden p1 p2 induzierte<br />

positive Halbebene H + verläßt (siehe Abbildung 4.3 links).<br />

Zwei Fälle für die Lage von p ′ sind möglich: p ′ liegt entweder auf dem<br />

Strahl [p1 p2} oder auf dem Strahl {p1 p2]. O. B. d. A. genügt es, den ersten<br />

Fall zu betrachten, denn im anderen Fall können wir das Polygon<br />

2 Solche Winkel nennt man auch konvex, im Gegensatz zu negativen Knickwinkeln (d. h.<br />

der Innenwinkel ist größer als π), die reflex oder konkav heißen.


4.1 Spezialfall »Konvexe Polygone« 37<br />

an der Normalen zu p1 p2 spiegeln und durch Umkehren des Durchlaufsinns<br />

erhalten wir ein Polygon, auf welches der erste Fall zutrifft.<br />

Sei dann si = [pi pi+1] diejenige Polygonkante, die p ′ enthält. Es kann<br />

nicht sein, daß p ′ = pi = p2 gilt, da beide Knickwinkel (an p2 und an pi)<br />

positiv sind und pi+1 echt rechts von der Geraden p1 p2 liegt.<br />

Wir betrachten jetzt das Polygon P ′ = (p1, p2, p ′ , pi+1, . . . , pn), siehe<br />

Abbildung 4.3 rechts. Da die Summe aller Knickwinkel in P und P ′ nach<br />

Satz 4.4 auf Seite 34 gleich 2π ist, andererseits aber auch die Knickwinkelsummen<br />

α(si, sn+1) (in P) bzw. α([p ′ pi+1], [p1 p2]) (in P ′ ) aufgrund<br />

der Übereinstimmung der beiden Polygone gleich sind, muß gelten<br />

α(s1, si) = α([p1 p2], [p ′ pi+1]) < 0 ,<br />

da p ′ auf dem Strahl [p1 p2} und pi+1 echt rechts vom Strahl [p1 p2} liegt.<br />

Somit muß das Polygon P zwischen den Kanten s1 und si mindestens<br />

einen konkaven Winkel besitzen, im Widerspruch zur Annahme. Folglich<br />

kann ein solcher Punkt p ′ nicht existieren und das Polygon P liegt<br />

links von der Kante s1 = [p1 p2].<br />

Dieselbe Argumentation können wir jetzt bei allen Kanten si (für i =<br />

1, . . . , n) anwenden. Somit können wir zu jedem Punkt p ∈ ∂P auf dem<br />

Rand des Polygons eine Gerade g(n, a) angeben (nämlich die von derjenigen<br />

Kante si induzierte Gerade, auf der p liegt), mit p ∈ g(n, a)<br />

und P ⊆ H + (n, a). Laut Bemerkung 4.6 (2) auf Seite 35 ist P also konvex.<br />

✷<br />

Zusammenfassend erhalten wir also den folgenden Satz:<br />

Satz 4.8 Die Konvexität eines Polygons (mit n Ecken) kann mittels Beziehung<br />

(4.3) auf der gegenüberliegenden Seite mit einem Zeitbedarf<br />

von O(n) getestet werden.<br />

P<br />

H + H +<br />

p1<br />

pi<br />

p2<br />

p ′<br />

pi+1<br />

P ′<br />

p1<br />

p2<br />

p ′<br />

pi+1<br />

linearer Zeitbedarf für<br />

Konvexitätstest<br />

Abbildung 4.3<br />

Zwischen p2 und p ′ hat P<br />

mindestens einen<br />

konkaven Winkel


38 Polygone<br />

linearer Zeitbedarf für<br />

Point-in-polygon-Test<br />

132<br />

132<br />

zyklische angulare<br />

Ordnung<br />

2<br />

1<br />

123<br />

132<br />

Abbildung 4.4<br />

Gebiete gleicher zyklischer<br />

angularer Ordnung<br />

3<br />

4.1.2 Point-in-polygon-Test<br />

Für ein gegebenes konvexes Polygon P – z. B. in Eckendarstellung P =<br />

(p1, . . . , pn) – und einen Anfragepunkt q ∈ E 2 möchten wir wissen, ob<br />

sich q innerhalb oder außerhalb des Polygons befindet.<br />

Aus Bemerkung 4.6 (4) auf Seite 35 folgen sofort die Äquivalenzen<br />

q ∈ P<br />

⇐⇒<br />

∀1≤i≤n q ∈ H + (ni, ai) bzw. ∀1≤i≤n ccw(pi, pi+1, q) ≥ 0 ,<br />

wobei die Geraden g(ni, ai) von den Polygonkanten si induziert werden.<br />

Somit können wir mit einem Zeitbedarf von O(n) testen, ob q im<br />

Polygon P liegt.<br />

Diese Schranke kann jedoch noch unterboten werden, wenn – wie oben<br />

angenommen – das Polygon in Ecken- (oder Kantendarstellung) gegeben<br />

ist. Hierzu betrachten wir die angulare Ordnung der Polygonecken;<br />

allerdings nicht – wie bisher – mit dem Koordinatenursprung als Bezugspunkt,<br />

sondern mit einem variablen Bezugspunkt x. (Natürlich<br />

muß gelten x /∈ {p1, . . . , pn}.) Außerdem verzichten wir aufgrund der<br />

„Zyklizität“ (siehe Bemerkung 3.6 auf Seite 29) auf eine Referenzrichtung,<br />

d. h. es kommt uns nur auf die zyklische angulare Ordnung der<br />

Punkte an.<br />

Auf diese Weise erhalten wir für jeden Bezugspunkt x eine zyklische<br />

Ordnung der Polygonecken und wir können überlegen, welche Punkte<br />

x identische Ordnungen induzieren (und auf diese Weise eine Äquivalenzrelation<br />

auf der Menge R 2 \{p1, . . . , pn} definieren). Die zyklische<br />

angulare Ordnung der Punkte ändert sich offensichtlich genau dann,<br />

wenn der Punkt x einen Strahl [pi (2pi − pj)} (für i �= j) überschreitet,<br />

d. h. einen Strahl der in einem Punkt pi startet und in die zu einem anderen<br />

Punkt pj entgegengesetzte Richtung verläuft.<br />

Abbildung 4.4 zeigt links eine Zerlegung der Ebene in Gebiete gleicher<br />

zyklischer angularer Ordnung für eine sechselementige Punktmenge.<br />

Falls die Punkte Ecken eines konvexen Polygons P sind (wie z. B. rechts<br />

in der Abbildung), dann ist P offensichtlich immer eine Teilmenge des<br />

in der Abbildung farbig markierten Gebietes, denn keiner der die Gebiete<br />

begrenzenden Halbstrahlen schneidet P. Somit folgt für die angulare<br />

Ordnung:


4.2 Spezialfall »Sternförmige Polygone« 39<br />

Beobachtung 4.9 Für ein konvexes Polygon P induzieren alle Punkte<br />

aus P ◦ dieselbe zyklische angulare Ordnung.<br />

Somit können wir für das als Eckenfolge gegebene Polygon P =<br />

(p1, . . . , pn) sofort eine angulare Ordnung »�z« angeben, so daß p1 �z<br />

· · · �z pn gilt: Als Bezugspunkt x wählen wir einen beliebigen Punkt<br />

aus dem Innern von P, z. B. den Schwerpunkt dreier Polygonecken,<br />

pi+pj+pk<br />

3 , und als Referenzrichtung z wählen wir einen beliebigen<br />

Strahl, der rechts von [x p1} und links von [x pn} liegt, z. B. z = [x y}<br />

mit y = p1+pn<br />

2 .<br />

Die durch den Punkt x und zwei jeweils aufeinanderfolgende Polygonecken<br />

pi und pi+1 induzierte Zerlegung der Ebene in Sektoren zerlegt<br />

auch das Polygon P. Aufgrund der angularen Ordnung der Polygonecken<br />

(mit x als Bezugspunkt) ist der Schnitt eines Sektors mit P<br />

jeweils ein Dreieck mit den Eckpunkten x, pi, pi+1. Für den Test, ob<br />

der Anfragepunkt q im Polygon P liegt, genügt es somit, das Dreieck<br />

desjenigen Sektors zu betrachten, in dem sich der Punkt q befindet. Diesen<br />

Sektor können wir (bei angular sortierten Punkten p1 �z · · · �z pn)<br />

nach Satz 3.9 auf Seite 31 mit einem Zeitbedarf von O(log n) bestimmen.<br />

Der Test, ob q innerhalb des entsprechenden Dreiecks liegt, kann wieder<br />

mittels der ccw-Funktion erfolgen (bei konstantem Zeitbedarf). Den für<br />

die angulare Ordnung »�z« benötigten Strahl z können wir ebenfalls<br />

mittels der oben beschriebenen Idee in konstanter Zeit bestimmen. Somit<br />

erhalten wir zusammenfassend den folgenden Satz:<br />

Satz 4.10 Für ein konvexes Polygon P = (p1, . . . , pn) in Eckendarstellung<br />

und einen Anfragepunkt q ∈ E 2 kann der Point-in-polygon-Test<br />

mit einem Zeitbedarf von O(log n) beantwortet werden.<br />

Ist lediglich eine Darstellung des Polygons als Kantenmenge vorhanden,<br />

so kann der Test mit einem Zeitbedarf von O(n) erfolgen.<br />

4.2 Spezialfall »Sternförmige Polygone«<br />

Definition 4.11 (Sichtbarkeitspolygon) Sei P ein Polygon und p, q ∈ P.<br />

Die beiden Punkte p und q heißen füreinander sichtbar (in P), wenn das sichtbar<br />

Liniensegment [p q] komplett im Polygon P enthalten ist, d. h. [p q] ⊂ P<br />

gilt.<br />

Für einen Punkt p ∈ P heißt die Menge<br />

vis(p) := { q ∈ P � � q ist für p sichtbar }<br />

z<br />

p1<br />

p7<br />

y<br />

p6<br />

p2<br />

x<br />

x<br />

pi<br />

p5<br />

p3<br />

pi+1<br />

q<br />

p4<br />

logarithmischer Zeitbedarf<br />

für Point-in-polygon-Test<br />

das Sichtbarkeitspolygon von p in P. Sichtbarkeitspolygon<br />

Zum Experimentieren empfiehlt sich das Java-Applet »VIP 2.0« von<br />

Th. Wolf, welches das Sichtbarkeitspolygon (in linearer Zeit) berechnet<br />

und darstellt (��������������������������������������������������<br />

������������������������� ). WWW☞


40 Polygone<br />

sternförmig<br />

Kern<br />

Kern als Schnitt von<br />

Halbebenen<br />

Definition 4.12 (Sternförmigkeit und Kern eines Polygons)<br />

Ein Polygon P heißt sternförmig, wenn es einen Punkt p ∈ P gibt mit<br />

vis(p) = P .<br />

Die Gesamtheit aller dieser Punkte heißt der Kern von P, d. h.<br />

ker(P) := { p ∈ P � � vis(p) = P } .<br />

Bemerkung 4.13 Offensichtlich gelten folgende Beziehungen:<br />

1. Jedes Sichtbarkeitspolygon vis(p) ist sternförmig und es gilt immer<br />

p ∈ ker(vis(p)).<br />

2. Das Sichtbarkeitspolygon eines Polygon der Komplexität n (d. h. P<br />

besitzt n Ecken) ist von der Komplexität O(n).<br />

3. Jedes konvexe Polygon ist auch sternförmig und es gilt<br />

P ist konvex ⇐⇒ ker(P) = P . ⊳<br />

Der Kern eines Polygons kann auch noch anders charakterisiert werden<br />

als in Definition 4.12, nämlich als Schnitt von Halbebenen:<br />

Lemma 4.14 Sei P mit Kantenfolge (s1, . . . , sn) und g(ni, ai), die von<br />

den Kanten si induzierten Geraden. O. B. d. A. zeigen die Normalenvektoren<br />

ni wieder in das Polygoninnere. Dann gilt<br />

ker(P) =<br />

n�<br />

H + (ni, ai) .<br />

i=1<br />

Beweis: Die »⊆«-Richtung des Beweises ist einfach, denn wäre ein<br />

Punkt p ∈ ker(P) in irgendeiner positiven Halbebene H + (ni, ai) nicht<br />

enthalten, dann würde jede Strecke, die p mit einem Punkt auf si (ausgenommen<br />

deren Endpunkte) verbindet, zumindest teilweise im Äußeren<br />

des Polygons P verlaufen.<br />

Sei umgekehrt p in jeder positiven Halbebene enthalten, dann liegt p<br />

im Polygon P, weil es im anderen Fall mindestens eine Strecke si geben<br />

müßte, die p „von außen“ sieht. Dann müßte aber p in H − (ni, ai) liegen,<br />

im Widerspruch zur Annahme. Läge jetzt p nicht im Kern von P, wäre<br />

vis(p) eine echte Teilmenge von P und es müßte einen Punkt v ∈ P geben,<br />

der von p nicht gesehen wird, d. h. die Strecke [p v] muß mindestens<br />

eine Kante von P schneiden. Sei si die erste Kante, die der Strahl [v p} auf<br />

dem Weg von v zu p schneidet. Dann liegt offensichtlich v in H + (ni, ai)<br />

und p muß sich demnach in H − (ni, ai) befinden, im Widerspruch zu<br />

unserer Annahme. ✷<br />

Sofern ein Polygon also einen zweidimensionalen Kern besitzt, ist dieser<br />

(unter Verwendung von Bemerkung 4.6 (4) auf Seite 35) ein konvexes<br />

Polygon mit O(n) Ecken.


4.2 Spezialfall »Sternförmige Polygone« 41<br />

Lemma 4.15 Für jeden Punkt p eines Polygons P gilt<br />

ker(P) ⊆ ker(vis(p)) .<br />

Beweis: Das Sichtbarkeitspolygon vis(p) besteht zum einen aus Polygonkanten<br />

von P (bzw. Teilen davon) und zum anderen aus künstlichen<br />

Kanten, die durch reflexe Ecken entstehen. Sei HP die Menge der von<br />

Kanten des ersten Typs induzierten positiven Halbebenen und HR die<br />

Menge der von den restlichen Kanten des Sichtbarkeitspolygons induzierten<br />

Halbebenen. Dann gilt nach Lemma 4.14 auf der gegenüberliegenden<br />

Seite für den Kern des Sichtbarkeitspolygons vis(p)<br />

ker(vis(p)) = �<br />

und für den Kern des Polygon P<br />

H + ∈HP<br />

ker(P) = �<br />

H + ∈H<br />

H + ∩ �<br />

H + ,<br />

H + ∈HR<br />

wobei H die Menge aller durch Polygonkanten von P induzierten Halbebenen<br />

darstellt.<br />

Wegen HP ⊆ H folgt sofort ker(P) ⊆ �<br />

H + . Sei nun [r q] irgendeine<br />

∈HP<br />

der künstlichen Kanten von einer reflexen Ecke r zu einem Punkt q auf<br />

dem Polygonrand. Da eine solche Kante kollinear zu p liegen muß, kann<br />

ein Punkt, der sich nicht in der zu dieser Kante gehörenden positiven<br />

Halbebene H + befindet, nicht zugleich p und q sehen. Demzufolge kann<br />

ein solcher Punkt auch nicht aus dem Kern ker(P) sein. Damit gilt also<br />

auch ker(P) ⊆ �<br />

H + und durch beide Inklusionen zusammen folgt<br />

∈HR<br />

die Behauptung. ✷<br />

4.2.1 Point-in-polygon-Test<br />

Wie beim Point-in-polygon-Test für konvexe Polygone (siehe Abschnitt<br />

4.1.2 auf Seite 38) ist wieder ein – diesmal sternförmiges –<br />

Polygon P = (p1, . . . , pn) in Eckendarstellung gegeben. Für einen Anfragepunkt<br />

q soll dann wie zuvor getestet werden, ob sich q innerhalb<br />

oder außerhalb des Polygons befindet.<br />

Wenn wir zusätzlich annehmen, daß wir einen Punkt x ∈ ker(P) kennen,<br />

dann kann der Point-in-polygon-Test ganz analog zum »konvexen<br />

Fall« durchgeführt werden. Betrachten wir wieder die zyklische angulare<br />

Ordnung der Polygonecken und die Zerlegung der Ebene in Gebiete<br />

gleicher angularer Ordnung, dann können wir Beobachtung 4.9 auf<br />

sternförmige Polygone erweitern:<br />

Lemma 4.16 Für ein sternförmiges Polygon P induzieren alle Punkte<br />

aus ker(P) ◦ dieselbe zyklische angulare Ordnung.<br />

H +<br />

q<br />

r<br />

p<br />

H +<br />

Gebiete gleicher zyklischer<br />

angularer Ordnung


42 Polygone<br />

logarithmischer Zeitbedarf<br />

für Point-in-polygon-Test<br />

linearer Zeitbedarf für<br />

Bestimmung des Kerns<br />

Abbildung 4.5<br />

Ein Halbstrahl schneidet<br />

das Innere des<br />

Kerns ker(P)<br />

Beweis: Würden nicht alle Punkte aus ker(P) ◦ dieselbe Ordnung induzieren,<br />

müßte einer der die Gebiete gleicher Ordnung begrenzenden<br />

Halbstrahlen das Innere von ker(P) schneiden (siehe Abbildung 4.5).<br />

Sei p der Startpunkt dieses Halbstrahls und q der die Richtung bestimmende<br />

Punkt. Aufgrund der Sternförmigkeit von P muß q vom Kern<br />

aus sichtbar sein. Deshalb können die beiden mit p inzidenten Polygonkanten<br />

nicht auf verschiedenen Seiten von [q p} liegen, da sonst die Sicht<br />

auf q verdeckt wäre. Somit muß p also eine reflexe Ecke sein und der<br />

in der Abbildung farbig markierte Bereich („zwischen“ p und q) kann<br />

nicht vom ganzen Kern aus eingesehen werden, im Widerspruch zur<br />

Sternförmigkeit von P. ✷<br />

Somit können wir wiederum mit Hilfe des Punktes x (von dem wir jetzt<br />

o. B. d. A. annehmen, daß er sogar im Innern des Kerns von P liegt) für<br />

das als Eckenfolge gegebene Polygon P = (p1, . . . , pn) eine angulare<br />

Ordnung »�z« angeben, so daß p1 �z · · · �z pn gilt: Als Referenzrichtung<br />

z wählen wir wieder einen beliebigen Strahl, der rechts von [x p1}<br />

und links von [x pn} liegt.<br />

Für den Test, ob der Anfragepunkt q im sternförmigen Polygon P liegt,<br />

genügt es jetzt wieder, das Dreieck desjenigen Sektors zu betrachten,<br />

in dem sich der Punkt q befindet. Und dieser Sektor kann bekanntlich<br />

nach Satz 3.9 auf Seite 31 mit einem Zeitbedarf von O(log n) bestimmt<br />

werden. Zusammenfassend erhalten wir somit den folgenden Satz:<br />

Satz 4.17 Für ein sternförmiges Polygon P = (p1, . . . , pn) in Eckendarstellung,<br />

für das ein Punkt x ∈ ker(P) bekannt ist, und einen Anfragepunkt<br />

q ∈ E 2 kann der Point-in-polygon-Test mit einem Zeitbedarf<br />

von O(log n) beantwortet werden.<br />

Für den Fall, daß kein Punkt aus dem Kern von P bekannt ist, sondern<br />

dieser erst bestimmt werden muß, sei der folgende Satz – ohne Beweis –<br />

zitiert:<br />

Satz 4.18 Der Kern eines Polygons mit n Ecken kann mit einem Zeitbedarf<br />

von O(n) berechnet werden.<br />

Ein Beweis und ein Algorithmus zur Berechnung des Kerns finden sich<br />

z. B. in [14, S. 204]. Mit Hilfe von Satz 4.18 können wir jetzt für jedes<br />

sternförmige Polygon, das wir erhalten, in linearer Zeit (also in der Größenordnung<br />

der Eingabekomplexität) einen Kernpunkt bestimmen und<br />

ker(P) p<br />

q<br />

P


4.2 Spezialfall »Sternförmige Polygone« 43<br />

Algorithmus 4.1 Erzeugen eines (sternförmigen) Polygons<br />

STERNPOL(p1, . . . , pn)<br />

Input: n Punkte p1, . . . , pn ∈ E 2<br />

1 Bestimme den Punkt pmin mit minimaler y-Koordinate (bei Punkten<br />

gleicher y-Koordinate, denjenigen mit maximaler x-Koordinate)<br />

2 Sortiere die Punkte {p1, . . . , pn} \ {pmin} nach ihrer angularen Ordnung<br />

»�« mit pmin als Bezugspunkt und der positiven x-Achse als<br />

Referenzrichtung (bei Punkten gleichen Winkels, nach wachsendem<br />

Abstand zu pmin)<br />

(pi1 , . . . , pin−1 ) sei die sortierte Folge<br />

3 P ← (pmin, pi1 , . . . , pin−1 )<br />

Output: P ist ein sternförmiges Polygon mit der<br />

Eckenmenge {p1, . . . , pn}<br />

diesen zusammen mit dem Polygon abspeichern, so daß dann jeder<br />

Point-in-polygon-Test mit logarithmischem Zeitbedarf beantwortet werden<br />

kann.<br />

4.2.2 Erzeugen eines (sternförmigen) Polygons mit vorgegebener<br />

Eckenmenge<br />

Angenommen, wir sollen für eine vorgegebene Punktmenge<br />

{p1, . . . , pn} ⊂ E 2 ein Polygon P bestimmen, das genau diese<br />

Menge als Eckenmenge besitzt. Ist dies immer möglich und – falls ja –<br />

wie schnell können wir das Polygon erzeugen?<br />

Offenbar leistet Algorithmus 4.1 das Gewünschte: Durch die angulare<br />

Sortierung der Punkte bezüglich des extremalen Punktes pmin wird<br />

ausgeschlossen, daß sich zwei nicht inzidente Polygonkanten schneiden<br />

und wir erhalten ein sternförmiges Polygon P mit pmin ∈ ker(P).<br />

Die Laufzeit des Algorithmus wird offensichtlich vom Zeitbedarf für das<br />

Sortieren der n Punkte dominiert und ist aus O(n log n). Es stellt sich<br />

nun die Frage, ob wir mit einem anderen Ansatz diese Schranke noch<br />

unterbieten können. Der folgende Satz zeigt, daß dies nicht möglich ist:<br />

Satz 4.19 Der Zeitbedarf, um zu einer gegebenen Menge von n Punkten<br />

{p1, . . . , pn} ⊂ E 2 ein Polygon zu bestimmen, das genau diese Punkte<br />

als Ecken besitzt, ist aus Θ(n log n).<br />

Beweis: Es genügt, noch zu zeigen, daß die Lösung des Problems im<br />

Worst case einen Zeitbedarf von Ω(n log n) besitzt.<br />

Hierzu reduzieren wir das Sortierproblem, welches nach Satz 2.39 auf<br />

Seite 20 in unserem Berechnungsmodell die Komplexität Ω(n log n) besitzt,<br />

auf unser Problem: Gegeben also n Zahlen, x1, . . . , xn ∈ R, dann<br />

pmin<br />

Zeitbedarf von Θ(n log n)<br />

zur Polygonbestimmung


44 Polygone<br />

Vorsicht! Sonderfälle!<br />

linearer Zeitbedarf für<br />

Point-in-polygon-Test<br />

betrachten wir die Punktmenge<br />

S := {(x1, x 2 1), . . . , (xn, x 2 n)} ,<br />

die wir in linearer Zeit bestimmen können.<br />

Weil alle Punkte von S auf der konvexen Funktion x ↦→ x 2 liegen, gibt<br />

es nach Bemerkung 4.6 (5) auf Seite 35 nur genau ein Polygon, welches<br />

diese Punkte als Eckenmenge besitzt. Zudem liefert uns ein Durchlaufen<br />

der Eckenfolge dieses Polygons in linearer Zeit eine Sortierung der<br />

Zahlen x1, . . . , xn.<br />

Somit haben wir das Sortierproblem in linearer Zeit auf das Problem<br />

der Polygonbestimmung reduziert und erhalten für dieses eine untere<br />

Schranke von Ω(n log n − n) = Ω(n log n). ✷<br />

4.3 Point-in-polygon-Test bei allgemeinen Polygonen<br />

Für beliebige einfache Polygone läßt sich der Point-in-polygon-Test<br />

nicht so elegant lösen wie im Fall konvexer oder sternförmiger Polygone,<br />

da es i. allg. keine Zerlegung der Ebene in Sektoren gibt, so daß der<br />

Schnitt jedes Sektors mit dem Polygon genau ein Dreieck ergibt (sonst<br />

wäre das Polygon ja auch sternförmig).<br />

Allerdings können wir uns den Jordanschen Kurvensatz zunutze machen<br />

und die Anzahl der Schnitte des Polygonrandes mit einem Strahl<br />

vom Anfragepunkt q aus ins „Unendliche“ zählen. Ist diese nämlich<br />

ungerade, dann liegt q offensichtlich innerhalb von P, sonst außerhalb<br />

(Sonderfälle, in denen q auf dem Rand von P liegt, sollen hier unberücksichtigt<br />

bleiben; diese können aber z. B. separat in linearer Zeit ausgeschlossen<br />

werden). Algorithmus 4.2 auf der folgenden Seite bestimmt<br />

genau diese Anzahl an Schnitten. Der Punkt ˜p liegt dabei in jedem Fall<br />

außerhalb von P.<br />

Beim Zählen der Schnitte treten allerdings leicht Sonderfälle auf (wenn<br />

z. B. Polygonecken oder -kanten auf dem Segment liegen), die geeignet<br />

berücksichtigt werden müssen, so daß keine Schnitte übersehen oder<br />

doppelt gezählt werden. Algorithmus 4.2 berücksichtigt dies, indem<br />

nicht alle Schnitte von Polygonkanten mit dem Strahl gezählt werden,<br />

sondern nur solche, bei denen beim Durchlauf der Eckenfolge ein Wechsel<br />

des Eckpunktes auf die andere Seite des Strahls erfolgt. Hierzu wird<br />

wieder die ccw-Funktion aus Abschnitt 3.2.2 verwendet.<br />

Der Zeitbedarf von Algorithmus 4.2 ist offensichtlich linear in der Zahl<br />

der Polygonecken, so daß wir folgenden Satz erhalten:<br />

Satz 4.20 Für ein beliebiges Polygon P = (p1, . . . , pn) in Eckendarstellung<br />

und einen Anfragepunkt q ∈ E 2 kann der Point-in-polygon-Test<br />

mit einem Zeitbedarf von O(n) beantwortet werden.


4.3 Point-in-polygon-Test bei allgemeinen Polygonen 45<br />

Algorithmus 4.2 Point-in-polygon-Test<br />

POINTINPOLYGON(q)<br />

Input: Beliebiges Polygon P = (p1, . . . , pn) ⊂ E 2<br />

Anfragepunkt q<br />

1 Bestimme einen Punkt ˜p außerhalb von P (z. B. anhand der maximalen<br />

Koordinatenwerte der Eckpunkte)<br />

{Suche einen Eckpunkt, der nicht auf ˜p q liegt}<br />

2 i ← 1<br />

3 while ccw( ˜p, q, pi ) = 0 do<br />

4 i ← i + 1<br />

5 end while<br />

6 s ← 0 {s zählt die Anzahl der Schnitte von [ ˜p q] mit ∂P}<br />

7 lr ← sgn(ccw( ˜p, q, pi )) {lr ∈ {−1, 0, 1}}<br />

8 for j ← i + 1, . . . , n do<br />

9 lrnew ← sgn(ccw( ˜p, q, pj ))<br />

10 if |lrnew − lr| = 2 then<br />

11 lr ← lrnew<br />

12 if ccw(pj−1, pj , ˜p) · ccw(pj−1, pj , q) ≤ 0 then<br />

13 s ← s + 1 { ˜p und q liegen auf versch. Seiten von [pj−1 pj ]}<br />

14 end if<br />

15 end if<br />

16 end for<br />

Output: Ist s ungerade, befindet sich q innerhalb von P, sonst<br />

außerhalb


Das<br />

Plane-sweep-Paradigma<br />

Das Sweep-Paradigma ist eine algorithmische Technik, die zur Lösung<br />

einer Vielzahl von geometrischen Problemen verwendet werden kann.<br />

Das Gemeinsame an allen Sweep-Verfahren ist, daß aus einem statischen<br />

d-dimensionalen Problem ein dynamisches (d − 1)-dimensionales Problem<br />

wird, indem eine der räumlichen Dimensionen in eine zeitliche Dimension<br />

verwandelt wird. Bezogen auf die zweidimensionalen Probleme,<br />

mit denen wir uns beschäftigen, heißt das, daß ein solches Problem in<br />

eine Folge eindimensionaler Probleme transformiert wird.<br />

Dieses Verwandeln geschieht in der Regel dadurch, daß eine eindimensionale<br />

Struktur – z. B. eine Gerade (die Sweep line) – horizontal über die Sweep line<br />

Problemanordnung hinwegwandert. Die Problemanordnung selbst (die<br />

sich u. U. während die Sweep line sie überquert auch noch ändern kann)<br />

wird hierbei in der sog. Horizontalstruktur verwaltet. Horizontalstruktur<br />

An einigen diskreten Stellen hält die Sweep line dann an, um jeweils ein<br />

eindimensionales Problem zu bearbeiten. Die für die Bearbeitung dieses<br />

Problems nötige Informationsmenge ist in der Regel sehr viel kleiner<br />

als das zu lösende Gesamtproblem und wird in der sog. Vertikalstruktur Vertikalstruktur<br />

verwaltet. Diese kann – z. B. bei sehr einfachen Problemen – an jedem<br />

Haltepunkt der Sweep line neu erzeugt werden, wird aber in der Regel<br />

nur von einem Haltepunkt zum nächsten Haltepunkt geeignet fortgeführt.<br />

Die Gesamtlösung des zweidimensionalen Problems ergibt sich dann<br />

durch eine geeignete Verknüpfung der Folge von Teillösungen der eindimensionalen<br />

Probleme.<br />

5.1 Das Problem des dichtesten Punktepaares<br />

Gegeben n Punkte p1, . . . , pn ∈ E 2 , dann besteht das Closest-pair-<br />

Problem darin, zwei Punkte pi, pj (i �= j) mit minimalem euklidischen Closest-pair-Problem<br />

Abstand zu finden, d. h.<br />

|pi pj| = min<br />

1≤k


48 Das Plane-sweep-Paradigma<br />

MinDist<br />

Ein naiver Algorithmus zur Bestimmung des dichtesten Punktepaares<br />

berechnet alle Θ(n 2 ) Abstandspaare zwischen je zwei Punkten und<br />

wählt hiervon den kleinsten aus. Die Laufzeit dieses Algorithmus ist<br />

also aus O(n 2 ). Diese Schranke wollen wir mittels eines Plane-sweep-<br />

Ansatzes unterbieten.<br />

Problem im Das analoge Problem im Eindimensionalen, zu einer Menge von Zah-<br />

Eindimensionalen len x1, . . . , xn ∈ R das dichteste Paar zu finden, ist uns schon in Beispiel<br />

2.37 auf Seite 19 begegnet. Wir lösen es (mit einem Zeitbedarf<br />

von O(n log n)), indem wir die Zahlen zunächst sortieren. Dann können<br />

wir die Tatsache ausnutzen, daß zwei Zahlen, die ein dichtestes Paar<br />

bilden, in der Sortierung direkt aufeinander folgen müssen. Somit können<br />

wir dieses Paar mit einem eindimensionalen Sweep über alle Zahlen<br />

bestimmen, wobei unser Sweep point an jeder Zahl Halt macht und wir<br />

ein nulldimensionales Problem lösen müssen: Wir müssen die Differenz<br />

der aktuellen und der vorhergehenden Zahl bestimmen und diese mit<br />

der bisher kleinsten Differenz vergleichen.<br />

MinDist<br />

Im Zweidimensionalen wollen wir jetzt so ähnlich vorgehen. Die Kernpunkte<br />

unserer Idee sind hierbei die folgenden:<br />

Horizontalstruktur Wir sortieren zunächst alle Punkte nach ihrer<br />

x-Koordinate, d. h. die Horizontalstruktur, die sich in diesem Fall<br />

während der gesamten Algorithmenausführung nicht ändert,<br />

wird in einem Preprocessing-Schritt als sortierte Liste initialisiert.<br />

Der Zeitaufwand hierfür ist aus O(n log n).<br />

Sweep line Die Sweep line lassen wir von links nach rechts über die<br />

Punkte gleiten, wobei wir an jedem Punkt Halt machen.<br />

Sei MinDist der minimale Abstand unter allen bereits abgearbeiteten<br />

Punkten, d. h. der Abstand zweier Punkte, die links der aktuellen<br />

Sweep line liegen. Um zu testen, ob der aktuelle Punkt (auf<br />

der Sweep line) diesen Abstand noch unterbieten kann, genügt es<br />

offensichtlich, alle Punkte zu betrachten, die sich in einem Streifen<br />

der Breite MinDist links der Sweep line befinden.<br />

Vertikalstruktur Dieser Streifen (bzw. die Punkte, die er enthält) muß<br />

also mittels unserer Vertikalstruktur (möglichst effizient) verwaltet<br />

werden. Wir verwenden hierfür einen balancierten Suchbaum<br />

(z. B. einen AVL-Baum), der für alle drei Operationen »Suchen«,<br />

»Einfügen« und »Löschen« eine logarithmische Zugriffszeit garantiert.<br />

Außerdem sind Bereichsanfragen mit einem Zeitbedarf<br />

von O(log n + k) möglich, wobei k die Größe der Antwort beschreibt.<br />

Die Punkte werden dabei bezüglich ihrer y-Koordinate im AVL-<br />

Baum verwaltet.<br />

Es müssen jetzt nur noch die folgenden Fragen geklärt werden:<br />

• Zu welchen Zeitpunkten muß die Vertikalstruktur aktualisiert<br />

werden.


5.1 Das Problem des dichtesten Punktepaares 49<br />

• Welche Aktionen müssen bei einer Aktualisierung jeweils durchgeführt<br />

werden?<br />

• Wie hoch ist der Gesamtzeitaufwand des Plane-sweep-Algorithmus?<br />

Dieser Aufwand sollte in jedem Fall geringer sein als Ω(n 2 ),<br />

denn sonst hätten wir keinen Vorteil gegenüber dem naiven Verfahren<br />

erreicht.<br />

Offenbar gibt es zwei Typen von Ereignissen, die eine Aktualisierung<br />

der Vertikalstruktur erfordern:<br />

1. Der linke Rand des Streifens, der im Abstand MinDist der Sweep<br />

line „folgt“, wandert über einen Punkt hinweg.<br />

2. Die Sweep line stößt auf einen neuen Punkt.<br />

Im ersten Fall, muß der betreffende Punkt aus der Vertikalstruktur entfernt<br />

werden (mit einem Zeitbedarf von O(log n)). Im zweiten Fall,<br />

wenn die Sweep line auf einen neuen Punkt stößt, muß der Punkt in die<br />

Vertikalstruktur aufgenommen werden. Außerdem muß getestet werden,<br />

ob der neu aufgenommene Punkt zu irgendeinem anderen Punkt<br />

im Streifen einen geringeren Abstand als den momentan minimalen Abstand<br />

MinDist besitzt. Falls dies der Fall ist, muß der Wert von MinDist<br />

und damit auch die Streifenbreite aktualisiert werden. Hierdurch können<br />

in der Folge auch wieder Ereignisse des ersten Typs ausgelöst werden<br />

– ohne daß die Sweep line weiterwandert.<br />

Zwei Typen von<br />

Ereignissen<br />

Diese Vorgehensweise wird in Algorithmus 5.1 auf der folgenden Seite<br />

realisiert. Hierbei bedarf Schritt 12 – die Bestimmung des minimalen<br />

Abstands des aktuellen Punktes zu allen Punkten aus dem Streifen –<br />

einer genaueren Erläuterung: Zur Bestimmung dieses Abstands müssen<br />

nämlich nicht alle Punkte in dem Streifen der Breite MinDist betrachtet<br />

werden (dies können u. U. immer noch sehr viele sein, z. B. bei einer<br />

vertikalen Anordnung der Punkte), sondern nur diejenigen, die sich in<br />

einem Rechteck der Breite MinDist und der Höhe 2 · MinDist um den<br />

aktuellen Punkt herum befinden. MinDist<br />

Dieses Rechteck kann man sich nun in acht rechtwinklige gleichseitige<br />

Dreiecke unterteilt vorstellen, deren längste Seite jeweils gleich MinDist<br />

ist. Da nach Voraussetzung der minimale Abstand aller Punkte links<br />

der Sweep line gleich MinDist ist, kann jedes dieser Dreiecke maximal<br />

einen Punkt enthalten – das gesamte Rechteck also maximal acht Punkte.<br />

Diese Punkte entsprechen demnach im AVL-Baum einem Teilbaum,<br />

der aus maximal acht Knoten besteht, und können durch zwei Suchanfragen<br />

(nach »HS rechts.y − MinDist« bzw. »HS rechts.y + MinDist«) und<br />

Enumeration der dazwischen liegenden Knoten bestimmt werden. Der<br />

Zeitbedarf hierfür ist aus O(log n + 8) = O(log n).<br />

Folgender Satz faßt unsere Überlegungen noch einmal zusammen:<br />

Satz 5.1 Für eine Menge von n Punkten p1, . . . , pn ∈ E 2 können zwei<br />

Punkte pi, pj (i �= j) mit minimalem euklidischen Abstand, d. h.<br />

|pi pj| = min<br />

1≤k


50 Das Plane-sweep-Paradigma<br />

Zeitbedarf von Θ(n log n)<br />

für dichtestes Punktepaar<br />

Algorithmus 5.1 Bestimmung des dichtesten Punktepaares in der Ebene<br />

CLOSESTPAIR(p1, . . . , pn)<br />

Input: n Punkte p1, . . . , pn ∈ E 2<br />

{Initialisierungsschritt}<br />

1 Sortiere die Punkte p1, . . . , pn nach aufsteigenden x-Koordinaten<br />

und füge sie ins Feld HS ein<br />

2 VS ← AVL-Baum, initialisiert mit HS 1 und HS 2<br />

3 MinDist ← |HS 1 HS 2|<br />

4 MinPair ← (1, 2)<br />

5 links ← 1 {HS links ist der am weitesten links liegende Punkt im<br />

Streifen}<br />

6 rechts ← 3 {HS rechts ist der aktuelle Punkt auf der Sweep line}<br />

{Sweep}<br />

7 while rechts ≤ n do<br />

8 if HS links.x + MinDist ≤ HS rechts.x then<br />

9 Entferne HS links aus VS<br />

10 links ← links + 1<br />

11 else<br />

12 Bestimme den minimalen Abstand D = |HS rechts HS min|<br />

von HS rechts zu allen Punkten in VS<br />

13 if D < MinDist then<br />

14 MinDist ← D<br />

15 MinPair ← (rechts, min)<br />

16 end if<br />

17 Füge HS rechts in VS ein<br />

18 rechts ← rechts + 1<br />

19 end if<br />

20 end while<br />

Output: Dichtestes Punktepaar MinPair mit minimalem<br />

Abstand MinDist<br />

mit einem optimalen Zeitbedarf von Θ(n log n) gefunden werden. Der<br />

Speicherbedarf ist dabei aus Θ(n).<br />

Beweis: Die Initialisierung der Horizontalstruktur hat einen Zeitbedarf<br />

von O(n log n) für das Sortieren der Punkte.<br />

Die while-Schleife des Algorithmus wird O(n)-mal durchlaufen, da jeder<br />

Punkt höchstens einmal in die Vertikalstruktur aufgenommen und<br />

höchstens einmal daraus entfernt wird. Sowohl das Entfernen aus der<br />

Vertikalstruktur als auch das Einfügen in diese erfordern O(log n) Zeit.<br />

Da nach obigen Überlegungen auch Schritt 12 des Algorithmus in logarithmischer<br />

Zeit zu bewerkstelligen ist, erhält man einen Zeitbedarf<br />

von O(log n) für einen Schleifendurchlauf.<br />

Insgesamt erhalten wir also eine Gesamtlaufzeit von O(n log n) für Algorithmus<br />

5.1.<br />

Die Optimalität folgt dann aus einer unteren Schranke von Ω(n log n)


5.2 Schnitt konvexer Polygone 51<br />

für das Problem des dichtesten Paares (selbst im eindimensionalen Fall).<br />

Auf den Beweis dieser Schranke wollen wir hier verzichten; er ähnelt<br />

jedoch dem Beweis von Satz 2.39 auf Seite 20 für die untere Schranke<br />

von O(n log n) für das Sortierproblem.<br />

Der Speicherbedarf der Horizontal- und der Vertikalstruktur ist dabei<br />

jeweils linear in der Zahl der gespeicherten Punkte und somit, da jeweils<br />

maximal O(n) Punkte darin enthalten sind, aus Θ(n). ✷<br />

5.2 Schnitt konvexer Polygone<br />

Gegeben zwei Polygone P = (p1, . . . , pm) und Q = (q1, . . . , qn), dann<br />

interessiert uns zum einen, ob die beiden Polygone sich schneiden, und<br />

zum anderen eine Beschreibung der Schnittmenge. Offensichtlich gilt:<br />

Beobachtung 5.2 Der Schnitt zweier beliebiger Polygone P =<br />

(p1, . . . , pm) und Q = (q1, . . . , qn) kann im Worst case aus Ω(mn) Polygonen<br />

bestehen und somit eine Gesamtkomplexität von Ω(mn)<br />

besitzen.<br />

Der Schnitt zweier konvexer Polygone P = (p1, . . . , pm) und Q =<br />

(q1, . . . , qn) ist entweder leer, niederdimensional (d. h. ein Punkt oder<br />

eine Strecke) oder ein konvexes Polygon der Komplexität O(m + n).<br />

(Dies folgt sofort aus Bemerkung 4.6 (4) auf Seite 35.) Im Worst case kann<br />

diese Schranke auch angenommen werden, z. B. beim Schnitt zweier regelmäßiger<br />

n-Ecke, die um den Winkel π<br />

n gegeneinander verdreht sind.<br />

Da also der Schnitt konvexer Polygone – schon strukturell – beträchtlich<br />

einfacher ist, beschränken wir uns in diesem Abschnitt zunächst auf die<br />

Schnittbestimmung konvexer Polygone – wiederum mittels eines Planesweep-Verfahrens.<br />

Die Grundidee hierbei ist, die Ebene in eine Menge vertikaler Streifen<br />

zu zerlegen und die Streifen von links nach rechts zu bearbeiten. Jede<br />

Ecke eines der beiden Polygone induziert dabei eine vertikale Gerade<br />

und die Menge aller auf diese Weise entstehenden Geraden unterteilt<br />

die Ebene in O(n + m) Streifen. Innerhalb eines Streifens Si kann dann<br />

der Schnitt (P ∩ Si) ∩ (Q ∩ Si) sehr einfach berechnet werden, da jedes<br />

„Bruchstück“ P ∩ Si bzw. Q ∩ Si maximal vier Ecken besitzt.<br />

Horizontalstruktur Die Liste der Halteereignisse für die Sweep line besteht<br />

genau aus der Menge aller Polygonecken von P und Q – sortiert<br />

bez. ihrer x-Koordinate.<br />

Um diese Liste zu erzeugen, müssen wir die Polygonecken nicht<br />

explizit sortieren, sondern können uns wieder zunutze machen, daß<br />

die Polygone in Eckendarstellung (also bereits angular sortiert) gegeben<br />

sind. Denn unabhängig von der Wahl der Anfangsecke p1<br />

eines konvexen Polygons P = (p1, . . . , pm), besteht die Folge<br />

der x-Koordinaten p1.x, . . . , pm.x aus maximal drei x-monotonen<br />

im Worst case Ω(mn)<br />

Schnittpolygone<br />

im Worst case Ω(m + n)<br />

Schnittpolygone


52 Das Plane-sweep-Paradigma<br />

p1<br />

linearer Zeitbedarf für<br />

Schnitt konvexer Polygone<br />

Teilfolgen. Diese können (zusammen mit den maximal drei Teilfolgen<br />

des Polygons Q) mittels Mergesort in linearer Zeit zu einer<br />

sortierten Folge verschmolzen werden.<br />

Vertikalstruktur Während die Sweep line die Haltepunkte der Horizontalstruktur<br />

von links nach rechts abarbeitet, müssen wir uns<br />

in der Vertikalstruktur lediglich für jedes der beiden Polygone P<br />

und Q die zwei aktiven Kanten merken, die momentan von der<br />

Sweep line geschnitten werden. Die Aktualisierung dieser Kanten<br />

von einem Streifen zum nächsten entspricht gerade einem Durchlauf<br />

der Kantenfolgen – entweder im oder gegen den Uhrzeigersinn,<br />

je nachdem, ob die Kante das Polygon von oben oder von<br />

unten begrenzt.<br />

Sweep line An jedem Haltepunkt der Sweep line bestimmen wir die<br />

Schnittmenge (P ∩ Si) ∩ (Q ∩ Si) im aktuellen Streifen Si mit Hilfe<br />

der momentan aktiven Kanten der beiden Polygone. Da die<br />

„Bruchstücke“ nur Trapeze oder Dreiecke sein können, erfordert<br />

dies nur einen konstanten Zeitbedarf. Im Falle eines Schnitts im<br />

aktuellen Streifen müssen wir nur noch dafür sorgen, daß die Gesamtschnittmenge<br />

entsprechend aktualisiert wird.<br />

Zusammenfassend erhalten wir dann den folgenden Satz:<br />

Satz 5.3 Der Schnitt zweier konvexer Polygone P = (p1, . . . , pm)<br />

und Q = (q1, . . . qn) kann mit einem optimalen Zeitbedarf von Θ(m+n)<br />

ermittelt werden, wobei im Falle eines (zweidimensionalen) Schnitts ein<br />

Polygon in Ecken- oder Kantendarstellung zurückgeliefert wird. Der<br />

Speicherbedarf ist dabei aus Θ(m + n).<br />

Beweis: Die Initialisierung der Horizontalstruktur hat – wie oben beschrieben<br />

– einen Zeitbedarf von O(m + n). Jedes der m + n Halteereignisse<br />

der Sweep line kann in konstanter Zeit bearbeitet werden und ein<br />

eventuelles Postprocessing (z. B. zum Erzeugen der Eckenfolge) erfordert<br />

auch nur lineare Zeit.<br />

Die Optimalität, d. h. eine untere Schranke von O(m + n), folgt aus dem<br />

eingangs erwähnten Beispiel der beiden n-Ecke. Der lineare Speicherbedarf<br />

folgt wieder aus den Eigenschaften der verwendeten Datenstrukturen.<br />

✷<br />

5.3 Anwendung »Schnitt von Halbebenen«<br />

Den zeitoptimalen Algorithmus aus dem letzten Abschnitt zur Schnittberechnung<br />

zweier konvexer Polygone können wir (leicht modifiziert)<br />

auch dazu verwenden, für n Halbebenen H +<br />

1 , . . . , H+ n im E2 deren<br />

Schnittmenge<br />

P = H +<br />

1 ∩ · · · ∩ H+ n


5.3 Anwendung »Schnitt von Halbebenen« 53<br />

zu bestimmen.<br />

Hierzu erweitern wir zunächst den Polygonbegriff, um auch unbeschränkte,<br />

geradlinig begrenzte Gebiete beschreiben zu können:<br />

Definition 5.4 (Unbeschränktes Polygon)<br />

Sei eine einfache polygonale Kette w = [p2 p3], . . . , [pn−2 pn−1] ⊂ E 2<br />

gegeben (wobei auch die „leere Kette“ zugelassen ist), sowie zwei sich<br />

nicht schneidende Halbstrahlen {p1 p2] und [pn−1 pn}, so daß w weder<br />

von {p1 p2] noch von [pn−1 pn} geschnitten wird.<br />

Dann nennt man dasjenige von<br />

{p1 p2], [p2 p3], . . . , [pn−2 pn−1], [pn−1 pn}<br />

berandete Gebiet (inklusive seines Randes), welches links von [p2 p3]<br />

liegt, ein (einfaches) unbeschränktes Polygon, i. Z.<br />

P = ({p1 p2], p2, . . . , pn−1, [pn−1 pn}) .<br />

Die Begriffe »Knickwinkel«, »konvex«, »sternförmig« usw., sowie viele<br />

der im letzten Kapitel gezeigten Eigenschaften können jetzt auch auf den<br />

Fall unbeschränkter Polygone übertragen werden.<br />

Somit ist es ist nicht schwer, den Algorithmus zum Schnitt konvexer Polygone<br />

aus Abschnitt 5.2 so zu verallgemeinern, daß sowohl (konvexe)<br />

beschränkte Polygone P und Q als auch unbeschränkte Polygone<br />

P = ({p1 p2], p2, . . . , pm−1, [pm−1 pm}) und<br />

Q = ({q1 q2], q2, . . . , qn−1, [qn−1 qn})<br />

verarbeitet werden können. Ein konvexes unbeschränktes Polygon P<br />

kann nämlich immer als Vereinigung eines konvexen beschränkten<br />

Polygons Pb und eines konvexen unbeschränkten Polygons Pu der<br />

Form {p1 p2], [p2 p3], [p3 p4} geschrieben werden.<br />

Dann gilt offensichtlich<br />

P ∩ Q = (Pb ∩ Qb) ∪ (Pb ∩ Qu) ∪ (Pu ∩ Qb) ∪ (Pu ∩ Qu)<br />

und wir können die Teilprobleme separat lösen, nämlich<br />

• die erste Schnittmenge mittels des Algorithmus aus Abschnitt 5.2<br />

mit einem Zeitbedarf O(m + n),<br />

• die zweite und dritte Schnittmenge durch Schnitt eines Polygons<br />

der Komplexität O(m) bzw. O(n) mit drei Halbebenen mit einem<br />

Zeitbedarf von O(m) bzw. O(n),<br />

• die letzte Schnittmenge durch Schnitt von sechs Halbebenen in<br />

konstanter Zeit.<br />

Wir erhalten also das folgende Korollar zu Satz 5.3:<br />

p1<br />

p2<br />

pn−1<br />

pn<br />

p3<br />

unbeschränktes Polygon<br />

Pu<br />

Pb


54 Das Plane-sweep-Paradigma<br />

linearer Zeitbedarf für<br />

Schnitt konvexer<br />

unbeschränkter Polygone<br />

Divide-and-conquer-Ansatz<br />

Zeitbedarf von Θ(n log n)<br />

für den Halbebenenschnitt<br />

untere Schranke mittels<br />

Reduktion des<br />

Sortierproblems<br />

Korollar 5.5 Der Schnitt zweier konvexer unbeschränkter Polygone<br />

P = ({p1 p2], p2, . . . , pm−1, [pm−1 pm}) und<br />

Q = ({q1 q2], q2, . . . , qn−1, [qn−1 qn})<br />

kann mit einem optimalen Zeitbedarf von Θ(m+n) sowie Θ(m+n) Speicher<br />

ermittelt werden.<br />

Zum Lösen des eigentlichen Problems, den Schnitt von n Halbebenen<br />

zu bestimmen, führen wir dieses zurück auf die Schnittbestimmung für<br />

konvexe unbeschränkte Polygone. Denn der Schnitt einer Menge von<br />

Halbebenen ist entweder leer, niederdimensional (d. h. Punkt, Gerade,<br />

Halbstrahl oder Segment), ein beschränktes oder ein unbeschränktes<br />

konvexes Polygon.<br />

Wir können also jetzt mittels eines Divide-and-conquer-Ansatzes die Menge<br />

der n Halbebenen in zwei ungefähr gleichmächtige Mengen<br />

H +<br />

1 , . . . H+<br />

⌊n/2⌋<br />

und H+<br />

⌊n/2⌋+1 , . . . , H+ n<br />

zerlegen, deren Schnittmengen (rekursiv) berechnen und dann (sofern<br />

beide Mengen nicht leer oder niederdimensional sind) deren gemeinsamen<br />

Schnitt nach Korollar 5.5 in linearer Zeit berechnen.<br />

Für den Gesamtzeitbedarf t(n) erhalten wir dann die Rekursionsgleichung<br />

t(n) = 2 · t(n/2) + O(n) ,<br />

die zu t(n) ∈ O(n log n) führt. Wir fassen dies in folgendem Satz zusammen:<br />

Satz 5.6 Der Schnitt von n beliebigen Halbebenen im E 2 kann mit einem<br />

optimalen Zeitbedarf von Θ(n log n) und O(n) Speicher bestimmt<br />

werden.<br />

Beweis: Wir müssen nur noch die (asymptotische) Worst-case-Optimalität<br />

zeigen. Hierzu reduzieren wir wieder – ähnlich wie im Beweis zu<br />

Satz 4.19 auf Seite 43 – das Sortierproblem auf unser Problem: Aus ei-<br />

ner Menge von n Zahlen, x1, . . . , xn ∈ R, erzeugen wir eine Menge von<br />

n Halbebenen, H +<br />

1 , . . . , H+ n, so daß für xi<br />

1. die zugehörige Begrenzungsgerade durch den Punkt (xi, x2 i ) verläuft,<br />

2. die Begrenzungsgerade eine Tangente an die Funktion x ↦→ x 2 ist,<br />

3. die Funktion x ↦→ x 2 in der positiven Halbebene H +<br />

i verläuft.<br />

Ein Durchlaufen der Schnittmenge dieser Halbebenen liefert uns dann<br />

wieder eine Sortierung der Zahlen x1, . . . , xn. ✷


5.4 Schnitt von Liniensegmenten 55<br />

Bemerkung 5.7 Die untere Schranke des obigen Satzes ist kein Widerspruch<br />

zu Satz 4.18 auf Seite 42 (über die Bestimmung eines Kernpunktes<br />

in linearer Zeit), denn bei der Bestimmung des Kerns eines Polygons<br />

besitzt man mehr Information als hier in unserem Fall – nämlich die<br />

Durchlaufordnung des Polygons.<br />

Deshalb kann man den Kern eines Polygons, der sich ja auch als Schnitt<br />

von Halbebenen darstellen läßt, in linearer Zeit ermitteln, obwohl im<br />

allgemeinen Fall beliebiger Halbebenen ein Zeitbedarf von Ω(n log n)<br />

erforderlich ist. ⊳<br />

Bemerkung 5.8 Aus obigem Satz folgt sofort, daß jedes lineare Programm<br />

1 im R 2 mit n Restriktionen mit einem Zeitbedarf von O(n log n)<br />

gelöst werden kann.<br />

Allerdings ist es bei einem linearen Programm im R 2 gar nicht nötig, alle<br />

berandenden Strecken des erlaubten Bereiches zu kennen, um dieses zu<br />

lösen! Megiddo [16] und Dyer [7] haben bereits 1983 bzw. 1984 gezeigt,<br />

daß lineare Programme im R 2 und im R 3 in linearer Zeit gelöst werden<br />

können. ⊳<br />

5.4 Schnitt von Liniensegmenten<br />

Gegeben n Liniensegmente s1 = [p1 q1], . . . , sn = [pn qn] ⊂ E 2 , dann<br />

interessieren wir uns für die folgenden zwei Probleme:<br />

1. Schneiden sich (mindestens) zwei der n Segmente?<br />

2. Bestimme alle Schnittpunkte der n Segmente.<br />

Offenbar lassen sich beide Probleme wieder mittels eines naiven Algorithmus<br />

lösen, der schlicht alle Θ(n 2 ) Paare von Segmenten auf Schnitt<br />

testet und ggf. deren Schnittpunkt ausgibt. Außerdem ist auch klar, daß<br />

im Worst case tatsächlich Θ(n 2 ) Schnittpunkte existieren können, z. B.<br />

beim Schnitt von n horizontalen mit n vertikalen Segmenten.<br />

Oft wird diese maximal möglich Schnittpunktzahl jedoch gar nicht erreicht;<br />

der naive Algorithmus besitzt jedoch trotzdem in jedem Fall eine<br />

quadratische Laufzeit. Deshalb ist es sinnvoll, zur Beurteilung eines<br />

Algorithmus, dessen Laufzeit nicht nur in Abhängigkeit der Eingabegröße<br />

n, sondern auch in Abhängigkeit der Größe der Ausgabe k (bei unserem<br />

zweiten Problem von oben also die Anzahl der Schnittpunkte) anzugeben.<br />

Von einem „guten“ Algorithmus erwarten wir dann, daß er nur<br />

dann eine hohe Laufzeit besitzt, wenn die Ausgabe ebenfalls umfangreich<br />

ist.<br />

linearer Zeitbedarf für<br />

lineare Programme im R 2/3<br />

im Worst case Θ(n 2 )<br />

Schnittpunkte<br />

Einen Algorithmus, dessen Laufzeit nicht nur von der Größe der Eingabe<br />

n sondern auch von der Größe der Ausgabe k abhängt, nennen<br />

wir output-sensitiv. Der naive Algorithmus von oben ist offenbar nicht output-sensitiv<br />

1 Ein lineares Programm ist ein System von (linearen) Restriktionen Ax ≤ b, die die<br />

erlaubten Werte für x einschränken, und einer Zielfunktion c T x, die minimiert werden<br />

soll.


56 Das Plane-sweep-Paradigma<br />

Abbildung 5.1<br />

Die Sweep line definiert<br />

eine Ordnung auf den<br />

Segmenten<br />

zunächst keine Sonderfälle<br />

y<br />

x1<br />

s2<br />

s4<br />

s5<br />

output-sensitiv, denn er benötigt immer Θ(n 2 ) Zeit – unabhängig von k.<br />

Mittels einer Reduktion des ε-closeness-Problems auf das Segmentschnittproblem<br />

können wir die folgenden unteren Schranken angeben:<br />

Lemma 5.9 Für n Liniensegmente im E 2 hat der Test, ob sich (mindestens)<br />

zwei Segmente schneiden, die Zeitkomplexität Ω(n log n). Alle<br />

k Schnittpunkte zu bestimmen hat die Zeitkomplexität Ω(n log n + k).<br />

Ein Beweis findet sich z. B. in [14, S. 65].<br />

Im folgenden wollen wir jetzt also für die beiden obigen Probleme output-sensitive<br />

Plane-sweep-Algorithmen angeben (basierend auf den Arbeiten<br />

von Bentley und Ottmann [2] aus dem Jahre 1979), die für k ∈<br />

o(n 2 ) eine geringere Laufzeit haben als der naive Ansatz. Um die Überlegungen<br />

etwas zu vereinfachen, nehmen wir dabei an, daß sich nie<br />

mehr als zwei Segmente im selben Punkt schneiden und daß sich keine<br />

zwei Segmente überlappen.<br />

5.4.1 Schnittest<br />

Wir lassen die Sweep line wieder – wie üblich – von links nach rechts<br />

über die Liniensegmente wandern. An jeder Stelle definiert dann die<br />

Sweep line auf den Segmenten, die sie schneidet, eine Ordnung gemäß<br />

den y-Koordinaten der Schnittpunkte. Beispielsweise ist in Abbildung<br />

5.1 an der Stelle x1 die Ordnung s4 < s2 < s5.<br />

Für zwei Segmente, die sich in einem Punkt (x, y) schneiden, gilt offensichtlich:<br />

x2<br />

s6<br />

s1<br />

s7<br />

s3<br />

x


5.4 Schnitt von Liniensegmenten 57<br />

Beobachtung 5.10 Besitzen (genau) zwei Segmente in einem<br />

Punkt (x, y) einen (echten) Schnittpunkt, dann gibt es immer eine<br />

Stelle x − ε, an der sie in der durch die Sweep line definierten Ordnung<br />

direkte Nachbarn sind. An der Stelle x kehrt sich ihre Ordnung dann<br />

um.<br />

In Abbildung 5.1 auf der vorherigen Seite trifft dies z. B. auf die beiden<br />

Segmente s4 und s5 zu, für die unmittelbar links der Stelle x2 die Beziehung<br />

s4 < s5 und unmittelbar rechts von x2 die Beziehung s5 < s4 gilt.<br />

Um alle (echten) Schnittpunkte zu finden, genügt es also, an allen Stellen,<br />

an denen sich die durch die Sweep line definierte Ordnung ändert,<br />

jeweils die neu benachbarten Segmente auf Schnitt zu testen. Dies ist die<br />

grobe Idee unseres Algorithmus.<br />

Vertikalstruktur Um jeweils benachbarte Segmente auf einen gemeinsamen<br />

Schnittpunkt testen zu können, speichern wir in der Vertikalstruktur<br />

jeweils die Ordnung der momentan von der Sweep<br />

line geschnittenen Segmente.<br />

Idee: Testen direkter<br />

Nachbarn<br />

Die Haltepunkte der Sweep line sind dann all diejenigen Stellen,<br />

an denen sich die Ordnung ändert, nämlich die x-Koordinaten der<br />

folgenden Ereignisse: Drei Halteereignisse<br />

1. Die Sweep line stößt auf den linken Endpunkt eines Liniensegments,<br />

d. h. dieses Segment muß mit in die Vertikalstruktur<br />

aufgenommen werden.<br />

2. Die Sweep line stößt auf den rechten Endpunkt eines Liniensegments,<br />

d. h. dieses Segment muß aus der Vertikalstruktur<br />

entfernt werden.<br />

3. Die Sweep line erreicht einen (echten) Schnittpunkt zweier<br />

Segmente, an dem sich deren Ordnung umkehrt.<br />

Das dritte Ereignis – das Erreichen eines Schnittpunkts – können<br />

wir hier außer Acht lassen, da wir ja nur nach dem ersten Schnittpunkt<br />

suchen und den Algorithmus sofort beenden können, wenn<br />

wir ihn gefunden haben. D. h., ein Ereignis des dritten Typs werden<br />

wir nie erreichen, da der Schnittpunkt schon (spätestens) beim<br />

letzten Halt der Sweep line entdeckt worden sein muß.<br />

Horizontalstruktur Um die Ereignisse, an denen wir die Vertikalstruktur<br />

aktualisieren müssen, in der richtigen Reihenfolge abzuarbeiten,<br />

genügt es wieder, die Endpunkte pi, qi aller Segmente nach<br />

ihren x-Koordinaten zu sortieren.<br />

Die Vertikalstruktur können wir wieder als balancierten Baum implementieren,<br />

wobei beim „Vergleich“ zweier Segmente bez. ihrer<br />

von der Sweep line definierten Ordnung natürlich immer die aktuelle<br />

x-Koordinate der Sweep line mitherangezogen werden muß. Für die Horizontalstruktur<br />

genügt wieder eine sortierte Liste der Endpunkte. Damit<br />

jedoch auch senkrechte Liniensegmente und Segmente, die sich in<br />

Endpunkten schneiden, richtig verarbeitet werden, müssen wir die Sortierreihenfolge<br />

etwas modifizieren:<br />

Modifizierte<br />

Sortierreihenfolge


58 Das Plane-sweep-Paradigma<br />

Zeitbedarf von Θ(n log n)<br />

für den Segmentschnittest<br />

Halteereignisse zur<br />

Laufzeit<br />

Erstes Sortierkriterium ist die x-Koordinate des betreffenden Punktes.<br />

Zweites Sortierkriterium (bei Gleichheit der x-Koordinaten) ist der Typ<br />

des Ereignisses: Einfügeereignisse (also linke Endpunkte) sollen<br />

vor Löschereignissen (also rechten Endpunkten) behandelt werden.<br />

Drittes Sortierkriterium (bei Gleichheit der beiden ersten Kriterien) ist<br />

die y-Koordinate des Punktes. Die Punkte sollen dann nach aufsteigenden<br />

y-Koordinaten sortiert werden.<br />

Beim Einfügen von Punkten mit gleicher x- und y-Koordinate (wie z. B. die<br />

Segmente s3 und s6 in Abbildung 5.1 auf Seite 56) muß zusätzlich noch<br />

die Ordnung direkt rechts der Sweep line (also die angulare Ordnung der<br />

Segmente) als viertes Kriterium herangezogen werden.<br />

Bemerkung 5.11 Das dritte Sortierkriterium – also das Hinzuziehen der<br />

y-Koordinate bei Gleichheit – ist ein oft verwendetes Hilfmittel um Sonderfälle<br />

wie z. B. senkrechte Segmente, o. ä. zu behandeln. Diese Vorgehensweise<br />

entspricht anschaulich einem infinitesimalen Kippen der<br />

Sweep line und hat zur Folge, daß keine zwei verschiedenen Punkte zur<br />

selben Zeit von der Sweep line getroffen werden können. ⊳<br />

Die oben beschriebene Vorgehensweise wurde in Algorithmus 5.2 auf<br />

der folgenden Seite umgesetzt und wir erhalten den folgenden Satz:<br />

Satz 5.12 Man kann in optimaler Zeit Θ(n log n) und Θ(n) Speicher<br />

n Liniensegmente in der Ebene auf Schnitt testen.<br />

Beweis: Der Initialisierungsschritt kostet uns wieder O(n log n) Zeit.<br />

Die while-Schleife wird maximal 2n-mal durchlaufen und jeder Durchlauf<br />

hat einen Zeitbedarf von O(log n). Zusammen mit der unteren<br />

Schranke aus Lemma 5.9 auf Seite 56 folgt dann der Zeitbedarf<br />

von Θ(n log n). ✷<br />

5.4.2 Bestimmen aller Schnittpunkte<br />

Alle Schnittpunkte zu bestimmen ist ein schwierigeres Problem als nur<br />

zu testen, ob mindestens ein Schnitt existiert. Denn jetzt müssen wir<br />

auch das im letzten Abschnitt außer Acht gelassene dritte Halteereignis<br />

auf der vorherigen Seite – das Erreichen des Schnittpunkts zweier Segmente<br />

– berücksichtigen, damit die Vertikalstruktur korrekt aktualisiert<br />

wird. Diese Ereignisse entstehen aber erst während der Algorithmus bereits<br />

ausgeführt wird und sind zu Beginn noch gar nicht bekannt.<br />

Aus diesem Grund müssen wir immer, wenn wir einen Schnittpunkt<br />

gefunden haben, diesen als zusätzliches Halteereignis in unsere Horizontalstruktur<br />

einsortieren und, wenn wir dann auf ein solches Ereignis<br />

treffen, geeignet bearbeiten. Eine sortierte Liste der x-Koordinaten reicht<br />

deshalb nun (aus Effizienzgründen) als Horizontalstruktur nicht mehr<br />

aus.


5.4 Schnitt von Liniensegmenten 59<br />

Algorithmus 5.2 Schnittest für Liniensegmente<br />

TESTINTERSECTION(s1, . . . , sn)<br />

Input: n Liniensegmente s1 = [p1 q1], . . . , sn = [pn qn] ⊂ E 2<br />

{Initialisierungsschritt}<br />

1 Sortiere die Punkte p1, q1, . . . , pn, qn gemäß den vier Sortierkriterien<br />

und füge sie in die Liste HS ein<br />

2 VS ← leerer AVL-Baum<br />

3 schnitt ← false<br />

{Sweep}<br />

4 while HS �= ∅ ∧ ¬schnitt do<br />

5 Punkt ← NächsterPunkt(HS)<br />

6 if Punkt = linker Endpunkt (von Segment s) then<br />

7 Füge s in VS ein<br />

8 Vorg ← der Vorgänger von s in VS<br />

9 Nachf ← der Nachfolger von s in VS<br />

10 if (s schneidet Vorg) ∨ (s schneidet Nachf) then<br />

11 schnitt ← true<br />

12 end if<br />

13 else if Punkt = rechter Endpunkt (von Segment s) then<br />

14 Vorg ← der Vorgänger von s in VS<br />

15 Nachf ← der Nachfolger von s in VS<br />

16 if Vorg schneidet Nachf then<br />

17 schnitt ← true<br />

18 end if<br />

19 Entferne s aus VS<br />

20 end if<br />

21 end while<br />

Output: Es gibt genau dann (mindestens) einen Schnittpunkt,<br />

wenn schnitt gleich true ist<br />

Wir verwenden stattdessen als Horizontalstruktur eine Prioritätswarteschlange<br />

(engl. priority queue), z. B. einen Fibonacci heap, der u. a. das<br />

Einfügen eines Elements und das Ermitteln und Entfernen des minimalen<br />

Elements in O(log n) Zeit bewerkstelligt und das Reduzieren eines<br />

Schlüsselwerts sogar mit konstantem Zeitbedarf. In unserem speziellen<br />

Fall wird diese letzte Eigenschaft allerdings gar nicht benötigt und wir<br />

können auch einen AVL-Baum zur Verwaltung der Horizontalstruktur<br />

verwenden.<br />

Außerdem müssen wir noch folgende Punkte berücksichtigen:<br />

• Es kann passieren, daß ein Schnittpunkt mehrere Male entdeckt<br />

wird. Trotzdem darf er natürlich nur einmal in die Horizontalstruktur<br />

eingefügt werden.<br />

Es kann sogar passieren, daß ein Schnittpunkt entdeckt wird, nachdem<br />

ihn die Sweep line schon passiert hat. Zum Beispiel wird in<br />

Abbildung 5.1 auf Seite 56 der Schnittpunkt zwischen den Segmenten<br />

s4 und s5 erneut entdeckt, wenn der rechte Endpunkt<br />

priority queue als<br />

Horizontalstruktur


60 Das Plane-sweep-Paradigma<br />

Zeitbedarf von<br />

O((n + k) log n) für die<br />

Schnittpunktbestimmung<br />

von s7 abgearbeitet wird. In so einem Fall – wenn also der Schnittpunkt<br />

links der aktuellen Sweep line liegt – darf der Punkt überhaupt<br />

nicht mehr in die Horizontalstruktur eingefügt werden.<br />

• Bei dem zweiten Sortierkriterium auf Seite 58 erhalten wir einen<br />

weiteren Ereignistyp (»Schnittpunktereignis«), der nach den Einfügeereignissen<br />

und vor den Löschereignissen abgearbeitet werden<br />

muß.<br />

Unter Beachtung der oben aufgeführten Besonderheiten kann Algorithmus<br />

5.2 nun daraufhin angepaßt werden, alle Schnittpunkte zu finden.<br />

Hierzu müssen im wesentlichen die folgenden Punkte geändert werden:<br />

• Die Horizontalstruktur wird durch eine Prioritätswarteschlange<br />

ersetzt.<br />

• Die Variable schnitt fällt weg, da jetzt immer die ganze Ebene abgearbeitet<br />

wird.<br />

• Es kommt ein neues Schnittpunktereignis hinzu, an dem<br />

– die Koordinaten des Schnittpunktes ausgegeben werden,<br />

– die beiden beteiligten Segmente ihre Ordnung tauschen,<br />

– das neue untere Segment mit seinem Vorgänger und das neue<br />

obere Segment mit seinem Nachfolger in der Vertikalstruktur<br />

auf Schnitt getestet wird.<br />

Somit erhalten wir den folgenden Satz für unseren output-sensitiven<br />

Plane-sweep-Algorithmus:<br />

Satz 5.13 Die k Schnittpunkte von n Liniensegmenten in der Ebene können<br />

mit einem Zeitaufwand von O((n + k) log n) und einem Speicherbedarf<br />

von O(n + k) bestimmt werden.<br />

Beweis: Insgesamt gibt es O(n+k) Haltepunkte für die Sweep line, d. h.<br />

die while-Schleife wird O(n + k)-mal durchlaufen. Da keines der Ereignisse<br />

mehrfach in der Horizontalstruktur gespeichert wird, kann jeder<br />

Zugriff darauf in O(log(n + k)) = O(log(n 2 )) = O(log n) Zeit erfolgen.<br />

Außerdem erfordert jeder Zugriff auf die Vertikalstruktur ebenfalls nur<br />

logarithmischen Aufwand.<br />

Insgesamt erhalten wir also einen Zeitbedarf von O((n + k) log n)<br />

und einen Speicherbedarf (hauptsächlich für die Horizontalstruktur)<br />

von O(n + k). ✷<br />

Die etwas grobe Analyse des Speicherbedarfs von O(n+k) ist hierbei ein<br />

bißchen unbefriedigend, da k ja bekanntermaßen aus Ω(n 2 ) sein kann.<br />

Mit einer feineren Analyse kann man zeigen [20], daß die Größe der Horizontalstruktur<br />

(und damit der Gesamtspeicherbedarf) tatsächlich nur<br />

aus O(n(log n) 2 ) ist. Auf der anderen Seite kann man aber auch Worstcase-Beispiele<br />

angeben [20], für die an mindestens einer Position der


5.5 Anwendung »Test auf Einfachheit« 61<br />

Sweep line die Größe der Horizontalstruktur aus Ω(n log n) ist (siehe<br />

z. B. auch [14, S. 72]).<br />

Mittels eines einfachen Tricks läßt sich allerdings der Speicherbedarf sogar<br />

auf O(n) drücken: Wir merken uns in der Horizontalstruktur nur Trick zur Speicherersparnis<br />

Schnittpunkte von solchen Segmenten, die auch aktuell benachbart sind,<br />

alle anderen entfernen wir wieder aus der Horizontalstruktur, sobald<br />

die beteiligten Segmente nicht mehr benachbart sind. Denn aufgrund<br />

der Beobachtung 5.10 auf Seite 57 wissen wir, daß bevor sich die Segmente<br />

schneiden, diese wieder benachbart sein müssen.<br />

Beispielsweise würden wir in Abbildung 5.1 auf Seite 56, wenn wir den<br />

linken Endpunkt von Segment s2 bearbeiten, den Schnittpunkt von s4<br />

und s5 wieder aus der Horizontalstruktur löschen und erst bei Erreichen<br />

des rechten Endpunkts von s2 wieder einfügen. Auf diese Weise<br />

bleibt die Zahl der in der Horizontalstruktur gespeicherten Schnittpunktereignisse<br />

immer aus O(n) und wir erhalten folgende Verbesserung von<br />

Satz 5.13:<br />

Satz 5.14 Die k Schnittpunkte von n Liniensegmenten in der Ebene können<br />

mit einem Zeitaufwand von O((n + k) log n) und einem Speicherbedarf<br />

von O(n) bestimmt werden.<br />

Bemerkung 5.15 Die einzigen beiden Einschränkungen an die n Liniensegmente,<br />

die wir gemacht hatten, waren, daß sich nie mehr als zwei<br />

Segmente in demselben Punkt schneiden und daß sich keine zwei Segmente<br />

überlappen.<br />

Im ersten Fall würde dann nämlich Beobachtung 5.10 auf Seite 57 nicht<br />

mehr zutreffen. Durch eine etwas genauere Analyse dieser Problematik<br />

ist es jedoch trotzdem – ohne allzu großen Mehraufwand – möglich,<br />

auch solche Fälle zuzulassen. Dies wird beispielsweise in [5, S. 26] beschrieben.<br />

Auch die zweite Einschränkung – sich überlappende Segmente – kann<br />

durch eine verfeinerte Analyse und geeignete Fallunterscheidungen vermieden<br />

werden und stellt kein schwerwiegendes Problem dar. ⊳<br />

5.5 Anwendung »Test auf Einfachheit«<br />

Durch eine leichte Modifikation können wir Algorithmus 5.2 auf Seite 59<br />

dazu verwenden, die Einfachheit einer polygonalen Kette zu testen: Wir<br />

müssen nur dafür sorgen, daß beim Schnittest zweier Strecken, die sich<br />

in ihren Endpunkten berührenden adjazenten Kanten nicht berücksichtigt<br />

werden. Wir erhalten damit folgendes Korollar zu Satz 5.12 auf Seite<br />

58:<br />

Korollar 5.16 Eine aus n Segmenten bestehende polygonale Kette (in<br />

der Ebene) kann mit einem Zeitaufwand von O(n log n) auf ihre Einfachheit<br />

hin getestet werden.<br />

linearer Speicherbedarf zur<br />

Schnittpunktbestimmung<br />

Zeitbedarf von O(n log n)<br />

für den Test auf Einfachheit


62 Das Plane-sweep-Paradigma<br />

Abbildung 5.2<br />

Der Graph links ist ein<br />

PSLG, die beiden anderen<br />

nicht<br />

planar subdivision<br />

Planar straight line graph<br />

vertices, edges und faces<br />

5.6 Anwendung »Überlagerung von PSLGs«<br />

und »Arrangement-Berechnung«<br />

Planar straight line graphs können verwendet werden, um den Spezialfall<br />

einer Unterteilung der Ebene (engl. planar subdivision), bei dem Gebiete<br />

ausschließlich durch Liniensegmente begrenzt werden, zu modellieren<br />

und sind ein wichtiges Hilfsmittel in der <strong>Algorithmische</strong>n <strong>Geometrie</strong>.<br />

Definition 5.17 (Planar straight line graph)<br />

Eine kreuzungsfreie Realisierung (in die Ebene) eines ungerichteten zusammenhängenden<br />

Graphen G = (V, E, γ) heißt Planar straight line<br />

graph (kurz: PSLG), wenn<br />

1. jede Kante bei der geometrischen Realisierung auf ein Liniensegment<br />

abgebildet wird und<br />

2. jede Ecke v ∈ V einen Grad g(v) ≥ 2 besitzt.<br />

Abbildung 5.2 zeigt links einen PSLG, der mittlere Graph verletzt die<br />

PSLG-Eigenschaft, weil er nicht zusammenhängend ist und der rechte,<br />

weil er Knoten mit einem Grad kleiner als zwei besitzt.<br />

Die Knoten (oder Ecken) eines PSLGs werden in der englischsprachigen<br />

Literatur auch als vertices, die Kanten als edges und die Flächen als faces<br />

bezeichnet.<br />

Bemerkung 5.18 Manchmal verzichtet man zur Definition des PSLGs<br />

auch auf den Zusammenhang des Graphen oder auf die Forderung eines<br />

Eckengrades ≥ 2. Wir wollen uns aber auf diesen einfacheren Fall<br />

beschränken. ⊳<br />

Beobachtung 5.19 Ein PSLG zerlegt die Ebene in eine Menge aneinander<br />

grenzender Polygone, deren Vereinigung jedoch – wie Abbildung<br />

5.2 zeigt – im allgemeinen kein einfaches Polygon ergibt, weil die<br />

Polygone auch „über Eck“ benachbart sein können.<br />

Die folgende „Beobachtung“ ist eigentlich eine Folgerung aus der Eulerschen<br />

Formel, die wir allerdings erst in Kapitel 7 zeigen werden:


5.6 Anwendung »Überlagerung von PSLGs« und »Arrangement-Berechnung« 63<br />

e3<br />

v2<br />

v1<br />

e4<br />

f1<br />

e1<br />

v3<br />

e2<br />

f2<br />

v4<br />

Koord. IncEdge<br />

v1 (x1, y1) e3,2<br />

v2 (x2, y2) e4,1<br />

v3 (x3, y3) e4,2<br />

v4 (x4, y4) e2,1<br />

e3,1<br />

f1<br />

f2<br />

v2<br />

v1<br />

e3,2<br />

e1,2<br />

f1<br />

e4,1<br />

e4,2<br />

e1,1<br />

e2,2<br />

BoundEdge<br />

e2,2<br />

e1,1<br />

Origin Twin IncFace Prev Next<br />

e1,1 v1 e1,2 f2 e3,1 e2,1<br />

e1,2 v4 e1,1 f1 e2,2 e3,2<br />

e2,1 v4 e2,2 f2 e1,1 e4,2<br />

e2,2 v3 e2,1 f1 e4,1 e1,2<br />

e3,1 v2 e3,2 f2 e4,2 e1,1<br />

e3,2 v1 e3,1 f1 e1,2 e4,1<br />

e4,1 v2 e4,2 f1 e3,2 e2,2<br />

e4,2 v3 e4,1 f2 e2,1 e3,1<br />

v3<br />

f2<br />

v4<br />

e2,1<br />

Beobachtung 5.20 Sei n die Anzahl der Ecken eines PSLGs. Dann ist<br />

die Gesamtkomplexität des PSLGs, d. h. die Summe der Eckenzahlen,<br />

Kantenzahlen und Flächenzahlen, ebenfalls nur aus O(n).<br />

Abbildung 5.3<br />

Darstellung eines PSLGs<br />

als Doubly connected edge<br />

list<br />

Zur Repräsentation eines PSLGs verwenden wir die Doubly connected<br />

edge list (kurz: DCEL), die eine speicherplatzoptimale und auch zeit- Doubly connected edge list<br />

optimale Möglichkeit darstellt (z. B. beim Zugriff auf einzelne Kanten,<br />

Flächen usw.), einen PSLG zu speichern:<br />

Die Doubly connected edge list besteht aus drei Tabellen, je eine für die Tabellen für die Ecken,<br />

Kanten und Flächen<br />

Ecken, Kanten und Flächen des PSLGs. Zusätzlich kann in den Tabellen<br />

natürlich auch noch weitere (Nutz-)Information zu den Objekten<br />

abgespeichert werden, beispielsweise Namen für die Kanten oder die<br />

Flächen, z. B. wenn es sich bei dem PSLG um die Repräsentation einer<br />

Straßen- oder einer Landkarte handelt.<br />

Um aus dem PSLG eine Doubly connected edge list zu erzeugen, ersetzen<br />

wir zunächst jede Kante durch ein Paar entgegengesetzt gerichteter<br />

sog. Halbkanten (siehe hierzu Abbildung 5.3). Die beiden entgegengesetzt<br />

gerichteten Halbkanten, die wir aus einer Kante des PSLGs er-


64 Das Plane-sweep-Paradigma<br />

zeugen, nennen wir Zwillinge. Jetzt können wir die drei Tabellen für<br />

die Ecken, Flächen und Halbkanten des PSLGs definieren (siehe Abbildung<br />

5.3 auf der vorhergehenden Seite):<br />

Ecken Für jede Ecke v speichern wir ihre Koordinaten (x, y) und einen<br />

Zeiger auf eine beliebige Halbkante IncEdge(v), die in v startet.<br />

Flächen Für jede Fläche f speichern wir einen Zeiger auf eine beliebige<br />

Halbkante BoundEdge(f) auf dem Rand von f, so daß f links dieser<br />

Halbkante liegt.<br />

Halbkanten Für jede Halbkante e speichern wir einen Zeiger auf ihre<br />

Startecke Origin(e), einen Zeiger auf ihre Zwillingskante Twin(e)<br />

und einen Zeiger auf diejenige Fläche IncFace(e), die links von ihr<br />

liegt. Die Endecke der Halbkante müssen wir nicht speichern, da<br />

sie die Startecke der Zwillingskante ist.<br />

Zusätzlich speichern wir noch jeweils einen Zeiger auf die eindeutig<br />

bestimmte Halbkante Prev(e), die in der Startecke Origin(e)<br />

endet und ebenfalls die Fläche IncFace(e) berandet (die Vorgängerkante<br />

von e) und auf die Halbkante Next(e), die in der Endecke<br />

von e startet und ebenfalls IncFace(e) berandet (die Nachfolgerkante<br />

von e).<br />

Durch diese Art der Speicherung können wir auf effiziente Art und Weise<br />

(nämlich immer mit einer Zeitkomplexität, die linear in der Größe der<br />

Ausgabe ist)<br />

• zu einer Ecke alle inzidenten Kanten bestimmen,<br />

• zu einer Fläche alle berandenden Kanten ermitteln.<br />

In [5, S. 31] wird außerdem eine nur geringfügig kompliziertere DCEL<br />

beschrieben, mit der auch unzusammenhängende PSLGs mit Eckengraden<br />

≥ 1 (anstelle von 2) repräsentiert werden können.<br />

Den in Abschnitt 5.4.2 vorgestellten Algorithmus zum Bestimmen aller<br />

Schnittpunkte von n Liniensegmenten können wir nun zu einem Algorithmus<br />

modifizieren, der die Überlagerung zweier gegebener PSLGs<br />

berechnet. Hierzu wenden wir den Schnittalgorithmus auf die Menge<br />

der Liniensegmente in den beiden PSLGs an. Zusätzlich zur Bestimmung<br />

der Schnittpunkte bauen wir während des Sweeps eine neue<br />

DCEL auf, die jeweils den Schnitt-PSLG links der aktuellen Sweep line<br />

beschreibt. Wir beschränken uns dabei auf die Ecken- und Kantentabellen;<br />

das Erzeugen der Flächentabelle schieben wir zunächst auf.<br />

Zum Aufbau der DCEL gehen wir folgendermaßen vor: Wir kopieren<br />

vor Beginn des Sweeps die Ecken- und Kantentabellen der beiden<br />

Ausgangs-DCELs in jeweils eine gemeinsame neue Tabelle (die natürlich<br />

noch keine gültige DCEL darstellt) und modifizieren diese dann bei<br />

jedem Schnittpunktereignis (zwischen Kanten aus verschiedenen DCELs)<br />

in geeigneter Weise.


5.6 Anwendung »Überlagerung von PSLGs« und »Arrangement-Berechnung« 65<br />

Vereinfacht ausgedrückt müssen bei jedem solchen Ereignis die zwei beteiligten<br />

Kanten (bzw. die vier beteiligten Halbkanten) durch vier neue<br />

Kanten (bzw. durch acht neue Halbkanten) ersetzt werden (für Einzelheiten<br />

siehe [5, S. 33]). Insgesamt wird hierfür (größenordnungsmäßig)<br />

nicht mehr Zeit benötigt als für das Erzeugen der Schnittpunkte.<br />

Nachdem die Ecken- und Kantentabellen der neuen DCEL während des<br />

Sweeps korrekt erzeugt wurden, müssen nun noch die Flächentabelle<br />

sowie die korrekten IncFace-Einträge der Kantentabelle generiert werden.<br />

Wieder etwas vereinfacht ausgedrückt geschieht dies, indem wir<br />

die Halbkanten der neuen DCEL – beginnend bei einer beliebigen, noch<br />

nicht besuchten Halbkante – „kreisförmig“ durchlaufen, d. h. zu einer<br />

Halbkante immer ihren Nachfolger besuchen, bis wir irgendwann wieder<br />

bei derjenigen Halbkante ankommen, bei der wir gestartet sind. Ein<br />

Kreis gegen den Uhrzeigersinn entspricht dann einer der beschränkten<br />

Flächen, ein Kreis im Uhrzeigersinn der unbeschränkten Fläche. Der<br />

Zeitaufwand hierfür ist wieder von derselben Größenordnung wie die<br />

Komplexität der DCEL.<br />

Insgesamt erhalten wir dann folgendes Korollar zu Satz 5.14:<br />

Korollar 5.21 Die Überlagerung zweier PSLGs der Komplexitäten m<br />

und n kann mit einem Zeitaufwand von O((m + n + k) log(m + n))<br />

und einem Speicherbedarf von O(m + n + k) bestimmt werden, wobei k<br />

die Komplexität der Überlagerung darstellt.<br />

Da wir zu einem gegebenen Polygon P = (p1, . . . , pm) in linearer Zeit<br />

einen PSLG erzeugen können, der genau dieses Polygon repräsentiert,<br />

folgt hieraus sofort ein weiteres Korollar:<br />

Korollar 5.22 Für zwei Polygone P = (p1, . . . , pm) und Q =<br />

(q1, . . . , qn) kann mit einem Zeitaufwand von O((m+n+k) log(m+n))<br />

und einem Speicherbedarf von O(m+n+k) ein PSLG bestimmt werden,<br />

der den Schnitt der beiden Polygone repräsentiert. Hierbei stellt k die<br />

Komplexität des Schnitts dar.<br />

Außerdem können wir mit derselben Vorgehensweise für eine Menge<br />

von n Liniensegmenten nicht nur deren Schnittpunkte berechnen, sondern<br />

auch das sog. Arrangement der Segmente, d. h. denjenigen PSLG, Arrangement<br />

der die gesamte Menge sich schneidender Segmente repräsentiert:<br />

Korollar 5.23 Für eine Menge von n Liniensegmenten in der Ebene<br />

kann deren Arrangement mit einem Zeitbedarf von O((n + k) log n) bestimmt<br />

werden.<br />

O((m + n + k) log(m + n))<br />

Zeitbedarf für den Schnitt<br />

allgemeiner Polygone<br />

Zeitbedarf von<br />

O((n + k) log n) zur<br />

Arrangement-Berechnung


Konvexe Hüllen ebener<br />

Punktmengen<br />

Die konvexe Hülle einer Menge A ⊆ R d (siehe Definition 4.5 auf Seite<br />

34) ist uns ja schon im Abschnitt 1.2 bei den Problemen »Einzäunen<br />

von Apfelbäumen« und »Christos Reichstag« (für d = 2, 3) begegnet. In<br />

diesem Kapitel wollen wir den Spezialfall betrachten, die konvexe Hülle<br />

einer endlichen Punktmenge A in der Ebene zu bestimmen.<br />

Wie wir schon in Abschnitt 4.1 gesehen haben, ist die konvexe Hülle einer<br />

ebenen n-elementigen Punktmenge (die nicht alle auf einer Geraden<br />

liegen) ein konvexes Polygon mit maximal n Ecken. Um dieses Polygon<br />

soll es also im folgenden gehen.<br />

6.1 Eigenschaften und untere Schranke<br />

Offensichtlich scheint der Rand der konvexen Hülle CH(A) der kürzeste<br />

geschlossene Weg zu sein, der die Punktmenge A umschließt. Folgendes<br />

Lemma bringt dies zum Ausdruck:<br />

Lemma 6.1 Sei w ein einfacher, geschlossener Weg, der die konvexe<br />

Hülle CH(A) der endlichen Punktmenge A ⊂ E 2 umschließt, d. h.<br />

CH(A) liegt in dem von w induzierten beschränkten Gebiet (welches<br />

nach dem Jordanschen Kurvensatzes eindeutig bestimmt ist). Dann ist<br />

der Rand von CH(A) höchstens so lang wie der Weg w.<br />

Beweis: O. B. d. A. sei CH(A) ein konvexes Polygon mit mindestens drei<br />

Ecken, d. h. CH(A) = (p1, . . . , pn). Von jedem Punkt pi ziehen wir die<br />

Winkelhalbierende hi der beiden inzidenten Polygonkanten nach außen.<br />

Diese schneidet den umschließenden Weg w mindestens einmal<br />

(siehe Abbildung 6.1 auf der nächsten Seite). Wir durchlaufen nun w<br />

(von einem beliebigen Punkt aus startend) gegen den Uhrzeigersinn und<br />

bezeichnen den beim Durchlauf jeweils ersten Schnitt von w mit der Winkelhalbierenden<br />

hi mit wi.<br />

Aufgrund der Konvexität des Polygons CH(A) schließt die Winkelhalbierende<br />

hi mit den beiden zu pi inzidenten Kanten einen Winkel ≥<br />

6<br />

Rand von CH(A) ist der<br />

kürzeste Weg um A


68 Konvexe Hüllen ebener Punktmengen<br />

Abbildung 6.1<br />

Der Abstand |pi pi+1| ist<br />

immer kleiner oder gleich<br />

dem Abstand |wi wi+1|<br />

a<br />

w<br />

W<br />

w ′<br />

untere Schranke von<br />

Ω(n log n) für konv. Hülle<br />

b<br />

wi<br />

pi<br />

CH(A)<br />

p1<br />

w1<br />

pi+1<br />

pn<br />

wi+1<br />

π/2 ein. Somit ist für zwei aufeinanderfolgende Winkelhalbierende hi<br />

und hi+1 das Punktepaar (pi, pi+1) unter allen Paaren aus der Menge<br />

hi × hi+1 dasjenige mit dem kleinsten Abstand. Deshalb gilt<br />

|pi pi+1| ≤ |wi wi+1| ≤ |wi,i+1| ,<br />

wobei wi,i+1 den Teilweg von w zwischen den Punkten wi und wi+1<br />

bezeichnet. Insgesamt kann deshalb die Gesamtlänge von ∂CH(A) nicht<br />

größer als die Länge des Weges w sein. ✷<br />

Erst Lemma 6.1 rechtfertigt z. B. bei unserem Problem »Einzäunen von<br />

Apfelbäumen« die Verwendung der konvexen Hülle, um einen Zaun<br />

minimaler Länge zu erhalten.<br />

Obiges Lemma läßt sich sowohl auf nicht-einfache Wege w, die CH(A) in<br />

einer ihrer Schlingen enthalten, verallgemeinern als auch auf beliebige<br />

konvexe Mengen A anstelle von CH(A). Mittels dieser allgemeineren<br />

Aussage erhalten wir dann folgendes nützliches Korollar:<br />

Korollar 6.2 Ist w ein einfacher „konvexer“ Weg von a nach b, d. h. zusammen<br />

mit dem Segment [a b] umschließt w eine konvexe Menge W,<br />

und ist w ′ ein beliebiger anderer Weg von a nach b (auf derselben Seite<br />

von [a b] wie w und außerhalb von W ◦ ), dann ist w ′ mindestens so lang<br />

wie w.<br />

Um eine untere Schranke für die Laufzeit eines Algorithmus zur Bestimmung<br />

der konvexen Hülle zu erhalten, können wir wieder – exakt wie<br />

im Beweis zu Satz 4.19 auf Seite 43 – das Sortierproblem auf unser Problem<br />

reduzieren und erhalten dann folgenden Satz:<br />

Satz 6.3 Die Konstruktion der konvexen Hülle von n Punkten in der<br />

Ebene besitzt einen Zeitbedarf von Ω(n log n).<br />

wn


6.2 Inkrementelle Konstruktion 69<br />

In den folgenden Abschnitten werden wir verschiedene Algorithmen<br />

zur Bestimmung der konvexen Hülle vorstellen, einige davon mit einer<br />

optimalen Laufzeit von Θ(n log n), andere output-sensitiv, d. h. mit einer<br />

Laufzeit, die von der Eckenzahl der konvexen Hülle abhängt. Hierbei<br />

sei {p1, . . . , pn} mit n ≥ 3 jeweils die Punktmenge, deren konvexe<br />

Hülle bestimmt werden soll (o. B. d. A. sollen nicht alle Punkte auf einer<br />

Geraden liegen1 ), und (pi1 , . . . , pim ) mit m ≤ n das gesuchte Polygon.<br />

6.2 Inkrementelle Konstruktion<br />

Ein Verfahren zur Konstruktion einer Struktur für eine Menge von Objekten<br />

(hier: die konvexe Hülle einer Menge von Punkten) heißt inkrementell,<br />

wenn die Objekte eines nach dem anderen hinzugefügt werden inkrementelle Verfahren<br />

und dabei die Struktur jedesmal aktualisiert wird.<br />

Wir starten also mit der konvexen Hülle für die Punktmenge {p1, p2, p3}<br />

– also einem Dreieck – und fügen die restlichen Punkte einen nach<br />

dem anderen hinzu, wobei wir die konvexe Hülle jedesmal aktualisieren<br />

müssen. Für den neu hinzukommenden Punkt pi gibt es hierbei<br />

zwei Möglichkeiten:<br />

1. pi liegt innerhalb des Polygons CH({p1, . . . , pi−1}):<br />

In diesem Fall ist nichts zu tun, da sich die konvexe Hülle durch<br />

Hinzunahme des Punktes pi nicht ändert, und es gilt<br />

CH({p1, . . . , pi}) = CH({p1, . . . , pi−1}) .<br />

2. pi liegt außerhalb (oder auch auf dem Rand) des Polyg-<br />

ons CH({p1, . . . , pi−1}):<br />

In diesem Fall kommt der Punkt pi zur Eckenfolge der konvexen<br />

Hülle hinzu, und zwar (bei Orientierung gegen den Uhrzeigersinn)<br />

nach dem Punkt pl und vor dem Punkt pr. Die Punkte pl<br />

und pr sind hierbei jeweils die (zu pi nächstgelegenen) Berührpunkte<br />

der beiden Tangenten durch den Punkt pi an das Polygon<br />

CH({p1, . . . , pi−1}). Die in der Eckenfolge zwischen pl und pr<br />

liegenden Punkte werden dabei aus der Eckenfolge der konvexen<br />

Hülle entfernt.<br />

Somit leistet Algorithmus 6.1 auf der nächsten Seite das Gewünschte.<br />

Einige Schritte des Algorithmus bedürfen allerdings noch der genaueren<br />

Erläuterung:<br />

Schritt 3: Der Point-in-polygon-Test kann (nach Satz 4.10) mittels der<br />

angularen Ordnung der Polygonecken mit einem Zeitbedarf<br />

von O(log n) beantwortet werden. Da sich unser Polygon während<br />

der Ausführung des Algorithmus dynamisch ändert (in<br />

1 Dieser Fall läßt sich immer mit linearem Prüfaufwand ausschließen und gesondert<br />

behandeln.<br />

Zwei Fälle für den neuen<br />

Punkt pi<br />

pi<br />

pr<br />

pl<br />

pi


70 Konvexe Hüllen ebener Punktmengen<br />

x<br />

pr<br />

pl<br />

pi<br />

Algorithmus 6.1 Inkrementelle Bestimmung der konvexen Hülle<br />

CONVEXHULLINCREMENTAL(p1, . . . , pn)<br />

Input: n Punkte p1, . . . , pn ∈ E 2<br />

1 CH ← (p1, p2, p3) bzw. CH ← (p1, p3, p2) {die drei Punkte sollen<br />

gegen den Uhrzeigersinn orientiert sein}<br />

2 for i ← 4, . . . , n do<br />

3 if pi liegt nicht im Polygon CH then<br />

4 Bestimme die beiden Berührecken pl bzw. pr der Tangenten<br />

durch pi an das Polygon CH<br />

5 Entferne alle Punkte zwischen pl und pr aus der Eckenliste CH<br />

6 Füge den Punkt pi zwischen pl und pr in die Eckenliste CH ein<br />

7 end if<br />

8 end for<br />

Output: CH ist die konvexe Hülle der Punkte p1, . . . , pn<br />

Schritt 5 werden evtl. Eckpunkte entfernt und in Schritt 6 wird<br />

ein Punkt hinzugefügt), sollte die Eckenfolge allerdings nicht in<br />

einem Feld sondern besser mittels eines balancierten Suchbaums<br />

verwaltet werden.<br />

Schritt 4: Der Sektor des Polygons, in dem sich der Punkt pi befindet, ist<br />

ja schon aus Schritt 3 bekannt. Somit können die Punkte pl und pr<br />

durch einen Durchlauf des Polygons gegen bzw. im Uhrzeigersinn<br />

bestimmt werden. Beispielsweise wird zur Bestimmung von pr<br />

das Polygon – beginnend bei der linken Sektorgrenze – unter Verwendung<br />

der ccw-Funktion aus Abschnitt 3.2.2 solange gegen den<br />

Uhrzeigersinn durchlaufen, wie der nächste Eckpunkt echt rechts<br />

des Strahls von pi zum aktuellen Eckpunkt liegt.<br />

Bemerkung 6.4 Realisieren wir Schritt 4 des Algorithmus wie oben beschrieben,<br />

erhalten wir für den Fall, daß kollineare Punkte auf dem Rand<br />

der konvexen Hülle liegen, eine Polygonrepräsentation, die alle diese<br />

Punkte auch als Ecken besitzt.<br />

Ist dies nicht gewünscht, so müssen wir den Polygondurchlauf im<br />

Schritt 4 so modifizieren, daß wir bei der Bestimmung der Berührpunkte<br />

pl und pr auch dann weiterlaufen, wenn der nächste Eckpunkt<br />

auf dem Strahl von pi zum aktuellen Eckpunkt liegt. Auf diese Weise<br />

enthält die Eckenfolge der konvexen Hülle keine kollinearen Ecken<br />

mehr. ⊳<br />

Wie ist jetzt also die Gesamtlaufzeit von Algorithmus 6.1? Die if-Abfrage<br />

in Schritt 3 kostet – wie oben gesehen – O(log n) Zeit, das Bestimmen<br />

der beiden Punkte pl und pr kostet O(n) Zeit und das Löschen der zwischen<br />

pl und pr liegenden Punkte sowie das Einfügen von pi lassen<br />

sich ebenfalls mit linearem bzw. konstantem Zeitaufwand erledigen. Jeder<br />

Schleifendurchlauf hat also einen Zeitbedarf von O(n). Da die for-


6.3 Jarvis’s march 71<br />

Schleife insgesamt (n − 3)-mal durchlaufen wird, erhalten wir als Gesamtzeitbedarf<br />

O(n 2 ). Laufzeit von O(n 2 )<br />

Diese Abschätzung ist jedoch zu grob! Es ist zwar richtig, daß uns in Feinere Abschätzung<br />

einem einzigen Schleifendurchlauf die Schritte 4 und 5 Ω(n) Zeit kosten<br />

können, nämlich dann, wenn fast alle Punkte der konvexen Hülle innerhalb<br />

des Dreiecks liegen, das von pi, pl und pr gebildet wird. Dies kann<br />

jedoch nicht beliebig oft passieren. Denn jeder Punkt, der in Schritt 4<br />

passiert und dann in Schritt 5 gelöscht wird, verschwindet aus der konvexen<br />

Hülle und kann in späteren Schleifendurchläufen nie wieder in<br />

Erscheinung treten. Summiert über alle Schleifendurchläufe erhalten wir<br />

also für die Schritte 4 und 5 trotzdem nur eine Laufzeit von O(n).<br />

Aufgrund des logarithmischen Zeitbedarfs für Schritt 3 erhalten wir damit<br />

also eine Gesamtlaufzeit von O(n log n). Dies fassen wir in folgendem<br />

Satz zusammen:<br />

Satz 6.5 Für eine Menge von n Punkten p1, . . . , pn ∈ E 2 kann deren<br />

konvexe Hülle mittels des inkrementellen Algorithmus bei linearem<br />

Speicherbedarf mit einem Zeitbedarf von Θ(n log n) bestimmt werden.<br />

Bemerkung 6.6 Die Bestimmung der beiden Berührecken pl und pr<br />

kann sogar in logarithmischer Zeit O(log n) erfolgen, da die Folge<br />

ccw(pi, p1, p2), ccw(pi, p2, p3), . . . , ccw(pi, pi−1, p1)<br />

aufgrund der Konvexität des Polygons (p1, . . . , pi−1) genau zwei Vorzeichenwechsel<br />

besitzt (sofern pi nicht gerade auf dem Rand des Polygons<br />

liegt). Diese Vorzeichenwechsel entsprechen genau den Punkten pl<br />

und pr und können mittels binärer Suche ermittelt werden.<br />

Für unseren Algorithmus ergibt dies jedoch keinen Gewinn (im Gegenteil,<br />

über alle Schleifendurchläufe summiert werden sogar mehr Ecken<br />

betrachtet), da jede Ecke, die zwischen pl und pr liegt, sowieso in<br />

Schritt 5 entfernt werden muß. ⊳<br />

6.3 Jarvis’s march<br />

Die Beobachtung, die dem Algorithmus von Jarvis zugrunde liegt, ist,<br />

daß ein Segment [pi pj], welches die Punktmenge A = {p1, . . . , pn} separiert<br />

(d. h. sowohl links als auch rechts von [pi pj] liegen Punkte aus A),<br />

keine Kante der konvexen Hülle sein kann. Folglich genügt es, mit einem<br />

Punkt pi1 , der sicher ein Eckpunkt der konvexen Hülle ist, zu starten<br />

und dann nach einem weiteren Punkt pi2 zu suchen, so daß alle<br />

übrigen Punkte links des Segments [pi1 pi2 ] liegen. Dieser Schritt wird<br />

dann iteriert, bis man wieder beim Startpunkt pi1 angelangt ist. Aufgrund<br />

dieser Vorgehensweise erhielt der Algorithmus auch seinen Namen:<br />

Man startet an einer Stelle der konvexen Hülle und marschiert<br />

(engl. to march) dann um alle Punkte herum, bis man wieder am Ausgangspunkt<br />

angelangt ist.<br />

Trick: Summation über alle<br />

Schleifendurchläufe<br />

Zeitbedarf von Θ(n log n)<br />

für konvexe Hülle<br />

Bestimmung von pl und pr<br />

in O(log n)<br />

pi 1<br />

pi 4<br />

pi 2<br />

pi 3


72 Konvexe Hüllen ebener Punktmengen<br />

Jarvis’s march ist outputsensitiv<br />

Zeitbedarf von Θ(mn) für<br />

Jarvis’s march<br />

Algorithmus 6.2 Jarvis’s march zur Bestimmung der konvexen Hülle<br />

CONVEXHULLJARVIS(p1, . . . , pn)<br />

Input: n Punkte p1, . . . , pn ∈ E 2<br />

1 Bestimme den Punkt pi1 als den Punkt mit minimaler y-Koordinate<br />

(bei Punkten gleicher y-Koordinate, denjenigen mit minimaler<br />

x-Koordinate)<br />

2 j ← 1<br />

3 repeat<br />

{j zählt die Eckpunkte pij der konvexen Hülle}<br />

4 j ← j + 1<br />

5 rechts ← 1<br />

6 for k ← 2, . . . , n do<br />

7 if (pk liegt echt rechts von [pij−1 prechts]) oder (pk<br />

pij−1<br />

liegt auf<br />

prechts und näher an pij−1 als prechts)<br />

8<br />

then<br />

rechts ← k<br />

9 end if<br />

10 end for<br />

11 pij ← prechts<br />

12 until pij<br />

= pi1<br />

Output: Die konvexe Hülle der Punkte p1, . . . , pn ist das Polygon<br />

mit der Eckenfolge (pi1 , . . . , pij−1 )<br />

Für den Startpunkt pi1 können wir z. B. den Punkt mit minimaler<br />

y-Koordinate (und bei Punkten gleicher y-Koordinate, denjenigen<br />

mit minimaler x-Koordinate) wählen; zum Bestimmen der Punkte<br />

pi2 , pi3 , . . . verwenden wir wieder die ccw-Funktion. Diese Idee wurde<br />

im Algorithmus 6.2 umgesetzt.<br />

Bemerkung 6.7 Für den Fall, daß kollineare Punkte auf dem Rand der<br />

konvexen Hülle liegen, liefert Algorithmus 6.2 eine Polygonrepräsentation,<br />

die alle diese Punkte auch als Ecken besitzt.<br />

Soll die Eckenfolge der konvexen Hülle keine kollinearen Ecken enthalten,<br />

können wir Schritt 7 dahingehend modifizieren, daß im zweiten Teil<br />

der if-Abfrage daraufhin getestet wird, ob der Punkt pk weiter von pij−1<br />

entfernt ist als der Punkt prechts. ⊳<br />

Zum Zeitbedarf des Algorithmus: Jeder Durchlauf der for-Schleife benötigt<br />

Θ(n) Schritte; die äußere repeat-Schleife wird so oft durchlaufen,<br />

wie Eckpunkte auf der konvexen Hülle liegen. Somit hat der Jarvis’smarch-Algorithmus<br />

eine Gesamtlaufzeit von Θ(mn), wenn m die Komplexität<br />

der konvexen Hülle bezeichnet. Der Jarvis’s march ist also out-<br />

put-sensitiv. Im Worst case, wenn alle n Punkte auch auf der konvexen<br />

Hülle liegen, hat der Algorithmus also eine (nicht optimale) Laufzeit<br />

von Ω(n 2 ). Wir erhalten damit folgenden Satz:<br />

Satz 6.8 Für eine Menge von n Punkten p1, . . . , pn ∈ E2 kann deren<br />

konvexe Hülle (pi1 , . . . , pim ) mittels des Jarvis’s march bei linearem<br />

Speicherbedarf mit einem Zeitbedarf von Θ(mn) bestimmt werden.


6.4 Graham’s scan 73<br />

6.4 Graham’s scan<br />

Die Hauptidee des Algorithmus von Graham ist, die Punkte zunächst<br />

(zyklisch) angular zu sortieren, bezüglich eines Punktes, der in der konvexen<br />

Hülle der Punkte liegt (z. B. der Schwerpunkt dreier Punkte). Mittels<br />

dieses Preprocessings ist es dann leicht, diejenigen Punkte zu finden, die<br />

Eckpunkte der konvexen Hülle sind.<br />

Ein Eckpunkt p der konvexen Hülle muß nämlich mit allen Punkten pr �<br />

p � pl (insbesondere also mit den direkten Nachbarn in der angularen<br />

Ordnung) einen Winkel ≤ π einschließen, andernfalls wäre p eine<br />

konkave Ecke des Polygons. Andererseits wissen wir bereits aus Lem-<br />

ma 4.7, daß ein Polygon mit ausschließlich konvexen Ecken (d. h. positiven<br />

Knickwinkeln) konvex ist.<br />

Dies machen wir uns jetzt zunutze, indem wir die Punkte gemäß ihrer<br />

zyklischen angularen Ordnung durchlaufen und jeden Punkt p mit seinen<br />

direkten Nachbarn pr und pl in der angularen Ordnung testen. Wir<br />

unterscheiden dabei zwei Fälle:<br />

1. p liegt echt links von [pr pl]:<br />

Preprocessing: Angulare<br />

Sortierung der Punkte<br />

Der Punkt p kann somit keine Ecke der konvexen Hülle sein. Wir<br />

eliminieren deshalb p aus der Liste der Punkte. Da pr jetzt einen<br />

neuen direkten Nachbarn in der angularen Ordnung bekommen<br />

hat (nämlich pl) machen wir einen Rückwärtsschritt und testen als Rückwärtsschritt<br />

nächstes pr (eventuell zum wiederholten Mal).<br />

2. p liegt rechts von [pr pl]:<br />

Momentan spricht nichts dagegen, daß p ein Eckpunkt der konvexen<br />

Hülle ist. Wir machen deshalb einen Vorwärtsschritt und testen Vorwärtsschritt<br />

als nächstes pl.<br />

Durch dieses Vorgehen ist gewährleistet, daß alle Punkte vom Start- Invariante<br />

punkt bis zum aktuellen Punkt mit ihren Nachbarpunkten einen Winkel<br />

≤ π einschließen. Sollte der Startpunkt bei einem Rückwärtsschritt<br />

eliminiert werden, übernimmt der zugehörige Punkt pr seine Rolle.<br />

Diesen zirkularen Scan über alle Punkte führen wir solange durch, bis zirkularer Scan<br />

wir den Startpunkt wieder erreicht und erneut erfolgreich getestet haben<br />

(d. h. der Punkt liegt rechts von [pr pl]). Denn dann können wir<br />

sicher sein, daß alle in der Liste verbliebenen Punkte mit ihren Nachbarpunkten<br />

einen Winkel ≤ π einschließen. Da die verbliebene Punktfolge<br />

außerdem immer noch angular sortiert ist, wissen wir, daß sie gleichzeitig<br />

Eckenfolge eines (zumindest sternförmigen) Polygons ist (vgl. Abschnitt<br />

4.2.2). Lemma 4.7 garantiert uns dann die Konvexität des Polygons.<br />

Zur Bestimmung der Gesamtlaufzeit des Graham’s scans müssen wir<br />

nur noch die Zahl der insgesamt ausgeführten Vorwärts- und Rückwärtsschritte<br />

ermitteln:<br />

pl<br />

p<br />

pr


74 Konvexe Hüllen ebener Punktmengen<br />

Zeitbedarf von Θ(n log n)<br />

für Graham’s scan<br />

Rückwärtsschritte Da bei jedem Rückwärtsschritt ein Punkt aus der Liste<br />

entfernt wird, kann es maximal n − 3 solche Schritte geben, da<br />

aufgrund unserer Voraussetzungen die konvexe Hülle mindestens<br />

drei Eckpunkte enthalten muß.<br />

Vorwärtsschritte Offensichtlich kann es passieren, daß von einem<br />

Punkt aus Ω(n) Vorwärtsschritte getätigt werden. Dies kann allerdings<br />

nicht für alle Punkte der Fall sein. Denn die Zahl der noch<br />

nicht besuchten Punkte wird von einem Vorwärtsschritt um eins<br />

verringert und wird bei einem Rückwärtsschritt zumindest nicht<br />

vergrößert. Da außerdem für jeden Rückwärtsschritt höchstens<br />

ein zusätzlicher Vorwärtsschritt nötig ist, die Zahl der Rückwärtsschritte<br />

aber aus O(n) ist, muß auch die Zahl aller Vorwärtsschritte<br />

aus O(n) sein.<br />

Wir fassen diese Überlegungen in folgendem Satz zusammen:<br />

Satz 6.9 Für eine Menge von n Punkten p1, . . . , pn ∈ E 2 kann deren<br />

konvexe Hülle mittels des Graham’s scans bei linearem Speicherbedarf<br />

mit einem Zeitbedarf von Θ(n log n) bestimmt werden.<br />

Bemerkung 6.10 Der oben beschriebene Algorithmus liefert wieder eine<br />

Polygonrepräsentation, die im Fall kollinearer Punkte auf dem Rand<br />

der konvexen Hülle diese auch alle als Ecken zurückliefert.<br />

Ist dies nicht gewünscht, muß nur in der Fallunterscheidung auf der vorhergehenden<br />

Seite »echt links« durch »links« und »rechts« durch »echt<br />

rechts« ersetzt werden. ⊳<br />

6.5 Konstruktion mittels Divide-and-conquer<br />

Divide-and-conquer-Verfahren sind insbesondere dann von Interesse,<br />

wenn ein Problem auf einem Parallelrechner bearbeitet werden soll, weil<br />

dann die entstehenden Teilprobleme auf verschiedenen Prozessoren<br />

gleichzeitig gelöst werden können.<br />

Bei einem Divide-and-conquer-Ansatz zerlegen wir das Problem in zwei<br />

ungefähr gleich große Probleme (hier: die Bestimmung der konvexen<br />

Hülle zweier nur halb so großer Punktmengen), lösen diese rekursiv<br />

und konstruieren aus den beiden Teillösungen (hier: zwei konvexe Polygone)<br />

die Lösung des ursprünglichen Problems (hier: die Bestimmung<br />

der konvexen Hülle zweier konvexer Polygone). Das Grundgerüst des<br />

Divide-and-conquer-Verfahrens bildet somit Algorithmus 6.3 auf der<br />

folgenden Seite. Hierbei setzen wir o. B. d. A. voraus, daß keine drei<br />

Punkte kollinear sind, denn sonst könnte es passieren, daß eine der konvexen<br />

Hüllen in einem der Rekursionsschritte kein reguläres Polygon<br />

mehr ist, sondern nur ein Liniensegment.<br />

Wichtigster Baustein dieses Divide-and-conquer-Algorithmus ist natürlich<br />

das „Verschmelzen“ der beiden konvexen Hüllen CH 1 und CH 2 in


6.5 Konstruktion mittels Divide-and-conquer 75<br />

Algorithmus 6.3 Konvexe Hülle mittels Divide-and-conquer<br />

CONVEXHULLD-A-Q(p1, . . . , pn)<br />

Input: n Punkte p1, . . . , pn ∈ E 2<br />

1 if n ≤ 6 then<br />

2 CH ← CH(p1, . . . , pn) {z. B. mittels eines naiven Algorithmus}<br />

3 else<br />

4 CH 1 ← CONVEXHULLD-A-Q(p1, . . . , p ⌊n/2⌋)<br />

5 CH 2 ← CONVEXHULLD-A-Q(p ⌊n/2⌋+1, . . . , pn)<br />

6 CH ← MERGEHULLS(CH 1, CH 2)<br />

7 end if<br />

Output: CH ist die konvexe Hülle der Punkte p1, . . . , pn<br />

Algorithmus 6.4 Konvexe Hülle zweier konvexer Polygone<br />

MERGEHULLS(P1, P2)<br />

Input: Zwei konvexe Polygone P1, P2 ⊂ E 2<br />

1 Bestimme einen Punkt ˜p ∈ P1<br />

2 if ˜p ∈ P2 then<br />

3 Verschmelze die (jeweils bez. ˜p angular sortierten) Eckenfolgen<br />

von P1 und P2 zu einer Folge CH<br />

4 else<br />

5 Bestimme die beiden Berührecken pl und pr der Tangenten<br />

durch ˜p an das Polygon P2<br />

6 Verschmelze die (bez. ˜p angular sortierten) Eckenfolge von P1 und<br />

die Teilfolge von P2 zwischen pr bis pl zu einer Folge CH<br />

7 end if<br />

8 Wende den Scan-Schritt des Graham’s scans auf die Folge CH an<br />

und eliminiere alle konkaven Ecken aus CH<br />

Output: CH ist die konvexe Hülle der beiden Polygone P1 und P2<br />

Schritt 6. Diesen Teil – also das Berechnen der konvexen Hülle zweier<br />

konvexer Polygone – müssen wir noch genauer spezifizieren. Hierbei<br />

können wir wieder ausnutzen, daß wir die beiden konvexen Polygone<br />

als Eckenfolge – und damit (zyklisch) angular sortiert – vorliegen haben.<br />

Algorithmus 6.4 leistet dann das Gewünschte. Einige Schritte des<br />

Algorithmus bedürfen noch einer genaueren Erläuterung:<br />

Schritt 2: Den Point-in-polygon-Test können wir aufgrund der angularen<br />

Sortierung der Polygonecken in logarithmischer Zeit durchführen.<br />

Hier in unserem Fall genügt jedoch auch ein naiver Linearzeitalgorithmus.<br />

Schritt 5: Die beiden Berührecken pl und pr können wie beim inkrementellen<br />

Algorithmus (Abschnitt 6.2) in linearer Zeit bestimmt<br />

werden. Die Ecken zwischen pl und pr liegen dabei sicherlich innerhalb<br />

von CH(P1 ∪ P2) und können entfernt werden.<br />

P1<br />

˜p<br />

pl<br />

pr<br />

P2


76 Konvexe Hüllen ebener Punktmengen<br />

konvexe Hülle zweier<br />

konvexer Polygone in Θ(n)<br />

Zeitbedarf von Θ(n log n)<br />

für Divide-and-conquer-<br />

Algorithmus<br />

Schritt 3 und Schritt 6: In beiden Fällen (»p ∈ P2« und »p /∈ P2«) können<br />

die beiden Eckenfolgen (bzw. Teilfolgen) in linearer Zeit zu<br />

einer Eckenfolge verschmolzen werden, die ebenfalls bezüglich ˜p<br />

zyklisch angular sortiert ist.<br />

Schritt 8: Somit haben wir jetzt dieselben Voraussetzungen wie nach<br />

dem Sortierschritt beim Graham’s scan, nämlich eine zyklisch angular<br />

sortierte Menge von Punkten, und können nun auf diese den<br />

Scan-Schritt anwenden (mit ebenfalls linearem Zeitbedarf), um die<br />

konvexe Hülle zu erhalten.<br />

Für das Bestimmen der konvexen Hülle zweier konvexer Polygone erhalten<br />

wir somit den folgenden Satz:<br />

Satz 6.11 Für zwei konvexe Polygone P1, P2 ⊂ E 2 mit einer Gesamtkomplexität<br />

von |P1| + |P2| = n kann deren konvexe Hülle bei linearem<br />

Speicherbedarf mit einem Zeitbedarf von Θ(n) bestimmt werden.<br />

Als direkte Folge aus diesem Satz erhalten wir dann auch die Laufzeitabschätzung<br />

für den Divide-and-conquer-Algorithmus 6.3:<br />

Satz 6.12 Für eine Menge von n Punkten p1, . . . , pn ∈ E 2 kann deren<br />

konvexe Hülle mittels des Divide-and-conquer-Algorithmus 6.3 bei linearem<br />

Speicherbedarf mit einem Zeitbedarf von Θ(n log n) bestimmt<br />

werden.<br />

Beweis: Schritt 2 des Algorithmus hat einen konstanten Zeitbedarf, die<br />

Schritte 4, 5 und 6 jeweils linearen Zeitbedarf. Somit erhalten wir für<br />

den Gesamtzeitbedarf t(n) die Rekursionsgleichung<br />

t(n) = 2 · t(n/2) + O(n) ,<br />

die zu t(n) ∈ O(n log n) führt. ✷<br />

Bemerkung 6.13 Eine Alternative zu obigem Divide-and-conquer-Verfahren<br />

ist, die Punktmenge in zwei etwa gleich große Mengen zu zerlegen,<br />

deren konvexe Hüllen garantiert disjunkt sind. Dies kann beispielsweise<br />

mittels des Medians (der mit linearem Zeitbedarf bestimmt werden<br />

kann) der x-Koordinaten der Punkte geschehen. Die konvexen Hüllen<br />

der beiden Teilmengen werden dann wieder rekursiv bestimmt.<br />

Im Gegensatz zum vorherigen Algorithmus verzichten wir jetzt beim<br />

Berechnen der konvexen Hülle der beiden konvexen Polygone auf die<br />

Anwendung des Scan-Schritts des Graham’s scans, sondern nutzen aus,<br />

daß die beiden Polygone disjunkt sind. Dann können nämlich die obere<br />

und die untere Tangente an die beiden Polygone direkt bestimmt werden<br />

– durch gleichzeitiges Durchlaufen beider Eckenfolgen. Dieser Durchlauf<br />

benötigt bei naiver Implementierung auch wieder nur linearen Zeitbedarf.<br />

Zudem können die beiden Tangenten auch – durch Verwendung<br />

binärer Suche (siehe Bemerkung 6.6) – mit nur logarithmischem Zeitbedarf<br />

ermittelt werden.<br />

Insgesamt hat dieser alternative Divide-and-conquer-Ansatz auch einen<br />

Zeitbedarf von Θ(n log n). ⊳


6.6 Quickhull 77<br />

6.6 Quickhull<br />

Quickhull ist ebenfalls ein Divide-and-conquer-Verfahren und trägt seinen<br />

Namen aufgrund der großen Ähnlichkeit zum Quicksort-Sortierverfahren.<br />

Bei Quicksort wird ja bekanntlich die Menge der zu sortierenden<br />

Zahlen bezüglich eines zufällig gewählten Pivotelements in zwei Teilmengen<br />

von Zahlen zerlegt, die alle kleiner bzw. größer als das Pivotelement<br />

sind und diese Teilmengen werden dann rekursiv auf dieselbe Art<br />

und Weise sortiert. Im Average case (wenn die beiden Teilmengen ungefähr<br />

gleich groß sind) erhält man dann eine Laufzeit von O(n log n),<br />

im Worst case dagegen (wenn z. B. eine der beiden Mengen immer nur<br />

ein Element enthält) dagegen eine Laufzeit von Ω(n 2 ).<br />

Die Idee bei Quickhull ist die folgende:<br />

• Wir bestimmen zunächst zwei Punkte pl und pr, die garantiert<br />

Eckpunkte der konvexen Hülle sind (z. B. mittels minimaler und<br />

maximaler x-Koordinate). Die Gerade pl pr zerlegt dann die Menge<br />

der Punkte in zwei Hälften.<br />

• Zur Bestimmung der oberen Hälfte der konvexen Hülle (analog<br />

für die untere Hälfte) suchen wir einen Punkt ph, der ebenfalls garantiert<br />

auf der konvexen Hülle liegt, z. B. den Punkt maximalen<br />

Abstands zu pl pr. Alle Punkte in dem durch pl, pr und ph induzierten<br />

Dreieck können jetzt entfernt werden, da sie innerhalb der<br />

konvexen Hülle liegen.<br />

• Für die verbliebenen Punkte links von pl ph und rechts von ph pr<br />

wird nun rekursiv genauso verfahren, d. h. der Punkt ph übernimmt<br />

die Rolle von pr bzw. pl.<br />

Dies ergibt im Worst case (z. B. wenn auf allen Rekursionebenen alle<br />

Punkte stets rechts von ph pr liegen) wie bei Quicksort eine Laufzeit<br />

von Ω(n 2 ). Teilt ph dagegen die Menge der Punkte stets in zwei etwa<br />

gleich große Mengen, 2 erhält man eine Laufzeit von O(n log n) – unabhängig<br />

davon, wieviele Punkte außerdem noch innerhalb des Dreiecks<br />

liegen und eliminiert werden können.<br />

6.7 Dynamische Verfahren<br />

Alle bis jetzt vorgestellten Algorithmen zur Bestimmung der konvexen<br />

Hülle waren sog. Offline-Algorithmen, bei denen die komplette Eingabe Offline- vs. Online-<br />

(also in unserem Fall, die n Punkte) schon vor dem Start des Algorithmus Algorithmen<br />

vorliegt.<br />

Im Gegensatz hierzu erhält ein Online-Algorithmus seine Eingabe nicht<br />

vollständig zu Beginn, sondern nach und nach und auch die Größe der<br />

2 In der Tat müssen die beiden Mengen nicht wirklich gleich mächtig sein, sondern es<br />

genügt bereits, wenn (wie bei Quicksort) jede der beiden Mengen immer mindestens einen<br />

linearen Bruchteil der Ausgangsmenge enthält.<br />

pl<br />

ph<br />

pr


78 Konvexe Hüllen ebener Punktmengen<br />

Eingabe ist vor dem Start des Algorithmus nicht bekannt. Für unser Beispiel<br />

heißt das, daß zu beliebigen Zeitpunkten ein oder mehrere Punkte<br />

zur Punktmenge hinzukommen können (sog. Einfügeereignis) und die<br />

konvexe Hülle aller bis zu einem Zeitpunkt bekannten Punkte jeweils<br />

aktualisiert werden muß.<br />

Einfüge- und Außerdem sind nicht nur die obigen Einfügeereignisse möglich, son-<br />

Löschereignisse dern auch Löschereignisse, d. h. ein Punkt wird wieder aus der Punktmenge<br />

entfernt. Auch hier muß dann die konvexe Hülle entsprechend<br />

aktualisiert werden.<br />

Zeitbedarf von Θ(log n) für<br />

ein Einfügeereignis<br />

Von den in den letzten Abschnitten vorgestellten Algorithmen kann nur<br />

das inkrementelle Verfahren aus Abschnitt 6.2 so modifiziert werden,<br />

daß zumindest Einfügeereignisse effizient behandeln werden können.<br />

Hierzu verwalten wir die konvexe Hülle CH aller Punkte in einer geeigneten<br />

Union-Find-Struktur (siehe hierzu z. B. [22, S. 115]), so daß das<br />

Einfügen neuer Punkte und insbesondere das Löschen einer zusammenhängenden<br />

Folge von Punkten jeweils in logarithmischer Zeit möglich<br />

ist.<br />

Um die konvexe Hülle für einen neu hinzugekommenen Punkt zu aktualisieren,<br />

verwenden wir dann eine leicht modifizierte Version des Aktualisierungsschrittes<br />

von Algorithmus 6.1 auf Seite 70 (Schritte 3 bis 7):<br />

Schritt 4: Die Bestimmung der beiden Berührecken soll jetzt – wie in Bemerkung<br />

6.6 beschrieben – mit logarithmischem Zeitbedarf erfolgen.<br />

Wir verwenden deshalb eine binäre Suche auf unserer Union-<br />

Find-Datenstruktur.<br />

Schritt 5: Sind die beiden Berührecken pl und pr bestimmt, können alle<br />

zwischen pl und pr liegenden Ecken mit logarithmischem Zeitaufwand<br />

aus der Union-Find-Struktur für die konvexe Hülle „ausgehängt“<br />

werden.<br />

Somit kostet jeder Aktualisierungsschritt für ein Einfügeereignis<br />

Θ(log n). Schneller kann dies auch nicht bewerkstelligt werden, denn<br />

sonst hätten wir (bei n Punkten) einen Widerspruch zur unteren<br />

Schranke Θ(n log n) aus Satz 6.3. Insgesamt kostet also das dynamische<br />

Erzeugen der konvexen Hülle (wenn wir die n Punkte als n Einfügeereignisse<br />

betrachten) nicht mehr als das Erzeugen mit einem Offline-<br />

Algorithmus.<br />

Das effiziente Behandeln von Löschereignissen ist hingegen weitaus<br />

schwieriger als das von Einfügeereignissen, denn beim Löschen eines<br />

Punktes können im Worst case Ω(n) Punkte aus dem Inneren der konvexen<br />

Hülle zu neuen Ecken werden. Man kann jedoch zeigen, daß<br />

sich unter Verwendung einer komplizierteren Datenstruktur sowohl der<br />

Aktualisierungsschritt für ein Einfüge- als auch für ein Löschereignis<br />

in jeweils O(log 2 n) Zeit durchführen läßt. Das dynamische Erzeugen<br />

der konvexen Hülle mit diesem Online-Algorithmus (mittels n Einfügeereignissen)<br />

hat damit einen Zeitbedarf von O(n log 2 n). Die Online-<br />

Eigenschaft kostet uns also einen „Straffaktor“ von O(log n).


Lokationsprobleme in<br />

der Ebene<br />

Gegeben einen PSLG (siehe Abschnitt 5.6) mit der Gesamtkomplexität n,<br />

der eine Zerlegung der Ebene induziert, und einen Anfragepunkt p.<br />

Dann interessiert uns beim Point-location-Problem, in welchem der vom<br />

PSLG induzierten polygonalen Gebiete der Punkt p liegt (bzw. ob p in<br />

der unbeschränkten Region liegt). Offensichtlich läßt sich diese Frage<br />

naiv mit linearem Zeitbedarf beantworten, indem man p mit allen Polygonen<br />

auf Inklusion testet (z. B. mittels Algorithmus 4.2 auf Seite 45).<br />

Eine untere Schranke von Ω(log n) (im Entscheidungsbaummodell) für<br />

den Zeitbedarf einer Lokationsanfrage ist ebenfalls sofort einsichtig,<br />

denn ein PSLG der Komplexität n kann Ω(n) verschiedene Regionen<br />

aufweisen, in denen ein Anfragepunkt liegen kann und die demnach<br />

bei einer Point-location-Anfrage unterschieden werden müssen. Somit<br />

besitzt also der zu einer Point-location-Anfrage gehörende Entscheidungsbaum<br />

mindestens Ω(n) Blätter und hat damit mindestens die Höhe<br />

Ω(log n).<br />

Um ein Lokationsverfahren zu erhalten, das eine bessere Laufzeit aufweist<br />

als das naive Verfahren, ist ein sinnvoller Ansatz, aus der ursprünglichen<br />

vom PSLG induzierten planar subdivision eine neue Zerlegung<br />

der Ebene zu erzeugen, die sich „leichter“ durchsuchen läßt,<br />

d. h. bei der die Zahl der zu durchsuchenden Komponenten während<br />

der Suche möglichst schnell eingeschränkt werden kann. Dies könnte<br />

z. B. durch Verwendung von binärer Suche geschehen (denn dann wäre<br />

die Suchzeit nur noch logarithmisch von der Komponentenzahl abhängig).<br />

Darüberhinaus sollte die neue Zerlegung sich „nicht zu stark“ von<br />

der alten Zerlegung unterscheiden; insbesondere sollte jedes der neuen<br />

Polygone nur eine möglichst geringe (d. h. durch eine Konstante beschränkte)<br />

Zahl der ursprünglichen Polygone schneiden, da sonst die<br />

Rekonstruktion des Lokationsergebnisses für die ursprüngliche Zerlegung<br />

zu zeitaufwendig wäre.<br />

Diese zentrale Idee, neue geometrische Objekte zu erzeugen, auf die<br />

dann das Konzept der binären Suche angewandt werden kann, geht auf<br />

Dobkin und Lipton zurück (siehe [6]) und wird bei beiden Ansätzen, die<br />

in den folgenden Abschnitten vorgestellt werden, ausgenutzt.<br />

p<br />

point location<br />

untere Schranke von<br />

Ω(log n)<br />

7


80 Lokationsprobleme in der Ebene<br />

Anfragezeit von Θ(log n)<br />

mit doppelter bin. Suche<br />

Ω(n 2 ) Speicherbedarf<br />

7.1 Die Slab-Methode<br />

Bei der Slab-Methode zerlegen wir die Ebene in eine Menge vertikaler<br />

Streifen (engl. slabs), deren Begrenzungslinien jeweils durch die Ecken<br />

des PSLGs induziert werden (vgl. auch die Schnittbestimmung konvexer<br />

Polygone mittels des Plane-sweep-Ansatzes in Abschnitt 5.2). Auf<br />

diese Weise erhalten wir eine neue planar subdivision, deren beschränkte<br />

Regionen ausschließlich Trapeze (bzw. Dreiecke) sind.<br />

Da nach Konstruktion der Streifen Si keine Ecke des PSLGs innerhalb eines<br />

Streifens liegt, sich demnach also auch keine zwei Kanten des PSLGs<br />

innerhalb eines Streifens schneiden, können wir für jeden Streifen Si eine<br />

Ordnung der von Si geschnittenen Kanten, ei1 ≤ ei2 ≤ · · · ≤ ein i ,<br />

angeben und zusammen mit Si abspeichern. Eine Point-location-Anfrage<br />

für einen Punkt p ist demnach sehr einfach mittels einer zweimaligen<br />

binären Suche zu realisieren:<br />

1. Zuerst bestimmen wir mittels binärer Suche bez. der<br />

x-Koordinaten denjenigen Streifen Si, der den Punkt p enthält.<br />

2. Dann führen wir erneut eine binäre Suche durch (bez. der<br />

y-Koordinaten) und ermitteln im Streifen Si die beiden bez. ihrer<br />

Ordnung aufeinanderfolgenden Segmente eij und eij+1 , die den<br />

Punkt p einschließen.<br />

Da sowohl die Gesamtzahl aller Streifen als auch die Zahl aller Segmente<br />

aus O(n) ist, erhalten wir auf diese Weise eine optimale Anfragezeit<br />

von Θ(log n).<br />

Wir müssen also nur noch analysieren, wie groß der Aufwand zur Speicherung<br />

der Streifen Si und der jeweiligen Segmentfolgen ei1 , . . . , eini ist und was es uns kostet, die zugehörigen Datenstrukturen zu erzeugen.<br />

Wie oben schon erwähnt, gibt es höchstens O(n) Streifen und<br />

in jedem Streifen maximal O(n) Segmente, was einen Gesamtspeicherbedarf<br />

von O(n2 ) zur Folge hat. Speichern wir die Streifen, sortiert<br />

nach ihren x-Koordinaten in einem Baum, dann kostet uns der Aufbau<br />

O(n log n) Zeit. Wenn wir für jeden Streifen Si die zugehörigen Segmente<br />

eij ebenfalls in einem eigenen Baum speichern, dann hat der Aufbau<br />

aller dieser Bäume einen Zeitbedarf von O(n · n log n). Insgesamt erhalten<br />

wir also einen Gesamtzeitbedarf von O(n2 log n) für den Aufbau<br />

der Lokationsdatenstruktur.<br />

Wir können allerdings ausnutzen, daß, wenn eine Kante des PSLGs<br />

durch mehrere Streifen verläuft, diese Streifen alle aufeinanderfolgen<br />

müssen. Diese Beobachtung erlaubt es uns, mittels eines Plane-sweep-<br />

Algorithmus alle Segmentfolgen mit einem Zeitbedarf von O(n 2 ) zu erzeugen<br />

(siehe z. B. [22, S. 47]).<br />

Unglücklicherweise ist aber Ω(n2 ) tatsächlich auch eine untere Schranke<br />

für die Worst-case-Komplexität des Speicherbedarfs beim Slab-Verfahren<br />

und wir können leicht ein Beispiel angeben, bei dem Ω(n) Streifen<br />

mit jeweils Ω(n) Segmenten entstehen. Somit erhalten wir für die Slab-<br />

Methode den folgenden Satz:


7.2 Das Verfahren der verfeinerten Triangulationen 81<br />

Satz 7.1 Das Point-location-Problem für einen PSLG der Gesamtkomplexität<br />

n kann mittels der Slab-Methode mit einem optimalen Zeitbedarf<br />

von Θ(log n) beantwortet werden. Der Preprocessing-Aufwand<br />

(Zeit und Speicher) ist hierbei aus Θ(n 2 ).<br />

Ein in der Größe des PSLGs quadratischer Speicherbedarf ist jedoch für<br />

praktische Anwendungen (d. h. umfangreiche PSLGs) untragbar, so daß<br />

die Slab-Methode nur für kleinere Anwendungen praktikabel ist.<br />

7.2 Das Verfahren der verfeinerten Triangulationen<br />

In diesem Abschnitt wollen wir ein Verfahren vorstellen, das ebenfalls<br />

eine optimale Anfragezeit von Θ(log n) besitzt, gleichzeitig aber auch<br />

nur einen linearen Speicher- und Preprocessing-Zeitbedarf besitzt – das<br />

Verfahren der verfeinerten (und vergröberten) Triangulationen, welches<br />

im Jahr 1983 von Kirkpatrick [13] vorgestellt wurde.<br />

7.2.1 Einschub »Die Eulersche Formel«<br />

Die Eulersche Formel (bzw. Eulersche Polyederformel) ist uns schon in<br />

Beobachtung 5.20 im Abschnitt 5.6 begegnet. Sie stellt einen Zusammenhang<br />

her zwischen den Ecken-, Kanten- und Flächenzahlen sowie<br />

der Zahl der Zusammenhangskomponenten eines in die Ebene eingebetteten<br />

ungerichteten, planaren Graphen. Genauer gilt der folgende<br />

Satz:<br />

Satz 7.2 Für die kreuzungsfreie Realisierung (in die Ebene) eines unge-<br />

richteten Graphen G = (V, E, γ) sei<br />

v seine Eckenanzahl |V| ,<br />

e seine Kantenanzahl |E| ,<br />

f seine Flächenanzahl (inklusive der unbeschränkten Region) ,<br />

c die Zahl seiner Zusammenhangskomponenten .<br />

Dann gilt<br />

v − e + f = c + 1 . (7.1)<br />

Beweis: Wir konstruieren die geometrische Realisierung von G sukzessive<br />

und zeigen durch Induktion, daß die Eulersche Formel jeweils<br />

erfüllt ist. Wir beginnen mit der Realisierung des Graphens, der nur<br />

die Knoten V von G, aber keine Kanten, enthält. Dann ist offensichtlich<br />

v = c, e = 0 und f = 1, also stimmt die Behauptung.<br />

Wir fügen jetzt nach und nach jeweils eine Kante aus E zu G hinzu und<br />

untersuchen, wie sich die Verhältnisse in der entsprechenden geometrischen<br />

Realisierung ändern. Es gibt zwei Fälle:<br />

Preprocessing-Aufwand<br />

von Θ(n 2 ) bei der Slab-<br />

Methode<br />

v = 11, e = 10, f = 3, c = 3


82 Lokationsprobleme in der Ebene<br />

1. die neue Kante verbindet zwei bisher disjunkte Zusammenhangskomponenten:<br />

In diesem Fall wächst e um 1 und die Zahl c der Zusammenhangskomponenten<br />

fällt um 1. Gleichung (7.1) bleibt also richtig.<br />

2. die neue Kante verbindet Knoten derselben Zusammenhangskomponente:<br />

In diesem Fall wachsen sowohl e als auch die Flächenzahl f um<br />

jeweils 1 und Gleichung (7.1) bleibt ebenfall richtig. ✷<br />

Schränken wir die zugelassenen geometrischen Graphen etwas ein, erhalten<br />

wir die beiden folgenden Korollare:<br />

Folgerung für einfache Korollar 7.3 Für die kreuzungsfreie Realisierung (in die Ebene) eines<br />

Graphen ungerichteten einfachen Graphen G = (V, E, γ) gilt<br />

e ≤ 3v − 6c ≤ 3v − 6<br />

f ≤ 2<br />

2<br />

3e − c + 1 ≤ 3e f ≤ 2v − 5c + 1 ≤ 2v − 4<br />

(7.2)<br />

Beweis: Wir müssen nur die erste Ungleichung beweisen. Durch Einsetzen<br />

von Gleichung (7.1) in diese ergeben sich die beiden anderen.<br />

Hierzu betrachten wir die einzelnen Zusammenhangskomponenten<br />

von G getrennt voneinander. Seien also deshalb vi, ei, und fi die Ecken-,<br />

Kanten- und Flächenzahlen desjenigen Graphen, der nur aus der i-ten<br />

Zusammenhangskomponente von G besteht. Wir erweitern nun diesen<br />

Graphen durch Hinzufügen neuer Kanten zu einem einfachen Graphen<br />

mit maximaler Kanten- und Flächenanzahl. In diesem so entstehenden<br />

Graphen werden offenbar alle beschränkten Regionen von genau drei<br />

Kanten begrenzt, denn sonst könnten wir noch eine neue Kante einfügen<br />

und die Zahl der Flächen und Kanten noch weiter erhöhen. (Weniger<br />

als drei begrenzende Kanten ist aufgrund der geforderten Einfachheit<br />

des Graphen ebenfalls nicht möglich)<br />

Seien nun emaxi und fmaxi die Kanten- und Flächenzahlen dieses neuen<br />

Graphen für die i-te Zusammenhangskomponente. Da jede Region<br />

von genau drei Kanten begrenzt wird und jede Kante genau zwei Regionen<br />

begrenzt, gilt 2emaxi = 3fmaxi . Durch Einsetzen von Gleichung (7.1)<br />

mit c = 1 erhält man dann ei ≤ emaxi = 3vi − 6.<br />

Da die Ecken und Kanten in den einzelnen Zusammenhangskomponenten<br />

von G disjunkt sind, gilt �c i=1 vi = v und �c i=1 ei = e, woraus durch<br />

Summation e ≤ 3v − 6c folgt. ✷<br />

Folgerung für Graphen mit Korollar 7.4 Für die kreuzungsfreie Realisierung (in die Ebene) eines<br />

Knotengrad ≥ 3 ungerichteten Graphen G = (V, E, γ), dessen Knoten alle einen Grad<br />

von mindestens 3 besitzen, gilt<br />

v ≤ 2<br />

3 e<br />

v ≤ 2(f − c − 1) ≤ 2f − 4<br />

e ≤ 3(f − c − 1) ≤ 3f − 6<br />

(7.3)


7.2 Das Verfahren der verfeinerten Triangulationen 83<br />

Beweis: Von jedem Knoten gehen nach Voraussetzung mindestens drei<br />

Kanten aus. Da jede Kante zwei Knoten miteinander verbindet, gilt 2e ≥<br />

3v. Die beiden anderen Ungleichungen erhält man wieder durch Einsetzen<br />

von Gleichung (7.1). ✷<br />

Ein PSLG, wie wir ihn definiert haben, ist offensichtlich ein einfacher<br />

kreuzungsfrei in der Ebene realisierter Graph mit genau einer Zusammenhangskomponente<br />

(d. h. c = 1), so daß die Voraussetzungen von<br />

Satz 7.2 und Korollar 7.3 für einen PSLG immer erfüllt sind. Hieraus<br />

folgt dann auch sofort Beobachtung 5.20 auf Seite 63 – die Gesamtkomplexität<br />

eines PSLGs (also v + e + f) ist größenordnungsmäßig nicht größer<br />

als die Zahl v seiner Ecken.<br />

Bemerkung 7.5 Die Bezeichnung »Eulersche Polyederformel« resultiert<br />

aus der Tatsache, daß Gleichung (7.1) – ebenso wie die Ungleichungen –<br />

auch für ein Polyeder im dreidimensionalen Raum gilt (mit c = 1).<br />

Denn durch eine geeignete stetige Transformation können wir ein evtl.<br />

nicht-konvexes Polyeder zunächst in ein konvexes Polyeder überführen.<br />

Dieses bzw. seine Ecken und Kanten projizieren wir dann auf eine umschriebene<br />

Kugeloberfläche und anschließend vom „Nordpol“ der Kugel<br />

in eine zum „Südpol“ tangential verlaufende Ebene. Abbildung 7.1<br />

illustriert diesen Sachverhalt anhand eines zweidimensionalen Schnitts<br />

durch die Szene: die Ecken und Kanten des schwarzen konvexen Polyeders<br />

werden auf die Kugeloberfläche (grün) projiziert und von dort aus<br />

in die Projektionsebene (blau).<br />

Die Inzidenzen bleiben bei allen diesen Transformationen erhalten: Jede<br />

Kante des Polyeders wird auf eine (evtl. krummlinige) Kante in der<br />

Projektionsebene abgebildet und jede Fläche auf eine beschränkte Region<br />

des entstehenden planaren Graphen. Die einzige Ausnahme bildet<br />

diejenige „Fläche“ auf der Kugel, die den Nordpol enthält; diese wird<br />

auf die unbeschränkte Region abgebildet. (Der Nordpol sollte natürlich<br />

nicht gerade durch eine Ecke oder Kante verlaufen.)<br />

Somit haben wir das ursprüngliche Polyeder in einen kreuzungsfrei in<br />

die Ebene eingebetteten Graphen transformiert, für den die Eulersche<br />

Formel (und auch die beiden Korollare) gilt. Deren Aussagen übertragen<br />

sich damit auf die Ecken-, Kanten- und Flächenzahlen des Polyeders.<br />

⊳<br />

Abbildung 7.1<br />

Projektion des Polyeders<br />

auf eine Kugeloberfläche<br />

und von dort in die Ebene


84 Lokationsprobleme in der Ebene<br />

maximaler PSLG<br />

Triangulation<br />

7.2.2 Die Methode von Kirkpatrick<br />

Da das Verfahren der verfeinerten Triangulationen nur für solche PSLGs<br />

definiert ist, deren Regionen ausschließlich Dreiecke sind, führen wir<br />

hierfür eine eigene Bezeichnung ein.<br />

Definition 7.6 (Maximaler PSLG) Ein PSLG, zu dem keine weitere<br />

Kante, die zwei Ecken des PSLGs verbindet, hinzugefügt werden kann<br />

ohne seine Planarität zu verletzen, heißt ein maximaler PSLG.<br />

Man kann leicht zeigen, daß in einem maximalen PSLG jede der beschränkten<br />

Regionen ein Dreieck ist und daß sich jeder PSLG der Gesamtkomplexität<br />

n durch Hinzunahme weiterer Kanten in einen maximalen<br />

PSLG verwandeln läßt, der (aufgrund von Korollar 7.3) ebenfalls<br />

eine Komplexität aus O(n) besitzt.<br />

Definition 7.7 (Triangulation) Einen maximalen PSLG, bei dem der<br />

Rand der äußeren unbeschränkten Region ebenfalls ein Dreieck ist, nennen<br />

wir eine Triangulation.<br />

Eine Triangulation einer endlichen Punktmenge P ⊂ E 2 ist ein maximaler<br />

PSLG, der genau P als Eckenmenge besitzt.<br />

Wir nehmen also im folgenden an, daß wir das Point-location-Problem<br />

für den Spezialfall einer Triangulation beantworten wollen.<br />

Dies ist keine sehr große Einschränkung, denn jeder PSLG der Gesamtkomplexität<br />

n kann durch Hinzunahme dreier zusätzlicher Ecken und<br />

weiterer Kanten in eine Triangulation der Gesamtkomplexität O(n) verwandelt<br />

werden:<br />

1. Hierzu bestimmen wir zunächst ein Dreieck, das alle Ecken des<br />

PSLGs umschließt, beispielsweise indem wir in linearer Zeit mittels<br />

der maximalen und minimalen x- und y-Koordinaten dem<br />

PSLG ein Rechteck umschreiben und für dieses mit konstantem<br />

Zeitbedarf ein umschließendes Dreieck bestimmen.<br />

Dieses Dreieck fügen wir dem PSLG hinzu und verbinden jeweils<br />

jede Ecke des Dreiecks mit einer geeigneten extremalen Ecke des<br />

PSLGs. Der Gesamtzeitaufwand für diesen Schritt ist aus O(n).<br />

2. Jetzt müssen wir noch jede der beschränkten polygonalen Regionen<br />

triangulieren. Chazelle konnte zeigen, daß sich jedes einfache<br />

Polygon in linearer Zeit triangulieren läßt [3] – allerdings mit<br />

einem völlig unpraktikablen Algorithmus, der kaum von praktischem<br />

Interesse ist.<br />

Die Triangulation aller beschränkten Regionen kostet uns somit<br />

ebenfalls nur O(n) Zeit.<br />

3. Die auf diese Weise ggf. neu entstehenden Dreiecksregionen müssen<br />

natürlich noch einen Verweis auf diejenige Region des ursprünglichen<br />

PSLGs erhalten, in welcher sie enthalten sind.


7.2 Das Verfahren der verfeinerten Triangulationen 85<br />

Algorithmus 7.1 Point-location in einer Subdivision-Hierarchie<br />

LOCATE(p)<br />

Input: Subdivision-Hierarchie T1, . . . , Th<br />

Anfragepunkt p<br />

1 CAND h ← alle Regionen von Th<br />

2 R ← diejenige Region aus CAND h, die p enthält<br />

3 i = h − 1<br />

4 while i > 0 do<br />

5 CAND i ← alle Elternregionen von R in Ti<br />

6 R ← diejenige Region aus CAND i , die p enthält<br />

7 i ← i − 1<br />

8 end while<br />

Output: R ist diejenige Region von T1, die den Punkt p enthält<br />

Wir erhalten somit folgendes zusammenfassendes Lemma, welches die<br />

Einschränkung auf Triangulationen beim Point-location-Problem rechtfertigt:<br />

Lemma 7.8 Zu einem gegebenen PSLG der Gesamtkomplexität n kann<br />

mit einem Zeitbedarf von O(n) eine Triangulation (der Gesamtkomplexität<br />

O(n)) erzeugt werden.<br />

7.2.3 Subdivision-Hierarchien<br />

linearer Zeitbedarf zum<br />

Triangulieren eines PSLGs<br />

Die zentrale Idee des Verfahrens ist nun, zu der gegebenen Triangulation<br />

T eine Folge T1, . . . , Th Triangulationen zu erzeugen (eine sog. subdivision<br />

hierarchy), für die folgendes gilt: subdivision hierarchy<br />

• T1 = T .<br />

• Jede Region R von Ti+1 besitzt Zeiger auf diejenigen Regionen R ′<br />

von Ti, für die R ∩ R ′ �= ∅ gilt (für 1 ≤ i < h). Diese Regionen<br />

heißen die Eltern von R in Ti.<br />

Die Zahl h bezeichnen wir hierbei als die Höhe der Subdivision-Hierarchie.<br />

Der Speicherplatzbedarf einer solchen Hierarchie ist offensichtlich<br />

die Summe der Einzelkomplexitäten der Triangulationen, O( �h i=1 |Ti|),<br />

plus den zusätzlichen Platzbedarf für die Verzeigerung.<br />

Für einen Anfragepunkt p kann jetzt die entsprechende Region aus T1, Point-location mittels<br />

die p enthält, mittels eines Durchlaufs durch die Subdivision-Hierarchie<br />

– beginnend bei Th – gefunden werden, siehe Algorithmus 7.1.<br />

Da der Point-in-polygon-Test für ein Dreieck in konstanter Zeit durchgeführt<br />

werden kann, ist der Gesamtzeitbedarf für Algorithmus 7.1 offensichtlich<br />

aus O( �h i=1 |CAND i|). Somit muß es unser Ziel sein, eine Subdivision-Hierarchie<br />

zu konstruieren, bei der sowohl die Höhe als auch<br />

die Größe der Mengen CAND i möglichst klein sind. Daß dies tatsächlich<br />

möglich ist, wollen wir im folgenden zeigen.<br />

Durchlauf durch die<br />

Subdivision-Hierarchie


86 Lokationsprobleme in der Ebene<br />

v<br />

Lemma 7.9 Es gibt positive Konstanten c und d, so daß für jede Triangulation<br />

T mit mehr als drei Ecken mit einem Zeitbedarf von O(|T|) eine<br />

Triangulation T ′ konstruiert werden kann, für die gilt<br />

• |T ′ | ≤ (1 − 1/c) · |T| ,<br />

• jede Region von T ′ hat höchstens d Eltern in T.<br />

Beweis: Sei n die Zahl der Ecken von T und sei v irgendeine innere<br />

Ecken von T, d. h. eine Ecke, die nicht auf dem Rand der unbeschränkten<br />

Region liegt, und sei g(v) ihr Grad (im zugehörigen Graphen).<br />

Dann grenzen an v genau g(v) Regionen und die Vereinigung<br />

dieser Regionen (die Nachbarschaft von v) ergibt ein sternförmiges Polygon<br />

mit g(v) Ecken.<br />

Wenn wir nun die Ecke v und die g(v) inzidenten Kanten aus dem PSLG<br />

entfernen und die Nachbarschaft von v neu triangulieren (durch Einfügen<br />

von g(v)−3 neuen Kanten), erhalten wir eine neue Triangulation mit<br />

n − 1 Ecken. Außerdem schneidet jede der neuen Regionen – unabhängig<br />

davon, wie retrianguliert wurde – maximal g(v) der ursprünglichen<br />

Regionen von T.<br />

Betrachten wir jetzt zwei unabhängige Ecken v und w, d. h. zwei Ecken,<br />

die nicht durch eine Kante verbunden sind, dann überlappen sich die<br />

Nachbarschaften dieser Ecken offensichtlich nicht. Somit können beide<br />

Ecken gleichzeitig aus dem PSLG entfernt und die Nachbarschaften<br />

retrianguliert werden. Die entstehende Triangulation hat dann die Eigenschaft,<br />

daß keine ihrer Regionen mehr als max{g(v), g(w)} der ursprünglichen<br />

Regionen von T schneidet.<br />

gleichzeitiges Entfernen Diese Argumention können wir jetzt ausdehnen auf eine Menge<br />

unabhängiger Ecken v1, . . . , vt paarweise unabhängiger Ecken in T. Durch Entfernen dieser<br />

Ecken und anschließendem Retriangulieren der t sternförmigen Polygone<br />

erhalten wir eine neue Triangulation T ′ mit n − t Ecken und der<br />

Eigenschaft, daß keine Region von T ′ mehr als max1≤i≤t g(vi) Regionen<br />

von T schneidet.<br />

durchschnittlicher<br />

Eckengrad ist ≤ 6<br />

Es genügt jetzt also noch zu zeigen, daß es Konstanten c und d gibt, so<br />

daß eine Menge v1, . . . , vt unabhängiger Ecken mit g(vi) ≤ d (für 1 ≤<br />

i ≤ t) und t ≥ |T| /c immer mit einem Zeitbedarf von O(|T|) bestimmt<br />

werden kann. Dies ist eine direkte Folge aus dem nächsten Lemma. ✷<br />

Lemma 7.10 Es gibt positive Konstanten c und d, so daß jeder PSLG mit<br />

n Ecken mindestens n/c unabhängige Ecken mit einem Grad kleiner<br />

oder gleich d besitzt. Diese können mit einem Zeitaufwand von O(n)<br />

bestimmt werden.<br />

Beweis: Nach Korollar 7.3 besitzt ein PSLG mit n Ecken höchstens<br />

3n − 6 Kanten. Da jede dieser Kanten zwei Ecken miteinander verbindet,<br />

gibt es also maximal 6n − 12 Kantenenden und der durchschnittliche<br />

Eckengrad ist somit kleiner oder gleich (6n − 12)/n ≤ 6. Dar-<br />

aus folgt, daß höchstens die Hälfte aller Ecken einen Grad größer oder


7.2 Das Verfahren der verfeinerten Triangulationen 87<br />

gleich 11 besitzen können, denn sonst stünden nicht genügend Kanten<br />

zur Verfügung. Wir wählen also d = 11 und bestimmen in linearer<br />

Zeit die Teilmenge V aller Ecken, deren Grad kleiner oder gleich 11 ist<br />

(mit |V| ≥ n/2).<br />

Mit einer einfachen Eliminationsstrategie können wir dann in linearer<br />

Zeit eine unabhängige Teilmenge von V bestimmen. Aufgrund des beschränkten<br />

Grades der Ecken in V werden pro ausgewählter Ecke v<br />

maximal 11 Ecken aus V eliminiert, die zu v adjazent sind. Somit<br />

bleiben mindestens noch |V| /12 ≥ n/24 Ecken übrig und wir erhalten<br />

c = 24. ✷<br />

Durch wiederholte Anwendung von Lemma 7.9 erhalten wir dann den<br />

folgenden Satz, der uns die Existenz einer Subdivision-Hierarchie mit<br />

den gewünschten Eigenschaften garantiert:<br />

Satz 7.11 Zu einem PSLG der Gesamtkomplexität n kann mit einem<br />

Zeitbedarf von O(n) eine Folge T1, . . . , Th von Triangulationen erzeugt<br />

werden mit folgenden Eigenschaften:<br />

• Jede Region von T1 ist ganz in einer Region des PSLGs enthalten.<br />

• Es gibt eine positive Konstante d, so daß jede Region von Ti+1<br />

höchstens d Eltern in Ti besitzt (für 1 ≤ i < h).<br />

• Der Gesamtspeicherbedarf der Hierarchie ist aus O(n).<br />

• Die Höhe h der Hierarchie ist aus O(log n).<br />

Beweis: Nach den einleitenden Überlegungen von oben kann der PSLG<br />

in linearer Zeit in eine Triangulation T1 überführt werden, so daß jede<br />

Region von T1 ganz in einer Region des PSLGs enthalten ist. Mittels<br />

Lemma 7.9 erhalten wir dann aus T1 eine echte Triangulation T2 mit<br />

|T2| ≤ (1 − 1/c) · |T1|. Durch mehrfache Anwendung des Lemmas (solange,<br />

bis die Triangulation nur noch aus einem einzigen Dreieck besteht)<br />

erhalten wir eine Folge von Triangulationen T1, . . . , Th, deren Komplexitäten<br />

geometrisch fallen, und es gilt<br />

|T1| ∈ O(n)<br />

|Ti+1| ≤ (1 − 1/c) i · |T1| für 1 ≤ i < h<br />

|Th| ∈ O(1)<br />

Wegen Lemma 7.9 besitzt für 1 ≤ i < h jede Region von Ti+1 höchstens<br />

d Eltern in Ti und der Gesamtspeicherbedarf von O( �h i=1 d·|Ti|) =<br />

O( �h i=1 d · (1 − 1/c)i−1 · n) ist damit aus O(n). Hierbei schätzt der (konstante)<br />

Faktor d den zusätzlichen Aufwand für die Verzeigerung ab.<br />

Außerdem folgt wegen (1 − 1/c) h−1 · |T1| ≥ |Th| ∈ O(1) sofort h ∈<br />

O(log n). ✷<br />

Aus der Existenz einer solchen Subdivision-Hierarchie erhalten wir<br />

dann sofort folgendes Korollar zur Methode der verfeinerten Triangulationen:


88 Lokationsprobleme in der Ebene<br />

Anfrage in Θ(log n)<br />

Preprocessing in Θ(n)<br />

Korollar 7.12 Das Point-location-Problem für einen PSLG der Gesamtkomplexität<br />

n kann mittels der Methode der verfeinerten Triangulationen<br />

mit einem optimalen Zeitbedarf von Θ(log n) beantwortet werden.<br />

Der Preprocessing-Aufwand (Zeit und Speicher) ist hierbei jeweils<br />

aus Θ(n).<br />

Beweis: Die logarithmische Anfragezeit ergibt sich aus dem Gesamtzeitbedarf<br />

von O( �h i=1 |CAND i|) für Algorithmus 7.1, der wegen<br />

|CAND i| ≤ d und h ∈ O(log n) logarithmisch in n ist. ✷<br />

Das Verfahren von Kirkpatrick ist somit in jeglicher Hinsicht optimal.<br />

Sowohl die Anfragezeit als auch der Zeit- und der Speicherbedarf<br />

für das Preprocessing genügen den unteren Schranken für das Pointlocation-Problem.<br />

Allerdings gibt es für praktische Probleme trotzdem sinnvollere Alternativen<br />

als dieses Verfahren. Denn zum einen wird schon ein triangulierter<br />

PSLG vorausgesetzt (und der Triangulatiosalgorithmus von Chazelle<br />

ist für praktische Belange indiskutabel) und zum anderen sind die<br />

in der O-Notationen versteckten Konstanten relativ groß. Trotzdem besticht<br />

dieses Verfahren durch seine konzeptionelle Einfachheit und der<br />

erreichten Optimalität bezüglich aller geforderten Kriterien »Anfragezeit«,<br />

»Preprocessing-Aufwand« und »Speicherbedarf«.


Nachbarschaftsprobleme<br />

Ein Nachbarschaftsproblem ist ganz allgemein und abstrakt durch folgende<br />

Größen charakterisiert:<br />

• Einen Raum X (in unserem Fall ist dies der zweidimensionale reelle<br />

Raum R 2 ),<br />

• eine (endliche) Menge P von Objekten (hier: eine Teilmenge P ⊂ X<br />

von Punkten),<br />

• eine Möglichkeit der Objekte, Einfluß auf den Raum auszuüben.<br />

In unserem Fall wird diese Einflußnahme eines Objektes p ∈ P auf<br />

einen Punkt x ∈ X des Raumes durch den Abstand d(p, x) ausgedrückt<br />

(je geringer d(p, x), desto größer der Einfluß von p auf x).<br />

Hierbei gehen wir davon aus, daß die Funktion d(x, y) eine Metrik<br />

auf X (meist die euklidische Metrik) ist, das Paar (X, d) also einen<br />

metrischen Raum darstellt.<br />

8<br />

Man interessiert sich nun z. B. bei einem Objekt p ∈ P für die Gestalt<br />

und die Größe seines Einflußbereiches, d. h. für diejenige Region, für die<br />

der Einfluß von p stärker ist als der Einfluß eines der anderen Objekte<br />

(vgl. das Problem »Nähestes Telefon« in Abschnitt 1.2). Ein weiteres<br />

typisches Nachbarschaftsproblem ist, für einen Punkt x ∈ X dasjenige<br />

Objekt p ∈ P zu bestimmen, das den stärksten Einfluß auf x ausübt,<br />

also dasjenige Objekt, in dessen Einflußbereich x liegt. Dies wird als das<br />

Problem des nächsten Nachbarn (engl. nearest neighbor problem) bezeichnet. Nearest-Neighbor-Problem<br />

Solche Überlegungen führen uns im folgenden zum Begriff der Voronoi-<br />

Region und des Voronoi-Diagramms.<br />

8.1 Definition und Eigenschaften des Voronoi-<br />

Diagramms<br />

Im folgenden gehen wir – sofern nicht anders angegeben – immer davon<br />

aus, daß unsere Objekte Punkte im zweidimensionalen euklidischen<br />

Raum E2 sind. Insbesondere wird also der Einfluß eines Objekts p auf<br />

einen Punkt x durch die euklidische Metrik<br />

�<br />

|p x| = (p1 − x1) 2 + (p2 − x2) 2


90 Nachbarschaftsprobleme<br />

Abbildung 8.1<br />

Bisektoren in der<br />

Manhattan-Metrik (links)<br />

und der<br />

Maximum-Metrik (rechts)<br />

p<br />

Bisektor<br />

B(p, q)<br />

q<br />

flächige Bisektoren<br />

beschrieben.<br />

Wir betrachten nun zunächst den Fall von nur zwei Punkten p und q<br />

und interessieren uns für die Grenze zwischen ihren Einflußbereichen,<br />

den sog. Bisektor der beiden Punkte.<br />

Definition 8.1 (Bisektor) Der Bisektor B(p, q) zweier Punkte p und q<br />

im E2 ist definiert als<br />

Da die letzte Zeile der Umformung<br />

x ∈ B(p, q) ⇐⇒ |p x| = |q x|<br />

B(p, q) := { x ∈ E 2 � � |p x| = |q x| } . (8.1)<br />

⇐⇒ (p1 − x1) 2 + (p2 − x2) 2 = (q1 − x1) 2 + (q2 − x2) 2<br />

⇐⇒ p 2 1 − 2p1x1 + x 2 1 + p 2 2 − 2p2x2 + x 2 2 =<br />

q 2 1 − 2q1x1 + x 2 1 + q 2 2 − 2q2x2 + x 2 2<br />

⇐⇒ x1(2q1 − 2p1)<br />

+ x2(2q2 − 2p2)<br />

− (q 2 1 + q 2 2 − p 2 1 − p 2 2) = 0<br />

die Normalenform einer Geraden im R2 darstellt, ist der Bisektor B(p, q)<br />

für die euklidische Metrik eine Gerade (nämlich genau die Mittelsenkrechte<br />

des Liniensegments [p q]).<br />

Bemerkung 8.2 Legen wir andere Metriken als die euklidische Metrik<br />

zugrunde, können durchaus auch „kompliziertere“ Gebiete als Bisektoren<br />

auftreten. Abbildung 8.1 zeigt beispielsweise links Bisektoren bei<br />

Verwendung der Manhattan-Metrik und rechts bei Verwendung der<br />

Maximum-Metrik (siehe deren Definition auf Seite 6). Offenbar können<br />

hier sogar flächige Bisektoren auftreten: Bei der Manhattan-Metrik tritt<br />

ein solcher Spezialfall ein, wenn die beiden Punkte gegenüberliegende<br />

Eckpunkte eines Quadrats sind, und bei der Maximum-Metrik, wenn sie<br />

gleiche x- oder y-Koordinaten besitzen. ⊳<br />

Der (euklidische) Bisektor für zwei Punkte p und q zerlegt die Ebene in<br />

zwei Halbebenen, nämlich in<br />

D(p, q) := { x ∈ E 2 � � |p x| < |q x| }


8.1 Definition und Eigenschaften des Voronoi-Diagramms 91<br />

und<br />

D(q, p) = { x ∈ E 2 � � |p x| > |q x| } ,<br />

mittels derer wir jetzt auch für mehr als zwei Punkte deren Einflußbereiche<br />

– ihre sog. Voronoi-Regionen – definieren können.<br />

Definition 8.3 (Voronoi-Diagramm)<br />

Für eine Menge P = {p1, . . . , pn} ⊂ E2 von n Punkten in der Ebene ist<br />

die Voronoi-Region des Punktes pi ∈ P die Menge Voronoi-Region<br />

VR(pi) := �<br />

D(pi, pj) .<br />

Die Menge<br />

1≤j≤n<br />

j�=i<br />

VD(P) := E 2 \ �<br />

1≤i≤n<br />

VR(pi)<br />

bezeichnen wir als das Voronoi-Diagramm der Punktmenge P. Voronoi-Diagramm<br />

Aufgrund der Definition ist die Voronoi-Region VR(pi) eines Punktes pi<br />

der Schnitt von n − 1 offenen Halbebenen, die jeweils alle pi enthalten.<br />

Somit besitzt VR(pi) innere Punkte und kann als konvexes (möglicherweise<br />

unbeschränktes) Polygon dargestellt werden, das von maximal<br />

n − 1 Ecken und maximal n − 1 Kanten (bzw. Halbstrahlen) berandet<br />

wird. Das Voronoi-Diagramm besteht dann gerade aus denjenigen Bisektorteilen,<br />

die nicht im Innern eines dieser Polygone liegen. Der folgende<br />

Satz beschreibt deren Struktur etwas genauer:<br />

Satz 8.4 Sei P = {p1, . . . , pn} ⊂ E 2 eine Menge von n Punkten in der<br />

Ebene. Falls alle Punkte auf einer Geraden liegen, dann besteht das<br />

Voronoi-Diagramm aus n − 1 parallelen Geraden, ansonsten ist VD(P)<br />

wegzusammenhängend und besteht nur aus Segmenten und Halbstrahlen.<br />

Beweis: Die erste Aussage des Satzes ist einfach nachzuprüfen, wir zeigen<br />

deshalb gleich die zweite Aussage und nehmen an, daß nicht alle<br />

n ≥ 3 Punkte auf einer Geraden liegen.<br />

Wir zeigen zunächst, daß VD(P) nur aus Segmenten und Halbstrahlen<br />

besteht. Angenommen, dies wäre nicht der Fall, dann müßte VD(P) eine<br />

Gerade g enthalten, welche auf dem Rand zweier Voronoi-Regionen<br />

– o. B. d. A. VR(pi) und VR(pj) – liegt. Sei nun pk ∈ P ein Punkt, der<br />

nicht kollinear zu pi und pj liegt. Dann ist der Bisektor B(pk, pj) nicht pi pj<br />

parallel zu g und schneidet die Gerade. Somit kann aber der Teil der<br />

Geraden g, der im Innern von D(pk, pj) liegt, nicht zum Voronoi-Diagramm<br />

gehören und wir erhalten einen Widerspruch.<br />

Wir müssen jetzt nur noch zeigen, daß VD(P) wegzusammenhängend<br />

ist. Wäre dem nicht so, dann müßte es eine Voronoi-Region VR(pi) geben,<br />

die die komplette Ebene teilt. Da Voronoi-Regionen konvex sind,<br />

g<br />

pk


92 Nachbarschaftsprobleme<br />

Abbildung 8.2<br />

Die drei möglichen Fälle<br />

eines Punktes x der Ebene<br />

Repräsentation des<br />

Voronoi-Diagramms als<br />

PSLG<br />

VR(pi) unbeschränkt<br />

⇐⇒ pi ∈ ∂CH(P)<br />

x<br />

pi<br />

x<br />

müßte VR(pi) aus einem Streifen bestehen, der von zwei parallelen Geraden<br />

begrenzt wird. Dies ist aber – wie eben gezeigt – nicht möglich.<br />

✷<br />

Außer für den einfachen Spezialfall von n kollinearen Punkten ist das<br />

Voronoi-Diagramm also wegzusammenhängend und kann als PSLG<br />

(siehe Abschnitt 5.6) repräsentiert werden, sofern wir die Halbstrahlen,<br />

welche die unbeschränkten Regionen beranden, geeignet berücksichtigen.<br />

Die Voronoi-Knoten und Voronoi-Kanten entsprechen dann den Knoten<br />

und Kanten (bzw. Halbstrahlen) des PSLGs.<br />

Das folgende Lemma gestattet uns, jeden Punkt der Ebene eindeutig<br />

einer der drei Mengen »Voronoi-Knoten«, »Voronoi-Kante« oder<br />

»Voronoi-Region« zuzuordnen. Ein Beweis dieses Lemmas findet sich<br />

z. B. in [14, S. 215].<br />

Lemma 8.5 Für einen Punkt x ∈ E 2 sei C(x) die kleinste abgeschlossene<br />

ε-Kugel U ε(x) um x,<br />

pi<br />

pj<br />

U ε(x) = { y ∈ E 2 � � |x y| ≤ ε } ,<br />

die mindestens einen Punkt aus P = {p1, . . . , pn} enthält. Dann gilt:<br />

P ∩ C(x) = {pi} ⇐⇒ x liegt in der Voronoi-Region VR(pi) des Punktes<br />

pi (siehe Abbildung 8.2, links).<br />

P ∩ C(x) = {pi, pj} ⇐⇒ x liegt auf der Voronoi-Kante, die die Regionen<br />

VR(pi) und VR(pj) begrenzt (siehe Abbildung 8.2, Mitte).<br />

P ∩ C(x) = {pi1 , . . . , pik } (mit k ≥ 3) ⇐⇒ x ist ein Voronoi-Knoten,<br />

an den die Regionen VR(pi1 ), . . . , VR(pik ) angrenzen. Dabei entspricht<br />

die zyklische angulare Ordnung der Punkte pi1 , . . . , pik<br />

um x der Ordnung ihrer Voronoi-Regionen um x (siehe Abbildung<br />

8.2, rechts).<br />

Mit Hilfe dieses Lemmas können wir eine interessante Eigenschaft der<br />

unbeschränkten Regionen des Voronoi-Diagramms beweisen:<br />

Satz 8.6 Eine Voronoi-Region VR(pi) eines Punktes pi ∈ P ist genau<br />

dann unbeschränkt, wenn der Punkt pi auf dem Rand der konvexen<br />

Hülle von P liegt.<br />

pk<br />

x<br />

pi<br />

pj


8.1 Definition und Eigenschaften des Voronoi-Diagramms 93<br />

Beweis: Angenommen, die Voronoi-Region VR(pi) ist unbeschränkt.<br />

Dann muß es einen weiteren Punkt pj geben, so daß ein unbeschränktes<br />

Stück des Bisektors B(pi, pj) zum Voronoi-Diagramm VD(P) gehört.<br />

Wir wählen einen Punkt x auf diesem Stück und betrachten den in Lemma<br />

8.5 definierten Kreis C(x), auf dessen Rand die beiden Punkte pi<br />

und pj liegen.<br />

Schieben wir x auf der unbeschränkten Voronoi-Kante weit genug<br />

nach rechts (ins „Unendliche“), können wir jeden Punkt in der rechten<br />

(durch pi und pj induzierten) Halbebene mit C(x) überdecken. Da<br />

nach Lemma 8.5 der Kreis C(x) keinen weiteren Punkt aus P enthalten<br />

kann, müssen alle übrigen Punkte aus P \ {pi, pj} in der linken Halbebene<br />

liegen und das Segment [pi pj] liegt auf dem Rand der konvexen<br />

Hülle CH(P).<br />

Sind umgekehrt pi und pj zwei benachbarte Ecken von CH(P) und<br />

liegt P o. B. d. A. links der Geraden pi pj, dann läßt sich immer ein Halbstrahl<br />

auf dem Bisektor B(pi, pj) finden (indem wir weit genug nach<br />

rechts wandern), so daß jeder Kreis C(x) mit einem Mittelpunkt x auf<br />

dem Halbstrahl keinen weiteren Punkt aus P\{pi, pj} mehr enthält. Folglich<br />

bildet ein unbeschränktes Stück von B(pi, pj) – nämlich eben jener<br />

Halbstrahl – eine Voronoi-Kante und auch VR(pi) und VR(pj) sind unbeschränkt.<br />

✷<br />

Für das Voronoi-Diagramm als eine Unterteilung der Ebene in Regionen<br />

größten Einflusses interessiert uns natürlich, wie komplex diese Unterteilung<br />

sein kann:<br />

Satz 8.7 Das Voronoi-Diagramm einer n-elementigen Punktmenge in<br />

der Ebene besteht aus höchstens 2n − 5 Ecken und 3n − 6 Kanten.<br />

Beweis: Falls alle n Punkte auf einer Geraden liegen, folgt die Behauptung<br />

sofort aus Satz 8.4. Wir nehmen deshalb an, dies wäre nicht der Fall<br />

und erweitern das Voronoi-Diagramm zu einem (zusammenhängenden)<br />

planaren Graphen, indem wir eine zusätzliche Ecke einführen, die wir<br />

mit allen Halbstrahlen (von denen es mindestens drei geben muß) verbinden.<br />

Auf diese Weise erhalten wir einen Graphen, dessen Knoten<br />

alle einen Grad von mindestens 3 besitzen, und wir können Korollar 7.4<br />

darauf anwenden. Die Flächenzahl f des Graphen ist dabei gleich der<br />

Zahl n der Punkte, die Kantenzahl e gleich der Zahl der Voronoi-Kanten<br />

und die Eckenzahl v gleich der Zahl der Voronoi-Knoten plus eins.<br />

Somit folgt die Behauptung aus Ungleichung (7.3). ✷<br />

Die Komplexität des Voronoi-Diagramms für eine Punktmenge ist also<br />

nur linear in der Zahl der Punkte. Zusammen mit Satz 8.6 auf der vorherigen<br />

Seite erhalten wir dann aus dem vorherigen Satz sofort die folgende<br />

Aussage zur Konstruktion der konvexen Hülle einer Punktmenge:<br />

Korollar 8.8 Aus dem Voronoi-Diagramm VD(P) einer n-elementigen<br />

Punktmenge P kann mit einem Zeitbedarf von O(n) die konvexe Hülle<br />

CH(P) konstruiert werden.<br />

L R<br />

pj<br />

pi<br />

x<br />


94 Nachbarschaftsprobleme<br />

unt. Schr. von Ω(n log n)<br />

für Voronoi-Diagramm<br />

Delaunay-Zerlegung<br />

DG(P) ist planar<br />

Beweis: Für das gegebene Voronoi-Diagramm müssen wir nur eine<br />

unbeschränkte Regionen finden und uns dann an den unbeschränkten<br />

Kanten entlang einmal um die Punktmenge herum bewegen. Dabei<br />

wird jede Voronoi-Kante höchstens einmal inspiziert und der Gesamtzeitbedarf<br />

ist aus O(n). ✷<br />

Aufgrund der unteren Schranke von Ω(n log n) aus Satz 6.3 für die Konstruktion<br />

der konvexen Hülle ergibt sich damit auch sofort eine untere<br />

Schranke für die Konstruktion des Voronoi-Diagramms:<br />

Korollar 8.9 Die Konstruktion des Voronoi-Diagramms von n Punkten<br />

in der Ebene besitzt einen Zeitbedarf von Ω(n log n).<br />

8.2 Der Delaunay-Graph<br />

Definition 8.10 (Delaunay-Graph) Sei P eine Menge von n Punkten<br />

in der Ebene und E die Menge aller Voronoi-Kanten im Voronoi-Diagramm<br />

VD(P). Der ungerichtete Graph DG(P) = (P, E, γ) mit Eckenmenge<br />

P, Kantenmenge E und einer Abbildung<br />

γ: e ↦→ {pi, pj} für eine Voronoi-Kante e auf dem Bisektor B(pi, pj)<br />

heißt der Delaunay-Graph zur Menge P.<br />

Seine geometrische Realisierung, die jede Ecke auf den zugehörigen<br />

Punkt in der Ebene und jede Kante e = {pi, pj} auf das Liniensegment<br />

[pi pj] abbildet, heißt die von der Punktmenge P induzierte Delaunay-Zerlegung.<br />

Ein Liniensegment [pi pj] dieser Zerlegung nennt man<br />

auch Delaunay-Kante.<br />

Aufgrund der Konvexität der Voronoi-Regionen gibt es zu jedem<br />

Bisektor B(pi, pj) höchstens eine Voronoi-Kante. Somit enthält der<br />

Graph DG(P) auch höchstens eine Kante zwischen je zwei Punkten<br />

pi, pj ∈ P. Für die vom Delaunay-Graphen induzierte Zerlegung<br />

der Ebene können wir damit eine wichtige Eigenschaft zeigen:<br />

Satz 8.11 Die zu einem Delaunay-Graphen DG(P) gehörende Delaunay-<br />

Zerlegung ist kreuzungsfrei, d. h. der Graph DG(P) ist planar.<br />

Beweis: Wir nehmen an, es gäbe zwei Segmente [pi pj] und [pk pl] in<br />

der Delaunay-Zerlegung, die sich in einem Punkt x schneiden (oder<br />

überlappen). Für den in Lemma 8.5 definierten Kreis C(x) gilt dann<br />

P ∩ C(x) = {pi, pj}, da x auf der Voronoi-Kante zu den Regionen VR(pi)<br />

und VR(pj) liegt. Andererseits gilt aber auch P ∩ C(x) = {pk, pl}, da x<br />

auch auf der Voronoi-Kante zu den Regionen VR(pk) und VR(pl) liegt.<br />

Somit müssen die beiden Segmente identisch sein, was aber – nach obiger<br />

Anmerkung – unmöglich ist. ✷<br />

Bemerkung 8.12 Aus obigen Definitionen und Überlegungen folgt, daß


8.2 Der Delaunay-Graph 95<br />

• jeder Voronoi-Region eine Ecke in DG(P),<br />

• jeder Voronoi-Kante eine Kante in DG(P),<br />

• jedem Voronoi-Knoten eine Region in der zu DG(P) gehörenden<br />

Delaunay-Zerlegung<br />

entspricht. Das Voronoi-Diagramm VD(P) und der Delaunay-<br />

Graph DG(P) sind somit zueinander dual und lassen sich auch in<br />

linearer Zeit ineinander überführen.<br />

VD(P) und DG(P) sind<br />

zueinander dual<br />

Insbesondere hat auch jede beschränkte Region in DG(P) genau so viele<br />

Kanten, wie bei ihrem zugehörigen Knoten in VD(P) zusammenlaufen.<br />

Besitzt also jeder Voronoi-Knoten genau den Grad 3 (d. h. jeder<br />

Kreis C(x) enthält höchstens drei Punkte aus P), dann sind alle beschränkten<br />

Regionen von DG(P) Dreiecke und wir erhalten einen maximalen<br />

PSLG. Aus diesem Grund nennt man DG(P) bzw. die zugehörige<br />

Delaunay-Zerlegung auch eine Delaunay-Triangulation der Punktmen- Delaunay-Triangulation<br />

ge P, selbst wenn der Rand der unbeschränkten Region kein Dreieck ist<br />

oder obige Bedingung nicht erfüllt ist.<br />

Im letzten Fall kann es sich dann bei den übrigen beschränkten Regionen<br />

nur um konvexe Polygone handeln, deren Ecken alle auf dem Kreis C(x)<br />

um den entsprechenden Voronoi-Knoten x liegen, und die sich leicht<br />

„nachtriangulieren“ lassen. Mit Ausnahme dieses Spezialfalls von mehr<br />

als drei kozirkular liegenden Punkten ist die Delaunay-Triangulation somit<br />

eindeutig bestimmt. ⊳<br />

Die Delaunay-Kanten und die Dreiecke in der Delaunay-Zerlegung können<br />

wir noch etwas genauer charakterisieren:<br />

Lemma 8.13 Für eine Punktmenge P und ihre zugehörige Delaunay-Triangulation<br />

DG(P) gilt:<br />

• Zwei Punkte pi, pj ∈ P sind genau dann durch eine Delaunay-<br />

Kante miteinander verbunden, wenn es einen Kreis gibt, der nur pi<br />

und pj auf seinen Rand enthält und keinen Punkt aus P in seinem<br />

Innern.<br />

• Drei nicht-kollineare Punkte pi, pj, pk ∈ P induzieren genau dann<br />

ein Dreieck der Delaunay-Triangulation, wenn der Umkreis des<br />

Dreiecks (d. h. der eindeutig bestimmte Kreis durch pi, pj und pk<br />

keinen weiteren Punkte aus P auf seinem Rand oder in seinem Innern<br />

enthält.<br />

Beweis: Nach Definition 8.10 sind zwei Punkte pi, pj ∈ P genau<br />

dann durch eine Delaunay-Kante miteinander verbunden, wenn es eine<br />

Voronoi-Kante auf dem Bisektor B(pi, pj) gibt. Dies ist nach Lemma 8.5<br />

gleichbedeutend damit, daß es einen Punkt x auf dieser Voronoi-Kante<br />

gibt mit P ∩ C(x) = {pi, pj}.<br />

Die zweite Behauptung zeigt man analog. ✷


96 Nachbarschaftsprobleme<br />

beliebige Triangulation<br />

Delaunay-Triangulation<br />

☞ WWW<br />

Mit Hilfe dieser Aussage erhalten wir sofort eine alternative Charakterisierung<br />

einer Delaunay-Triangulation:<br />

Satz 8.14 Sei P ⊂ E 2 eine endliche Punktmenge in der Ebene und T<br />

eine Triangulation von P. Dann ist T eine Delaunay-Triangulation von P,<br />

genau dann wenn der Umkreis einer jeden Dreiecksregion von T keinen<br />

Punkt von P in seinem Innern enthält.<br />

Die Delaunay-Triangulation besitzt noch viele weitere interessante Ei-<br />

genschaften, unter anderem eine, die z. B. bei der Erzeugung von Oberflächennetzen<br />

(engl. mesh generation) eine wichtige Rolle spielt: Hier<br />

kommt es nämlich darauf an, daß für eine gegebene Punktmenge nicht<br />

irgendeine Triangulation verwendet wird, sondern eine, die hinsichtlich<br />

bestimmter Kriterien, die von der Anwendung vorgegeben werden, optimal<br />

ist. Ein solches Kriterium ist beispielsweise, daß die erzeugten<br />

Dreiecke in der Triangulation möglichst keine spitzen Winkel aufweisen<br />

sollen. Diesbezüglich ist die Delaunay-Triangulation im gewissen Sinn<br />

optimal, wie der folgende Satz zeigt. Ein Beweis findet sich z. B. in [14,<br />

S. 236].<br />

Satz 8.15 Sei P eine Menge von Punkten in der Ebene, die nicht alle auf<br />

einer Geraden liegen und von denen keine vier auf einem gemeinsamen<br />

Kreisrand liegen. Dann haben die Dreiecke der Delaunay-Triangulation<br />

DG(P) unter allen Triangulationen von P den größten minimalen Innenwinkel,<br />

d. h.<br />

min{ α � � α ist Innenwinkel eines Dreiecks von DG(P) }<br />

=<br />

max<br />

Triangulation T von P min{ α � � α ist Innenwinkel eines Dreiecks von T } .<br />

Zum interaktiven Experimentieren mit Voronoi-Diagrammen und Delaunay-Triangulationen<br />

kann das Java-Applet »VoroGlide« der FernUniversität<br />

Hagen verwendet werden (�������������������������������<br />

���������������).<br />

8.3 Verallgemeinerungen<br />

Neben dem Voronoi-Diagramm für Punkte in der euklidischen Ebene<br />

gibt es eine Vielzahl von Möglichkeiten, den Nachbarschaftsbegriff zu<br />

verallgemeinern, siehe z. B. [1]. Einige sollen im folgenden exemplarisch<br />

genannt werden:<br />

Allgemeinere Abstandsbegriffe für Punkte In Bemerkung 8.2 haben<br />

wir schon am Beispiel der Manhattan- und der Maximum-Metrik<br />

gesehen, daß sich die Definition des Bisektors auch auf andere Metriken<br />

als der euklidischen Metrik übertragen läßt, beispielsweise<br />

auf die Familie der Minkowski-Metriken Lp(x, y) mit p = 1, . . . , ∞


8.3 Verallgemeinerungen 97<br />

(siehe deren Definition auf auf Seite 6). Die Funktionen Lp gehören<br />

hierbei zu einer Menge spezieller durch Normen induzierter Metriken,<br />

die in der <strong>Algorithmische</strong>n <strong>Geometrie</strong> auch als symmetrische<br />

konvexe Distanzfunktionen bezeichnet werden.<br />

Die meisten strukturellen Eigenschaften des Voronoi-Diagramms<br />

lassen sich hierbei auf diese Klasse von Distanzfunktionen übertragen,<br />

mit dem Hauptunterschied, daß die Bisektoren gekrümmt<br />

sind.<br />

Weitere Informationen und zwei Java-Applets zum Experimentieren<br />

finden sich auf der Seite der FernUniversität Hagen über<br />

(nicht notwendigerweise symmetrische) konvexe Distanzfunktionen<br />

(��������������������������������������������������<br />

������������������������������ ). WWW☞<br />

Allgemeinere Objekte Wir haben uns bisher auf die einfachste Menge<br />

P ⊂ E 2 von Objekten eingeschränkt, die denkbar ist – auf Punkte.<br />

Wenn man die Abstandsfunktion d(p, x), die den Einfluß des<br />

Objekts p auf den Punkt x ∈ E 2 beschreibt, geeignet wählt, kann<br />

man aber auch kompliziertere Objekte zulassen, beispielsweise Liniensegmente.<br />

Hierzu definieren wir für ein Segment l dessen Abstand<br />

zu einem Punkt x.<br />

d(l, x) := min |x y|<br />

y∈l<br />

Die Bisektoren zwischen zwei Liniensegmenten, die wir auf diese<br />

Weise erhalten, sind wieder gekrümmt und bestehen i. allg. aus<br />

Halbstrahlen, Liniensegmenten und Parabelstücken.<br />

Voronoi-Diagramme höherer Ordnung Das klassische Voronoi-Diagramm<br />

VD(P) unterteilt die Ebene so in Regionen, daß alle Punkte<br />

einer Region denselben nächsten Nachbarn in der Menge P besitzen.<br />

Zerlegt man dagegen für eine Zahl k zwischen 1 und n − 1 die<br />

Ebene so in Regionen, daß alle Punkte aus einer Region dieselben k<br />

nächsten Nachbarn besitzen, erhält man das sog. Voronoi-Diagramm<br />

der Ordnung k, i. Z. VDk(P). Dabei ist VD1(P) gerade das klassische<br />

Voronoi-Diagramm und VDn−1(P) ist die Unterteilung in<br />

Gebiete gleicher entferntester Nachbarn.<br />

Höherdimensionale Räume Eine Verallgemeinerung des Voronoi-Diagramms<br />

in Räume höherer Dimension liegt nahe und ist auch<br />

möglich, allerdings gehen hierbei viele der oben gezeigten Eigenschaften<br />

verloren. So besteht z. B. das Voronoi-Diagramm im dreidimensionalen<br />

euklidischen Raum zwar immer noch aus konvexen<br />

Regionen, seine Größe ist aber nicht mehr linear in der Zahl<br />

der Punkte, sondern quadratisch.<br />

Voronoi-Diagramm der<br />

Ordnung 2


98 Nachbarschaftsprobleme<br />

Bisektor von L und R<br />

8.4 Konstruktion des Voronoi-Diagramms<br />

Wir wollen im folgenden zwei Verfahren mit jeweils optimaler Laufzeit<br />

Θ(n log) zur Berechnung des Voronoi-Diagramms einer Punktmenge<br />

in der euklidischen Ebene beschreiben – einen Divide-and-conquer-<br />

Ansatz ähnlich dem Verfahren zur Konstruktion der konvexen Hülle aus<br />

Abschnitt 6.5 sowie ein Sweep-line-Verfahren. Die Algorithmen sollen<br />

dabei nur skizziert werden. Weiterführende Informationen finden sich<br />

zum Divide-and-conquer-Algorithmus in [14, S. 295] und zur Sweepline-Methode<br />

in [5, S. 149] und [14, S. 286].<br />

Aufgrund der Dualität von Voronoi-Diagramm und Delaunay-Triangulation<br />

kann natürlich mit allen Verfahren auch die Delaunay-Triangulation<br />

einer Punktmenge bestimmt werden. Da der lineare Überführungsaufwand<br />

(siehe Bemerkung 8.12 auf Seite 94) geringer ist als die untere<br />

Laufzeitschranke für die Konstruktion des Voronoi-Diagramms (siehe<br />

Korollar 8.9 auf Seite 94) ist Ω(n log n) auch eine untere Schranke für die<br />

Konstruktion der Delaunay-Triangulation und jedes Verfahren, welches<br />

die eine Struktur berechnet, kann zu einem Verfahren erweitert werden,<br />

welches die andere Struktur mit demselben Zeitbedarf bestimmt.<br />

8.4.1 Divide-and-conquer-Verfahren<br />

Die Grundidee des Divide-and-conquer-Verfahrens zur Bestimmung<br />

des Voronoi-Diagramms ist ganz ähnlich wie bei der Konstruktion der<br />

konvexen Hülle: Wie in Bemerkung 6.13 auf Seite 76 beschrieben, teilen<br />

wir mit linearem Zeitbedarf die Punktmenge P in zwei etwa gleich<br />

große Mengen L und R, deren konvexe Hüllen disjunkt sind – beispielsweise<br />

mittels des Medians der x-Koordinaten.<br />

Die Voronoi-Diagramme der beiden Mengen werden dann rekursiv<br />

bestimmt und müssen nun noch zu einem gemeinsamen Voronoi-Diagramm<br />

für die ursprüngliche Menge verschmolzen werden (siehe Abbildung<br />

8.3 auf der gegenüberliegenden Seite). Hierzu betrachten wir die<br />

Kanten im Voronoi-Diagramm VD(P) der Ursprungsmenge P. Offenbar<br />

gibt es zwei Arten von Voronoi-Kanten:<br />

1. Kanten, die zwischen Voronoi-Regionen von Punkten aus derselben<br />

Teilmenge L oder R von P verlaufen. Solche Kanten sind schon<br />

in den Voronoi-Diagrammen VD(L) und VD(R) enthalten, sind<br />

dort aber ggf. länger.<br />

2. Kanten, die zwischen einer L-Region und einer R-Region verlaufen.<br />

Zusammen bilden diese Kanten die Menge<br />

B(L, R) := { x ∈ E 2 � � min<br />

p∈L<br />

|p x| = min |q x| }<br />

q∈R<br />

aller Punkte, die einen nächsten Nachbarn in L und einen in R besitzen,<br />

genannt den Bisektor von L und R.


8.4 Konstruktion des Voronoi-Diagramms 99<br />

Man kann nun zeigen, daß der Bisektor B(L, R) immer eine (unbeschränkte)<br />

polygonale Kette ist, die zudem monoton bez. der Separationsgeraden<br />

der beiden Mengen L und R ist. 1 Das Voronoi-Diagramm<br />

VD(P) kann man dann konstruieren, indem man die beiden Teil-<br />

Diagramme VD(L) und VD(R) längs des Bisektors B(L, R) aufschneidet<br />

und den linken Teil von VD(L) mit B(L, R) und mit dem rechten Teil<br />

von VD(R) verbindet (siehe Abbildung 8.3). Das Hauptproblem ist also,<br />

den Bisektor B(L, R) der beiden Mengen L und R zu bestimmen, denn<br />

das Verschmelzen der beiden Voronoi-Diagramme ist (bei gegebenem<br />

Bisektor) mit linearem Zeitbedarf möglich bzw. kann sogar schon bei<br />

dessen Konstruktion ausgeführt werden.<br />

Um den Bisektor zu ermitteln, sucht man zunächst eines seiner beiden<br />

unbeschränkten Teilstücke. Diese werden aber durch genau diejenigen<br />

Punkte aus L und R induziert, die auch die in Bemerkung 6.13 eingeführten<br />

oberen und unteren Tangenten (an die konvexen Hüllen) bestimmen,<br />

und können somit in linearer (bzw. mittels binärer Suche sogar in logarithmischer)<br />

Zeit ermittelt werden.<br />

Nachdem wir eines der unbeschränkten Stücke des Bisektors gefunden<br />

haben (o. B. d. A. sei dies das zur unteren Tangente durch die beiden<br />

Punkte li ∈ L und rj ∈ R gehörende Stück), arbeiten wir uns in beiden<br />

Voronoi-Diagrammen VD(L) und VD(R) gleichzeitig von unten nach<br />

oben vor. Wir starten jeweils in den beiden Regionen VR(li) und VR(rj),<br />

die das unbeschränkte Bisektorstück induzieren, und prüfen dann, ob<br />

der Bisektor B(li, rj) als nächstes eine Nachbarregion VR(lk) von VR(li)<br />

oder eine Nachbarregion VR(rl) von VR(rj) erreicht. Dies können wir<br />

durch einen geeigneten Durchlauf der Kanten von VR(li) und VR(rj)<br />

erreichen. Die so ermittelte Region VR(lk) bzw. VR(rl), welche vom<br />

1 Monoton bedeutet hier, daß jede zur Separationsgeraden senkrecht stehende Gerade<br />

die Kette B(L, R) maximal einmal schneidet.<br />

Abbildung 8.3<br />

Verschmelzen der beiden<br />

Voronoi-Diagramme


100 Nachbarschaftsprobleme<br />

Abbildung 8.4<br />

Bei einem neuen Punkt<br />

ändert sich das Voronoi-<br />

Diagramm auch links der<br />

Sweep line<br />

Zeitbedarf von Θ(n log n)<br />

für Divide-and-conquer-<br />

Verfahren<br />

Bisektor als nächstes betreten wird, übernimmt dann die Rolle der Region<br />

VR(li) bzw. VR(rj), die der Bisektor verläßt.<br />

Auf diese Weise hangeln wir uns von unten nach oben durch die beiden<br />

Teil-Diagramme, bis wir bei denjenigen Punkten angelangt sind, die die<br />

obere Tangente der konvexen Hülle bestimmen. Eine sorgfältige Implementation<br />

und Analyse garantieren dabei, daß jede Voronoi-Kante der<br />

beiden Teil-Diagramme nur höchstens einmal besucht wird. Somit kann<br />

der Bisektor B(L, R) in linearer Zeit bestimmt werden.<br />

Für die Gesamtlaufzeit des Algorithus erhalten wir dann wieder dieselbe<br />

Rekursionsgleichung wie bei der Konstruktion der konvexen Hülle<br />

in Abschnitt 6.5 und somit den folgenden Satz:<br />

Satz 8.16 Für eine Menge von n Punkten p1, . . . , pn ∈ E 2 kann deren<br />

Voronoi-Diagramm mittels des Divide-and-conquer-Verfahrens bei<br />

linearem Speicherbedarf mit einem optimalen Zeitbedarf von Θ(n log n)<br />

bestimmt werden.<br />

8.4.2 Sweep-line-Verfahren<br />

Die Grundidee bei diesem Verfahren ist natürlich wieder – wie bei allen<br />

Sweep-line-Verfahren – eine senkrechte Linie von links nach rechts über<br />

die Punkte aus P gleiten zu lassen und sich in der Vertikalstruktur den<br />

Schnitt der Sweep line mit dem aktuellen Voronoi-Diagramm zu merken.<br />

Jeder neu entdeckte Punkt würde dann ein Einfügeereignis und<br />

jeder Schnitt zweier auf der Sweep line benachbarter Voronoi-Kanten<br />

ein Schnittereignis (und ggf. ein Löschereignis) bewirken.<br />

Problem bei der Das Problem hierbei ist allerdings, daß sich zum einen bei einem Ein-<br />

Sweep-line-Methode fügeereignis – also beim Entdecken eines neuen Punktes – das Voronoi-<br />

Diagramm auch links der Sweep line ändert (siehe Abbildung 8.4), und<br />

zum anderen überhaupt nicht klar ist, wann für solche verspätet hinzugekommenen<br />

Voronoi-Kanten (links der Sweep line) das zugehörige<br />

Schnittereignis abgearbeitet werden soll – zu dem Zeitpunkt, an dem<br />

die Sweep line den Schnittpunkt passiert, ist dieser ja noch gar nicht bekannt.


8.4 Konstruktion des Voronoi-Diagramms 101<br />

Aus diesem Grund wenden wir das Sweep-Paradigma in leicht abgewandelter<br />

Form auf unser Problem an: Anstatt uns in der Vertikalstruktur<br />

die Schnittmenge des aktuellen Voronoi-Diagramms mit der Sweep<br />

line zu merken, verwalten wir besser gleich nur denjenigen Teil des<br />

Voronoi-Diagramms links der Sweep line, der sich garantiert nicht mehr<br />

ändern kann, d. h. der von Punkten rechts der Sweep line unbeeinflußt<br />

bleibt.<br />

Der Teil des Voronoi-Diagramms, welcher sich nicht mehr ändern kann,<br />

besteht offenbar aus allen Punkten der Ebene, deren Abstand zu irgendeinem<br />

der Punkte pi ∈ P links der Sweep line geringer ist als ihr Abstand<br />

zur Sweep line selbst. Da der Bisektor eines Punktes und einer<br />

Geraden eine Parabel ist, besteht die Grenze dieses Bereichs – die sog.<br />

Wellenfront oder Küstenline (engl. beach line) – also aus einer Menge von<br />

Parabelstücken. Für die Wellenfront kann man nun zeigen, daß sie zum<br />

einen wegzusammenhängend und zum anderen y-monoton ist, d. h. jede<br />

horizontale Linie schneidet sie nur in höchstens einem Punkt. Nur<br />

diese Wellenfront sollten wir in der Vertikalstruktur verwalten. Wellenfront<br />

Die Punkte, in denen zwei benachbarte Parabelstücke der Wellenfront<br />

zusammenstoßen, liegen genau auf den Voronoi-Kanten von VD(P).<br />

Wenn nun die Sweep line nach rechts wandert, ändert sich die Wellenfront<br />

kontinuierlich und es können zwei Ereignisse auftreten, welche die<br />

Struktur der Wellenfront beeinflussen:<br />

1. Ein Parabelstück der Wellenfront verschwindet, d. h. die Endpunkte<br />

der beiden Nachbarstücke stoßen zusammen. Dies bedeutet,<br />

daß wir an der Stelle, an der die Endpunkte zusammengestoßen<br />

sind, einen Voronoi-Knoten entdeckt haben, der sich im weiteren<br />

Verlauf nicht mehr ändert und den wir zu VD(P) hinzunehmen<br />

können. Das entsprechende Parabelstück können wir aus der<br />

Vertikalstruktur entfernen.<br />

2. Ein neues Parabelstück erscheint. Dies passiert genau dann, wenn<br />

die Sweep line einen neuen Punkt pi ∈ P passiert. In einem solchen<br />

Fall muß die Vertikalstruktur (also die Folge der Parabelstücke)<br />

entsprechend aktualisiert werden.<br />

Dies ist die Grundidee des Sweep-line-Algorithmus. Die Feinheiten<br />

wie z. B. eine sinnvolle Verwaltung der Vertikalstruktur, die Berechnung<br />

der Ereigniskoordinaten usw. finden sich beispielsweise in [5, S. 149]<br />

und [14, S. 286].<br />

Zusammenfassend erhalten wir dann folgenden Satz:<br />

Satz 8.17 Für eine Menge von n Punkten p1, . . . , pn ∈ E 2 kann deren<br />

Voronoi-Diagramm mittels der Sweep-line-Methode bei linearem<br />

Speicherbedarf mit einem optimalen Zeitbedarf von Θ(n log n) bestimmt<br />

werden.<br />

Zeitbedarf von Θ(n log n)<br />

für Sweep-line-Methode


102


Abkürzungen<br />

A<br />

Abkürzungen und Symbole<br />

CAD engl. computer aided design<br />

CAM engl. computer aided manufacturing<br />

DCEL engl. doubly connected edge list (s. S. 63)<br />

FTS Fahrerloses Transportsystem<br />

GIS Geographisches Informationssystem<br />

NP alle von einem nichtdeterministischen Algorithmus in polynomieller Zeit lösbaren<br />

Probleme (s. S. 18)<br />

O. B. d. A. Ohne Beschränkung der Allgemeinheit<br />

P alle von einem deterministischen Algorithmus in polynomieller Zeit lösbaren Probleme<br />

(s. S. 18)<br />

PSLG engl. planar straight line graph (s. S. 62)<br />

PSPACE alle von einem deterministischen Algorithmus mit polynomiellem Speicherbedarf<br />

lösbaren Probleme (s. S. 18)<br />

Symbole<br />

A die abgeschlossene Hülle der Menge A (s. S. 6)<br />

∀ der Allquantor<br />

a �z b die angulare Ordnung der Punkte a und b bez. des Strahls [0 z} (s. S. 29)<br />

a � b die angulare Ordnung der Punkte a und b bez. der positiven x-Achse (s. S. 30)<br />

B(p, q) der Bisektor der Punkte p und q (s. S. 90)<br />

B + (v) das von der Ecke v ausgehende Pfeilbüschel (s. S. 11)<br />

B − (v) das in die Ecke v mündende Pfeilbüschel (s. S. 11)<br />

ccw(p, q, r) die Counter-clockwise-Funktion der drei Vektoren p, q, r (s. S. 27)<br />

U ε(x) die ε-Umgebung von x (s. S. 6)<br />

U R ε (x) die ε-Umgebung von x in R (s. S. 8)<br />

|x y| der euklidische Abstand der Punkte x und y im E d (s. S. 5)<br />

E d der d-dimensionale euklidische Raum (s. S. 5)<br />

∃ der Existenzquantor<br />

p q die Gerade durch die Punkte p und q (s. S. 23)


104 Abkürzungen und Symbole<br />

g(v) der Grad der Ecke v (s. S. 11)<br />

g + (v) der Außengrad der Ecke v (s. S. 11)<br />

g − (v) der Innengrad der Ecke v (s. S. 11)<br />

O(g) alle Funktionen höchstens von der Größenordnung von g (s. S. 16)<br />

Ω(g) alle Funktionen mindestens von der Größenordnung von g (s. S. 16)<br />

Θ(g) alle Funktionen genau von der Größenordnung von g (s. S. 16)<br />

o(g) alle Funktionen von geringerer Größenordnung als g (s. S. 16)<br />

H + (n, a) die positive Halbebene zu einer Geraden g(n, a) (s. S. 24)<br />

H− (n, a) die negative Halbebene zu einer Geraden g(n, a) (s. S. 24)<br />

A ◦<br />

[a, b]<br />

das Innere oder der offene Kern der Menge A<br />

das geschlossene Intervall { x ∈ R<br />

(s. S. 6)<br />

� � a ≤ x ≤ b }<br />

[a, b) das halboffene Intervall { x ∈ R � � a ≤ x < b }, analog auch (a, b]<br />

(a, b) das offene Intervall { x ∈ R � � a < x < b }<br />

|A| die Kardinalität der Menge A<br />

ker(P) der Kern des Polygons P (s. S. 40)<br />

α(si, si+1) Knickwinkel zweier aufeinanderfolgender Segmente einer polygonalen Kette<br />

(s. S. 34)<br />

CH(A) die konvexe Hülle der Menge A (s. S. 34)<br />

|x| die (euklidische) Länge des Vektors x ∈ E d<br />

tA(n) die Worst-case-Laufzeit von Algorithmus A (s. S. 18)<br />

∅ die leere Menge<br />

Lp(x, y) die Minkowski-Metrik für 1 ≤ p ≤ ∞ (s. S. 6)<br />

N(v) die Nachfolgermenge der Ecke v (s. S. 11)<br />

N die Menge der natürlichen Zahlen, N := {0, 1, 2, . . . }<br />

¬ das logische »nicht«<br />

g(n, a) die Normalenform einer Geraden g (s. S. 23)<br />

G ⊒ G ′ Graph G ist ein Obergraph von G ′ (s. S. 12)<br />

∨ das logische »oder«<br />

GR ′ der durch R ′ induzierte Partialgraph (s. S. 12)<br />

∂A der Rand der Menge A (s. S. 6)<br />

Π1 �τ Π2 Problem Π1 ist auf Π2 τ-reduzierbar (s. S. 19)<br />

R die Menge der reellen Zahlen<br />

vis(p) das Sichtbarkeitspolygon von p (s. S. 39)<br />

sgn(x) das Vorzeichen (lat. signum) von x, sgn(x) ∈ {−1, 0, 1}<br />

〈x, y〉 das kanonische Skalarprodukt der beiden Vektoren x und y im R d (s. S. 6)<br />

sA(n) der Worst-case-Speicherbedarf von Algorithmus A (s. S. 18)<br />

[p q} der Strahl von p aus in Richtung q, analog auch {p q] (s. S. 23)<br />

[p q] die Strecke zwischen den Punkten p und q (s. S. 23)<br />

G[V ′ ] der durch V ′ induzierte Subgraph (s. S. 12)<br />

G ′ ⊑ G Graph G ′ ist ein Teilgraph von G (s. S. 12)<br />

∧ das logische »und«<br />

a × b das Vektorprodukt zweier Vektoren a und b (s. S. 26)


V(v) die Vorgängermenge der Ecke v (s. S. 11)<br />

�w eine Parametrisierung eines Weges w (s. S. 8)<br />

105


106


Literaturverzeichnis<br />

[1] F. Aurenhammer, R. Klein. Voronoi Diagrams. Technischer Bericht TR 198, Department of<br />

Computer Science, FernUniversität Hagen, 1996.<br />

[2] J. L. Bentley, T. A. Ottmann. Algorithms for Reporting and Counting Geometric Intersections.<br />

IEEE Transactions on Computers, C-28:643–647, 1979.<br />

[3] B. Chazelle. Triangulating a Simple Polygon in Linear Time. Discrete and Computational Geometry,<br />

6:485–524, 1991.<br />

[4] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rives. Introduction to Algorithms.<br />

MIT Press, 6th edition, 1992.<br />

[5] Mark de Berg, Marc van Kreveld, Mark Overmars, Otfried Schwarzkopf. Computational Geometry:<br />

Algorithms and Applications. Springer, 1997.<br />

[6] D. P. Dobkin, R. J. Lipton. Multidimensional Searching Problems. SIAM Journal on Computing,<br />

5:181–186, 1976.<br />

[7] M. E. Dyer. Linear Time Algorithms for Two- and Three-Variable Linear Programs. SIAM<br />

Journal on Computing, 13:31–45, 1984.<br />

[8] Herbert Edelsbrunner. Algorithms in Combinatorial Geometry. Springer, Berlin Heidelberg, 1987.<br />

[9] Otto Forster. Analysis 2. Vieweg, Braunschweig, 5th edition, 1984.<br />

[10] Michael R. Garey, David S. Johnson. Computers and Intractability (A Guide to the Theory of NP-<br />

Completeness. W. H. Freeman and Company, 1979.<br />

[11] Klaus Jänich. Topologie. Springer, 5th edition, 1996.<br />

[12] Dieter Jungnickel. Graphen, Netzwerke und Algorithmen. BI Wissenschaftsverlag, 2nd edition,<br />

1990.<br />

[13] David G. Kirkpatrick. Optimal Search in Planar Subdivisions. SIAM Journal on Computing,<br />

12:28–35, Februar 1983.<br />

[14] Rolf Klein. <strong>Algorithmische</strong> <strong>Geometrie</strong>. Addison-Wesley, 1997.<br />

[15] Sven Oliver Krumke. Graphentheoretische Konzepte und Algorithmen. ������������������<br />

��������������������������������� , 1997. (Skript zur Vorlesung im Sommersemester 1997,<br />

Universität Würzburg).


108 Literaturverzeichnis<br />

[16] N. Megiddo. Linear-Time Algorithms for Linear Programming in R 3 and Related Problems.<br />

SIAM Journal on Computing, 12:759–776, 1983.<br />

[17] James R. Munkres. Topology: a first course. Prentice-Hall, 1975.<br />

[18] Hartmut Noltemeier. Graphentheorie: mit Algorithmen und Anwendungen. de Gruyter, Berlin,<br />

1975.<br />

[19] Joseph O’Rourke. Computational Geometry in C. Cambridge University Press, 2nd edition, 1998.<br />

[20] J. Pach, M. Sharir. On Vertical Visibility in Arrangements of Segments and the Queue Size in<br />

the Bentley-Ottmann Line Sweeping Algorithm. SIAM Journal on Computing, 20:460–470, 1991.<br />

[21] Christos H. Papadimitriou. Computational Complexity. Addison-Wesley, 1994.<br />

[22] Franco P. Preparata, Michael Ian Shamos. Computational Geometry: An Introduction. Springer,<br />

New–York, 2nd edition, 1985.<br />

[23] Boto von Querenburg. Mengentheoretische Topologie. Springer, 1979.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!