20.01.2015 Aufrufe

Streng konvexe Hüllen

Streng konvexe Hüllen

Streng konvexe Hüllen

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>Streng</strong> <strong>konvexe</strong> Hüllen<br />

Jörg Wegener<br />

30. Mai 2005<br />

Inhaltsverzeichnis<br />

1 Einführung 2<br />

1.1 Konvexe Hüllen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2<br />

1.2 ɛ-streng <strong>konvexe</strong> δ-Hüllen . . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />

2 Bausteine 4<br />

2.1 Arithmetisches Modell . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4<br />

2.2 Berechnen von Winkeln . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />

2.3 Geometrischer Abstand . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />

3 Der Algorithmus mit exakter Arithmetik 9<br />

4 Der robuste Algorithmus für die <strong>konvexe</strong> Hülle 13<br />

4.1 Extrahieren eines Spines . . . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />

4.2 Beweis des Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />

4.3 Entfernen von reflexen Winkeln . . . . . . . . . . . . . . . . . . . . . . . 17<br />

4.4 Zusammenfassung des Algorithmus . . . . . . . . . . . . . . . . . . . . . 18<br />

5 Schlußwort 19<br />

1


1 Einführung<br />

1.1 Konvexe Hüllen<br />

Definition 1. Eine <strong>konvexe</strong> Hülle einer Punktemenge S ist das kleinste <strong>konvexe</strong> Polygon,<br />

daß alle Punkte aus S enthält.<br />

Abbildung 1: Menge von Punkten und ihre <strong>konvexe</strong> Hülle<br />

Konvexe Hüllen sind häufig verwendete Bausteine in der algorithmischen Geometrie.<br />

Zum Beispiel tauchen sie bei Gesichtserkennung ([2]) oder NURBS ([5]) auf.<br />

Um eine <strong>konvexe</strong> Hülle zu berechnen. wird häufig der Graham Scan angeführt (siehe<br />

auch [3]):<br />

1. Wähle Punkt p mit minimaler y-Koordinate.<br />

2. Sortiere die übrigen Punkte in Relation zu ihrem Winkel zu p.<br />

3. Von p ausgehend, durchlaufe die Punkte in Sortierreihenfolge.<br />

4. Sei p i der aktuell betrachtete Punkt. Ist der Winkel zwischen den Strecken (p i−1 p i , p i p i +1)<br />

konkav, dann: Lösche p, p i−1 wird der aktuell betrachtete Punkt und wiederhole<br />

diesen Schritt. Ist der Winkel konvex, dann verbinde p i und p i+1 und wiederhole<br />

den Schritt, falls p i+1 ≠ p.<br />

Der Algorithmus fügt der <strong>konvexe</strong>n Hülle also immer einen Punkt hinzu, und löscht in<br />

einem Backtracking-Schritt die vorhergehenden solange, bis kein konkaver Winkel mehr<br />

vorhanden ist.<br />

Bei der Ausführung eines solchen Algorithmus am Computer treten aber Rechenungenauigkeiten<br />

auf, die dieser nicht berücksichtigt. So kann weder garantiert werden, daß<br />

2


die Ausgabe eine Hülle oder aber alle Winkel konvex sind. Außerdem könnte man ein<br />

Polygon benötigen, dessen Winkel ein bestimmtes Minimum an Konvexität besitzen, da<br />

der weiterverarbeitende Algorithmus wieder Ungenauigkeiten einführt oder aber nur auf<br />

<strong>konvexe</strong>n Polygonen operieren kann, die dann z.B. auch keinen 180 ◦ -Winkel enthalten<br />

dürfen (ein Beispiel dafür ist die Minkowski-Summe, [6]). Dieses Problem soll hier besprochen<br />

werden. Dabei wird ein Algorithmus vorgestellt, dessen Ausgabe in jedem Fall<br />

konvex ist bzw. eine gewünschte Konvexität erzeugt.<br />

1.2 ɛ-streng <strong>konvexe</strong> δ-Hüllen<br />

Im Genauen berechnet dieser Algorithmus eine ɛ-strenge <strong>konvexe</strong> δ-Hülle. Dies ist ein<br />

<strong>konvexe</strong>s Polygon, aus dem jeder Punkt um ɛ pertuerbiert werden kann, ohne daß die<br />

Konvexität verloren geht. Gleichzeitig liegt kein Punkt der zu Grunde liegenden Menge<br />

weiter als δ außerhalb der Hülle.<br />

Hier werden ein Algorithmus mit exakter Arithmetik vorgestellt, der in der Lage ist, eine<br />

ɛ-strenge <strong>konvexe</strong> O(ɛ)-Hülle in Zeit O(n log n) zu berechnen, und ein Algorithmus mit<br />

gerundeter Arithmetik, der eine ɛ-strenge O(ɛ + µ) ebenfalls in O(n log n) Zeit berechnet<br />

(wobei die rounding unit µ im folgenden Kapitel definiert wird).<br />

Definition 2. Ein Polygon P ist eine δ-Hülle einer Punktmenge S, wenn alle Vertices<br />

von P zu S gehören und wenn kein Punkt von S weiter als δ von dem von P begrenzten<br />

Gebiet entfernt ist.<br />

Ein Polygon P ist ɛ-schwach konvex (ɛ 0), wenn es eine Möglichkeit gibt, jeden Vertex<br />

um nicht mehr als ɛ zu perturbieren, so daß P konvex wird.<br />

Ein Polygon P ist ɛ-streng konvex (ɛ 0), falls P konvex ist und auch konvex bleibt,<br />

selbst wenn jeder Punkt von P um bis zu ɛ perturbiert wird.<br />

Definition 3. Seien A, B und C gegen den Uhrzeigersinn aufeinanderfolgende Punkte<br />

eines Polygons P . Der Vertex B ist ɛ-streng konvex, wenn der Abstand δ(B, CA) von B<br />

zu der Geraden CA größer als ɛ ist.<br />

Lemma 1.1. Wenn jeder Vertex eines Polygons P 2ɛ-streng konvex ist, dann ist P<br />

ɛ-streng konvex.<br />

D.h. wenn man jeden Vertex für sich um 2ɛ bewegen kann, lassen sich alle Vertices um<br />

ɛ bewegen. Die Umkehrung gilt i.A. nicht.<br />

Beweis: Angenommen, alle Punkte seien 2ɛ-streng konvex, aber P sei nicht ɛ-streng<br />

konvex. Dann müsste eine ɛ-Perturbation existieren, durch die manche Punkte B nicht<br />

mehr konvex sind. Seien A und C die zu B benachbarten Punkte. Es ist offensichtlich,<br />

daß alle Punkte des Dreiecks ABC 2ɛ-streng konvex sind hinsichtlich dieses Dreiecks.<br />

3


C<br />

ε<br />

B<br />

A<br />

Abbildung 2: ɛ-strenger Vertex<br />

Es muss also eine kleinere Perturbation geben, die ABC in ein degeneriertes Dreieck<br />

A ′ B ′ C ′ transformiert, in dem B ′ auf A ′ C ′ liegt. Die Punkte A ′ und C ′ befinden sich dann<br />

innerhalb ɛ von der Geraden AC. Also muss sich auch B ′ innerhalb von AC befinden. B<br />

ist nicht mehr als ɛ von B ′ entfernt, also muss sich B innerhalb von 2ɛ von AC befinden.<br />

Das ist ein Widerspruch dazu, daß B 2ɛ-streng konvex ist.<br />

2 Bausteine<br />

Bevor wir uns dem Algorithmus widmen können, müssen wir uns mehrere Dinge klar<br />

machen: Wie kann man mit gerundeter Arithmetik Winkel und Abstände berechnen und<br />

wie hoch sind dabei die Genauigkeit und die Kosten Beide Operationen werden bei der<br />

Berechnung von <strong>konvexe</strong>n Hüllen benötigt. Außerdem gibt es mehrere Möglichkeiten,<br />

die Eingabe darzustellen. Wir betrachten hier fixed point, single precision floating point<br />

und double precision floating point arithmetic. Da sich fixed point-Operationen mit<br />

floating point ausgeführt werden können, reicht es, wenn wir uns den beiden letzteren<br />

widmen. Da die genaue Darstellung von Zahlen auf verschiedenen Computersystemen<br />

unterschiedlich ist, abstrahieren wir hier:<br />

2.1 Arithmetisches Modell<br />

Fixed point-Darstellung ist im Prinzip nichts anderes, als Integer-Darstellung mit der<br />

Implikation, daß jede Zahl mit 2 P bei einem festen P multipliziert wird. Floating point<br />

hat einen explizit angegebenen Exponenten sowie eine Mantisse. Der Wert einer floating<br />

point-Zahl mit Mantisse m und Exponent e ist 2 e m.<br />

4


Im folgenden habe die fixed point- oder Integer-Darstellung B I Bit, die single precision<br />

floating point-Mantisse B S Bit und die double precision floating point-Mantisse B D Bit.<br />

In einem typischen PC liegt B I bei 16 oder 32, B S ist 21, und B D ist 53. Wir nehmen<br />

daher an, daß B S < 2B I und B D > 2B S , single precision ist also weniger als zweimal<br />

so groß wie ein Integer, aber double precision ist mindestens zweimal so groß wie single<br />

precision.<br />

Berechnungen mit single precision und B S Bit haben eine relative Fehlerschranke von<br />

2 −B S<br />

. Zum Beispiel ist<br />

|(a + BS b) − (a + b)| 2 −B S<br />

|a + b|,<br />

wobei a+ BS b die Summe von a und b berechnet mit single precision-Arithmetik darstellt.<br />

Für die übrigen drei Standardrechenoperationen gelten analoge Fehlerschranken. Diese<br />

Annahme reicht hier für alle floating point-Darstellungen aus.<br />

Für eine gegebene Menge S von Punkten in der Ebene sei der Durchmesser Delta von<br />

S der maximale Abstand eines Punktepaares aus S. Für geometrische Berechnungen in<br />

einer Menge von Punkten wird der absolute Fehler als ein Vielfachen der rounding unit<br />

µ = 2 −B S<br />

∆ angegeben. Dieses Vielfache ist unabhängig von der gewählten Präzision<br />

und Maßstab.<br />

2.2 Berechnen von Winkeln<br />

Im folgenden werden alle Winkel im Bogenmaß angegeben.<br />

Eine essentielle Berechnung beim Konstruieren von <strong>konvexe</strong>n Hüllen ist zu entscheiden,<br />

ob zwei Segmente AB und BC einen <strong>konvexe</strong>n oder kokaven Winkel bilden. Der robuste<br />

Algorithmus zur Berechnung der <strong>konvexe</strong>n Hülle benötigt etwas allgemeiner die Funktion,<br />

den Winkel zwischen zwei Liniensegmenten AB und CD zu berechnen. O.b.d.A.<br />

nehme man an, daß die beiden Segmente positive Steigung haben und ”<br />

nach rechts zeigen“:<br />

A x < B x , A y < B y , C x < D x und C y < D y . Sei θ(AB) als der Winkel zwischen<br />

AB und der x-Achse definiert, d.h. von der Strecke AB gegen den Uhrzeigersinn zur x-<br />

Achse. Sei θ(AB, CD) = θ CD −θ AB der Winkel zwischen den Strecken CD und AB. Die<br />

folgende Funktion exakter Arithmetik überprüft, ob θ(AB, CD) größer oder gleich 0 ist.<br />

PositiveAngleSign(AB, CD)<br />

if [(B x − A − x)(D y − C y ) − (B y − A y )(D x − C x ) 0]<br />

then return true<br />

else return false<br />

Um den Winkel θ(AB, CD) zu berechnen, müssen wir sowohl eine Quadratwurzel ziehen,<br />

als auch einen Arcussinus berechnen. Dies können wir vermeiden, indem wir die relative<br />

5


Änderung der Steigung berechnen:<br />

τ(AB, CD) =<br />

tan θ(CD) − tan θ(AB)<br />

|tan θ(CD)| + |tan θ(AB)|<br />

=<br />

D y − C y<br />

− B y − A y<br />

∣<br />

D x − C x<br />

∣ B x − A x<br />

∣ D y − C y ∣∣∣ ∣ +<br />

B y − A y ∣∣∣<br />

D x − C x<br />

∣B x − A x<br />

= (B x − A x )(D y − C y ) − (B y − A y )(D x − C x )<br />

|(B x − A x )(D y − C y )| + |(B y − A y )(D x − C x )|<br />

Unter der Annahme, daß alle Segmente positive Steigung haben, können wir die Betragsstriche<br />

weglassen. Wir können dir relative Änderung der Steigung mit Hilfe der<br />

dritten Formel berechnen, oder aber, falls wir Divisionen vermeiden möchten, mit Hilfe<br />

der folgenden Funktion entscheiden, ob die relative Änderung der Steigung größer als<br />

ein bestimmter Wert κ ist.<br />

ReleativeSlopeCompare(AB, CD, κ)<br />

if [(B x − A x )(D y − C y ) − (B y − A y )(D x − C x )<br />

> κ((B x − A x )(D y − C y ) + (B y − A y )(D x − C x ))]<br />

then return true<br />

else return false<br />

Exakte Konvexe-Hüllen-Algorithmen benutzen PositiveAngleSign, der hier vorgestellte<br />

robuste Algorithmus verwendet RelativeSlopeCompare. Es könnte so aussehen, daß<br />

RelativeSlopeCompare teurer in der Berechnung ist, tatsächlich kann man es aber so<br />

implementieren, daß es nur eine Addition und eine Multiplikation mehr benötigt. Außerdem<br />

können die tatsächlichen Kosten bei exakter Arithmetic höher sein, als es zuerst<br />

den Anschein hat, wie die folgenden Lemmata zeigen:<br />

Lemma 2.1. PositiveAngleSign kann mit double precision Additionen (oder Subtraktionen)<br />

und Multiplikationen exakt berechnet werden. Die folgene Tabelle zeigt die Schranken<br />

für die Anzahl benötigter Operationen für verschiedene Arten der Eingabe. Im Falle<br />

von fixed point-Eingaben können vier Additionen mit Integeroperationen gemacht werden.<br />

Eingabedarstellung Additionen Multiplikationen<br />

Fixed Point 5 2<br />

Single Precision Floating Point 7 8<br />

Double Precision Floating Point 71 72<br />

Beweis. Im Falle von fixed point-Eingaben können vier Subtraktionen mit fixed point-<br />

Arithmetik durchgeführt werden. Die verbleibenden zwei Multiplikationen und eine Subtraktion<br />

können mit double precision durchgeführt werden, ohne daß ein Rundungsfehler<br />

auftritt - vorrausgesetzt double precision kann das Quadrat eines Integers aufnehmen.<br />

6


Im Fall von single precision floating point-Inputs kann der Ausdruck auf acht Terme<br />

erweiter werden, die aus dem Produkt zweier single precision floating point-Zahlen bestehen.<br />

Jedes dieser Produkte kann mit double precision berechnet werden. Haben diese<br />

passende least significant bits, können diese ohne Rundungsfehler addiert werden. Sonst<br />

werden die Zahlen in der Reihenfolge kleinste bis größte addiert. Auf diese Weise hat<br />

das gerundete Ergebnis das gleiche Vorzeichen wie das exakte.<br />

Im Fall von double precision floating point-Input kann jede Eingabe als Summe aus drei<br />

single precision floating point-Zahlen dargestellt werden. Erweitern wie vorher liefert 72<br />

double precision-Terme, die wie vor addiert werden können.<br />

Lemma 2.2. RelativeSlopeComapre kann mit 6 single precision floating point-Additionen<br />

und 3 single precision floating point-Multiplikationen annähernd berechnet werden. Die<br />

absolute Genauigkeit ist (3 + 6κ) · 2 −B S<br />

. Insbesondere:<br />

• if RelativeSlopeCompare(AB, CD, κ) = true then τ(AB, CD) κ−(3+6κ)·2 −B S<br />

• if RelativeSlopeCompare(AB, CD, κ) = false then τ(AB, CD) κ + (3 + 6κ) ·<br />

2 −B S<br />

Die Fehlerschranke bei double precision beträgt analog (3 + 6κ) · 2 −B D<br />

.<br />

In der Praxis benutzen wir RelativeSlopeCompare nur für kleine Werte von κ (ca. 32 ·<br />

2 −B S<br />

). In diesem Fall können wir den Fehlerterm 6 · 2 −B S<br />

κ vernachlässigen. Aus diesem<br />

Grund wird die Fehlerschranke ab hier einfach 3 · 2− B S<br />

sein.<br />

Beweis. Ein relativer Fehler von 2 −B S<br />

in der Berechnung von B x − A x mündet in einen<br />

absoluten Fehler von 2 −B S<br />

(B x − A x )(D y − C y ) in der Berechnung des Ausdrucks<br />

(B x − A x )(D y − C y ) − (B y − A y )(D x − C x ).<br />

Ähnliche Schranken gelten für die anderen zwei Multiplikationen und drei der anderen<br />

Subtraktionen. Die Summe dieser Fehler ist beschränkt durch<br />

3 · 2 −B S<br />

((B x − A x )(D y − C y ) + (B y − A y )(D x − C x )).<br />

Die Auswertung der letzten Subtraktion ergibt einen absoluten Fehler, der beschränkt<br />

ist durch<br />

2 −B S<br />

|(B x − A x )(D y − C y ) − (B y − A y )(D x − C x )|.<br />

Dies entspricht einem relativen Fehler von bis zu 2 −B S<br />

bei der Berechnung des Winkels.<br />

Da dieser Fehler relativ ist, können wir ihn behandeln, als träte er auf der rechten Seite<br />

der Ungleichung auf. Mit ähnlicher Argumentation kann gezeigt werden, daß der absolute<br />

Fehler beim Berechnen des Ausdruck<br />

κ((B x − A x )(D y − C y ) + (B y − A y )(D x − C x ))<br />

7


durch<br />

5 · 2 −B S<br />

κ((B x − A x )(D y − C y ) + (B y − A y )(D x − C x )).<br />

Der Transfer des Fehler von der rechten zur linken Seite macht aus der 5 eine 6. Zusammen<br />

implizieren die Fehlerschranken das Lemma.<br />

Von nun an wird τ(AB, CD) behandelt, als wäre es θ(AB, CD), also der Winkel zwischen<br />

AB und CD. Aus zweierlei Gründen ist dies möglich: Zuerst ist τ(AB, CD) immer<br />

eine Überschätzung von θ(AB, CD), genauer ist<br />

τ(AB, CD) sin θ(AB, CD) θ(AB, CD)<br />

für alle positiv steigenden Liniensegmente, die nach rechts zeigen“. Für fast horizontale<br />

”<br />

oder vertikale AB und CD ist τ(AB, CD) wesentlich größer als θ(AB, CD). Dies bedeutet,<br />

daß ein absoluter Fehler von 3 · 2 −B S<br />

bei der Messung von τ einem viel kleineren<br />

Fehler bei der Messung von θ entspricht.<br />

Der zweite Grund besteht darin, daß für feste AB τ(AB, CD) eine monotone Funktion<br />

von θ(AB, CD) ist. Dies impliziert folgendes Lemma:<br />

Lemma 2.3. If τ(AB, BC), τ(AB, CD) < κ, then τ(AB, BD) < κ.<br />

Beweis. Dies folgt aus der Monotonie von τ und der Tatsache, daß<br />

min(θ(BC), θ(CD)) θ(BD) max(θ(BC), θ(CD)).<br />

2.3 Geometrischer Abstand<br />

Der vorzeichenbehaftete Abstand eines Punktes C zu einer Geraden AB kann mit der<br />

folgenden Formel berechnet werden:<br />

δ(C, AB) =<br />

AB × AC)<br />

|AB|<br />

= (B x − A x )(C y − A y ) + (B y − A y )(C x − A x )<br />

√<br />

(Bx − A x ) 2 + (B y − A y ) 2<br />

Die Abstandsfunktion hat positives Vorzeichen, wenn C links von AB liegt, wenn man<br />

von A auf B schaut.<br />

Die folgende Funktion entscheidet, ob (δ(C, AB) größer ist, als ein positiver Wert κ.<br />

Die Variante, die negatives κ behandelt, ist ähnlich und benötigt die selbe Anzahl von<br />

arithmetischen Operationen.<br />

8


DistanceCompare(AB, C, κ)<br />

if [(B x − A x )(C y − A y ) − (B y − A y )(C x − A x ) 0<br />

and<br />

((B x − A x )(C y − A y ) − (B y − A y )(C x − A x )) 2<br />

κ 2 ((B x − A x ) 2 + (B y − A y ) 2 )]<br />

then return true<br />

else return false<br />

DistanceCompare vermeidet Quadratwurzeln und Divisionen. Selbst für fixed point-<br />

Eingaben kostet es mehr, diese Funktion exakt zu berechnen, als approximate arithmetic<br />

zu benutzen.<br />

Lemma 2.4. DistanceCompare kann annähernd mit single precision floating point-<br />

Operationen berechnet werden. Die absolute Genauigkeit beträgt 3·2 −B S<br />

|AB|+6.5κ·2 −B S<br />

.<br />

Die Fehlerschranke bei double precision arithmetic ist 3 · 2 −B D<br />

|AB| + 6.5κ · 2 −B D<br />

.<br />

Teilweiser Beweis. Der Beweis dieses Lemmas ist ähnlich zu dem des Lemmas 2.2. Wie<br />

bei RelativeSlopeCompare werden wir diese Funktion nur für sehr kleine κ aufrufen.<br />

Daher werden wir die Fehlerschranke 3 · 2 −B D<br />

|AB| verwenden, welche wiederum durch<br />

3µ beschränkt ist, da |AB| ∆, der Durchmesser der Menge von Eingabepunkten.<br />

3 Der Algorithmus mit exakter Arithmetik<br />

Die ɛ-streng <strong>konvexe</strong> Hülle soll in zwei Phasen konstruiert werden: Zuerst wird eine<br />

einfache <strong>konvexe</strong> Hülle generiert (z.B. mittels Graham-Scan). Danach werden alle Winkel<br />

durch Entfernen oder Ändern einiger Punkte angepasst, so daß das Polygon schließlich<br />

ɛ-streng konvex ist. Lemma 1.1 zeigt uns, daß es reicht, jeden Vertex des Polygons 2ɛstreng<br />

zu machen.<br />

Im folgenden sind A,B und C drei aufeinanderfolgende Punkte. Ist also δ(B, AC) 2ɛ,<br />

dann ist B 2ɛ-streng konvex und braucht nicht geändert zu werden. Andere Punkte<br />

lassen sich entfernen, da H konvex ist und so B nur noch ”<br />

strenger“ werden kann. Mit<br />

Hilfe eines Prädikats IsStrong(V) werden daher alle 2ɛ-strengen Vertices als STRONG<br />

markiert.<br />

Was passiert nun, wenn IsStrong(B) false zurückliefert In diesem Fall ist B zu nah<br />

an der Strecke AC und ABC fast ein gestreckter Winkel. Die Strecken AB und BC<br />

werden jetzt durch zwei Strecken A ′ B und C ′ B ersetzt. Dabei sind A ′ und C ′ zwei<br />

Punkte auf dem Rand von H, so daß δ(A ′ , AB) 2ɛ und δ(C ′ , BC) 2ɛ. C ′ und A ′<br />

müssen nicht zwingend Vertices aus H sein. Dadurch wird ein Bereich der Dicke 2ɛ vom<br />

Polygon abgeschnitten. Wie man in Abbildung 3 sieht, kann dies auch das Abschneiden<br />

anderer Punkte aus H beinhalten. Diesen Vorgang bezeichnen wird mit Trimming. Nach<br />

9


dem Trimming sind alle Punkte von H nicht mehr als 2ɛ von dem getrimmten Polygon<br />

entfernt.<br />

C<br />

B<br />

A<br />

2ε<br />

C’<br />

A’<br />

2ε<br />

Abbildung 3: Trimming<br />

Diese einfache Methode des Trimmings bereitet aber einige Probleme:<br />

• Wie oben erwähnt, könnte es sein, daß A ′ oder C ′ keine Punkte des ursprünglichen<br />

Polygons sind.<br />

• Die Punkte des Polygons könnten zu nah oder zu weit weg von der Geraden AB<br />

sein, um als Annäherung zu A ′ zu fungieren.<br />

• Ein Trimming-Schritt könnte einen vorhergehenden wieder rückgängig machen.<br />

• Bei mehrfachem Trimmen könnte ein Bereich, der dicker als cɛ ist, abgeschnitten<br />

werden.<br />

Um diese Probleme zu umgehen, führen wir das Trimming in zwei Phasen durch: forward<br />

trimming und backward trimming.<br />

1. Forward Trimming<br />

Wir definieren die Funktion ForwardTrim(B), um einige Nachfolger des Punktes<br />

B (gegen den Uhrzeigersinn) zu entfernen. Diese Funktion wenden wir gegen den<br />

Uhrzeigersinn um das Polygon wandernd auf jeden Punkt an. Sei C der ursprüngliche<br />

Nachfolger von B in H, und sei C ′ der aktuelle Nachfolger von B, nachdem<br />

wir ein paar Vertices entfernt haben (siehe Bild 3). Die Funktion ForwardTrim(B)<br />

entfernt jeden Nachfolger von B aus dem Polygon bis einer der folgenden Events<br />

eintritt (die in dieser Reihenfolge getestet werden):<br />

a) IsStrong(B) ist true → B wird als STRONG markiert<br />

10


) IsStrong(C) ist true → B wird als FAILED markiert<br />

c) C ′ ist markiert (d.h. wir haben das komplette Polygon überprüft) → B wird<br />

als FAILED markiert<br />

d) δ(C ′ , BC) > 2ɛ → B wird als FTRIMMED markiert.<br />

C<br />

B<br />

< 2ε<br />

> 2ε<br />

< 2ε<br />

C’<br />

< 4ε<br />

Abbildung 4: Forward Trimming<br />

Lemma 3.1. Nach dem Forward Trimming ist kein Vertex aus H mehr als 4ɛ von<br />

dem getrimmten Polygon entfernt.<br />

Beweis. Abbildung 4 zeigt den Fall, bei dem das Trimmen bei C ′′ aufgrund Bedingung<br />

d) beendet wird. Da wir die Funktion ForwardTrim beim Vorgänger von C ′<br />

nicht angehalten haben, muss der Vorgänger weniger als 2ɛ von BC entfernt sein.<br />

Der Teil von H von B bis C ′ liegt innerhalb des schattierten Bereichs, der sich innerhalb<br />

von 4ɛ der Strecke BC ′ befindet. BC ′ wird aber nie entfernt. Daraus folgt,<br />

daß sich jeder Punkt des ursprünglichen Polygons innerhalb 4ɛ eines Segments des<br />

getrimmten Polygons befinden muss.<br />

2. Backward Trimming<br />

Die Funktion BackwardTrim(B) wird analog zu ForwardTrim definiert. Sie kann<br />

die Nachfolger von B (im Uhrzeigersinn), die FAILED oder FTRIMMED aber<br />

nicht STRONG (aufgrund der zweiten Abbruchsbedingung) markiert sind entfernen.<br />

Diese Funktion wenden wir wieder im Uhrzeigersinn auf jeden Punkt des<br />

11


getrimmten Polygons an, der als FTRIMMED markiert ist. Die dritte Abbruchsbedingung<br />

bezieht sich natürlich auf die in dieser Phase markierten Punkte, nicht<br />

auf die durch ForwardTrim markierten. Bei der Abbruchsbedingung d) wird der<br />

Vertex nicht als FTRIMMED sondern als STRONG markiert, da er, wir vorher<br />

überlegt, dann 2ɛ-streng sein muss (siehe Abb. 3).<br />

Die einzelnen Bedingungen sind also:<br />

a) IsStrong(B) ist true → B wird als STRONG markiert<br />

b) IsStrong(C) ist true → B wird als FAILED markiert<br />

c) C ′ ist markiert (d.h. wir haben das komplette Polygon überprüft) → B als<br />

FAILED markiert<br />

d) δ(C ′ , BC) > 2ɛ → B wird als STRONG markiert.<br />

Bei der Abbruchsbedingung d) wird der Vertex nicht als FTRIMMED sondern als<br />

STRONG markiert, da er, wir vorher überlegt, dann 2ɛ-streng sein muss (siehe<br />

Abb. 3).<br />

Anschließend werden alle als FAILED markierten Vertices entfernt. Übrig bleiben<br />

nur als STRONG markierte Punkte.<br />

Lemma 3.1 impliziert, daß das erste getrimmte Polygon innerhalb von 4ɛ des zweiten<br />

getrimmten Polygons liegt, also alle Punkte aus H innerhalb von 8ɛ des zweiten<br />

getrimmten Polygons liegen.<br />

Lemma 3.2. Nach dem Forward und Backward Trimming gibt es keine Folge mit mehr<br />

als drei konsekutiven, als FAILED markierten Vertices. Daraus folgt, daß das Entfernen<br />

von als FAILED markierten Punkten höchsten 4ɛ zum Fehler addiert.<br />

Beweis. Nach dem Forward Trimming folgt jedem als FAILED markierten Vertex ein als<br />

STRONG markierter (zweite Abbruchsbedingung), außer es handelt sich um den letzten<br />

markierten Vertex (dritte Abbruchsbedingung), in welchem Fall im ein als FAILED<br />

markierter und danach ein als STRONG markierter Vertex folgt. Es gibt also höchstens<br />

zwei aufeinanderfolgende als FAILED markierte Vertices. Backward Trimming kann jedem<br />

als FAILED markierten Vertex höchstens einen weiteren als FAILED markierten<br />

Vertex hinzufügen (da wir vorher jedem FAILED Vertex ein STRONG Vertex folgt). Im<br />

schlimmsten Fall wird also eine Folge von drei als FAILED markierten Vertices aus den<br />

zwei aufeinanderfolgenden Vertices des Forward Trimmings erstellt.<br />

Wenn A, B und C aufeinanderfolgende Punkte sind und B als FAILED markiert ist,<br />

dann ist B nicht STRONG und liegt demnach innerhalb von 2ɛ von AC. Wenn B entfernt<br />

wird, wird das Polygon höchstens um 2ɛ vom ursprünglichen Polygon entfernt. Wenn zwei<br />

oder drei aufeinanderfolgende als FAILED markierte Vertices entfernt werden, addieren<br />

sich die Fehler, aber nicht auf mehr als 4ɛ. Für zwei Punkte ist dies offentsichtlich.<br />

12


Für drei Punkte entfernen wir erst den ersten und dritten (keine Überschneidung) und<br />

entfernen dann den zweiten.<br />

Jede Phase des Algorithmus entfernt das getrimmte Polygon um maximal 4ɛ von der<br />

ürsprünglichen <strong>konvexe</strong>n Hülle H. Der größte Abstand von H zum fertigen ɛ−strengen<br />

Polygon ist 12ɛ. Da alle Punkte aus S in H liegen, genügen auch diese jener Fehlerschranke.<br />

Dies beweist das folgende Theorem.<br />

Lemma 3.3 (Theorem). Sei eine <strong>konvexe</strong> Hülle (der größe h) einer Menge von Punkten<br />

S gegeben. Dann kann eine ɛ-strenge <strong>konvexe</strong> 12ɛ-Hülle in O(h) konstruiert werden.<br />

4 Der robuste Algorithmus für die <strong>konvexe</strong> Hülle<br />

Um den Algorithmus aus Kapitel 3 mit Hilfe von single (oder double) precision floating<br />

point arithmetic zu implementieren, benutzen wir Lemma 2.4. Da die Abstandsmessung<br />

zusätzlich einen Fehler von 3µ hinzufügt, wird im Algorithmus jedes 2ɛ durch 2ɛ + 3µ<br />

ersetzt. Der Algorithmus berechnet dann eine ɛ-strenge <strong>konvexe</strong> (12ɛ + 18µ)-Hülle (da<br />

jedesmal, wenn wir 2ɛ + 3µ entfernt wird, zusätzlich 3µ entfernt werden könnten).<br />

Nun fehlt uns zum Start noch eine <strong>konvexe</strong> Hülle, die wir aber mit gerundeter Arithmetik<br />

nicht berechnen können. Daher wird hier gezeigt, wie mit einer Abwandlung des Graham-<br />

Algorithmus eine <strong>konvexe</strong> 36µ-Hülle einer Menege S von n Punkten generiert wird, die<br />

dann als Basis für unseren Algorithmus dient. Mit dieser erhalten wir am Schluss dann<br />

eine ɛ-strenge <strong>konvexe</strong> (12ɛ + 54µ)-Hülle.<br />

Zuerst müssen wir vier monotone Sequenzen von Punkten aus S extrahieren, die mindestens<br />

alle Punkte aus der <strong>konvexe</strong>n Hülle beinhalten. In jeder Sequenz sind die x- und<br />

y-Koordianten der Punkte monotone Funktionen ihres Index, d.h. die Punkte finden sich<br />

von links nach rechts (oder rechts nach links) streng in aufsteigender (oder absteigender)<br />

Reihenfolge.<br />

Um eine Sequenz zu generieren, sortieren wir S aufsteigend nach der x-Koordinate und<br />

betrachten die Punkte in dieser Reihenfolge. Jedesmal, wenn wir einem Punkt begegnen,<br />

dessen y-Koordinate gleich oder kleiner als die größte y-Koordinate, die wir bislang gesehen<br />

haben, ist, schmeißen wir ihn raus. Wenn mehrere Punkte dieselbe x-Koordinate<br />

haben, schmeißen wir alle außer dem mit der höchsten y-Koordinate raus. In Abbildung<br />

5 ist der Punkt H der Anfangspunkt der Sequenz und H ∗ und H ∗∗ nachfolgende<br />

Elemente, wobei ∗ den Nachfolgeoperator darstellt. Um die anderen drei Sequenzen zu<br />

erstellen, lassen wir den Algorithmus auf derselben Menge S laufen, aber drehen jeweils<br />

die Vergleichsrichtung. Abbildung 5 illustriert die vier Sequenzen. Die aufsteigenden sind<br />

durchgehend und die absteigenden gepunktet gezeichnet.<br />

13


H**<br />

H*<br />

H<br />

Abbildung 5: Die 4 monotonen Sequenzen, die zusammen die <strong>konvexe</strong> Hülle beinhalten<br />

Nun haben wir zwar eine Hülle für die Punktemenge, diese ist aber nicht konvex. Sämtliche<br />

Punkte, deren Innenwinkel > 180 ◦ ist (diese Punkte nennen wir reflex) müssen nun<br />

noch ” überbrückt“ werden.<br />

4.1 Extrahieren eines Spines<br />

Wenn wir nun einfach hingehen, und alle reflexen Vertices aus der monotonen Sequenz<br />

entfernen, kann es passieren, daß wir einen Fehler von nµ hinzufügen, da auch nichtreflexe<br />

Punkte durch Rundungsfehler reflex erscheinen können. Die Lösung nennt sich<br />

Spine, dies ist eine Subsequenz mit der Eigenschaft, daß das Entfernen von reflexen<br />

Winkeln aus dieser einen Fehler von O(µ) gibt. Wir werden sehen, daß die vier erstellten<br />

Spines eine 30µ-Hülle bilden, bei der das Entfernen der restlichen reflexen Winkel nur<br />

noch 6µ zum Fehler hinzufügt.<br />

Eine Spine ist eine Sequenz von Kanten zweierlei Typs: Vertebrae (Wirbel) und Extender<br />

(Erweiterung). Diese Kanten genügen drei Bedingungen:<br />

1. Die erste Kante ist ein Vertebra, und jedem Vertebra folgt höchstens ein Extender.<br />

2. Jeder Vertebra ist mindestens um 18 · 2 −B S<br />

im Uhrzeigersinn rotiert bezogen auf<br />

den vorhergehenden Vertebra.<br />

3. Jeder Extender ist zwischen −6 · 2 −B S<br />

und 24 · 2 −B S<br />

im Uhrzeigersinn gedreht<br />

bezogen auf den vorhergehenden Vertebra, und ist höchstens um 6·2 −B S<br />

gegenüber<br />

dem nachfolgenden Vertebra rotiert.<br />

14


Abbildung 6 zeigt eine Spine. Die dunklen Kanten sind Vertebrae, die gepunkteten Extender.<br />

Offensichtlich bilden die Winkel der Vertebrae, so wie sie in Kapitel 2.2 definiert<br />

sind, eine aufsteigende Sequenz. Nur ein Extender kann mit einem benachbarten Vertebra<br />

einen reflexen Winkel bilden, dieser kann aber nicht allzu groß sein.<br />

L<br />

V E E*<br />

V 0<br />

8 . 2<br />

-P radians<br />

E**<br />

Abbildung 6: Polygonale Kurve aus Vertebrae und Extendern<br />

Ähnlich zum Graham-Algorithmus erstellen wir eine Spine von links nach rechts, indem<br />

wir Punkte aus einer monotonen Sequenz entfernen. Zu jedem Zeitpunkt der Berechnung<br />

haben wir eine teilweise konstruiertes Spine, dem noch unverarbeitete Kanten folgen. Sei<br />

VE der am weitesten rechts liegende Vertebra und EE ∗ sein nachfolgender Extender.<br />

Folgt kein Extender, dann gilt E = E ∗ . Sei E ∗ E ∗∗ die nächste unbearbeitete Kante.<br />

RelativeSlopeCompare(E ∗ E ∗∗ , VE, κ) ist true, wenn die Rotation im Uhrzeigersinn von<br />

E ∗ E ∗∗ in Bezug auf VE größer ist als κ, berechnet mit rounded arithmetic.<br />

A. Wenn RelativeSlopeCompare(E ∗ E ∗∗ , VE, 21 · 2 −B S<br />

) = true, dann mache E ∗ E ∗∗ zu<br />

einem Vertebra.<br />

B. Wenn nicht, dann vereinige E ∗ E ∗∗ mit dem Extender EE ∗ , d.h. entferne E ∗ , wenn<br />

E ∗ ≠ E, Vertex E ∗∗ ändert seinen Namen zu E ∗ .<br />

C. Wenn RelativeSlopeCompare(VE, EE ∗ , 3 · 2 −B S<br />

)= true (der eben erstellte Extender<br />

bildet einen reflexen Winkel mit dem Vertebra), entferne auch E. Die erstellte<br />

Kante VE ∗ wird zu der Liste unbearbeiteter Kanten hinzugefügt.<br />

4.2 Beweis des Algorithmus<br />

Der Beweis des Algorithmus gliedert sich in zwei Teile: Zuerst wird gezeigt, daß der<br />

Algorithmus den Bedingungen 1-3 genügt. Dann wird gezeigt, daß die generierte Spine<br />

eine 30µ-Hülle ist.<br />

15


Lemma 4.1. Jedesmal, wenn die Regeln A, B und C angewendet werden, genügt die<br />

teilweise konstruierte Spine den Bedingungen 1-3.<br />

Beweis. Das meiste dieses Beweises folgt unmittelbar aus der Tatsache, daß wir Winkel<br />

mit einer Genauigkeit von ±3 · 2 −B S<br />

messen können (Lemma 2.2). Der schwierigste Teil<br />

ist, zu zeigen, daß der neue Extender, der mit der Regel B erstellt wird, Regel 3 genügt.<br />

Die Bedingung 1 ist leicht zu sehen. Die Bedingung 2 ist eine Konsequenz der Regel A.<br />

Eine Kante wird nur zu einem neuen Vertebra, wenn seine berechnete Rotation in Bezug<br />

auf die vorhergehende um mindestens 21 · 2 −B S<br />

größer ist. Dies impliziert, daß der echte<br />

Winkel mindestens 18 · 2 −B S<br />

größer ist. Die 24 · 2 −B S<br />

-Schranke in Bedingung 3 ist eine<br />

Folge der Regel B. Eine Kante wird mit dem augenblicklichen Extender verschmolzen,<br />

wenn ihre Rotation weniger als 21 · 2 −B S<br />

erscheint. Die impliziert, daß der echte Winkel<br />

nicht mehr als 24·2 −B S<br />

beträgt. Wenn der Extender dieser Schranke vor der Vereinigung<br />

genügt, genügt er ihr auch hinterher.<br />

Die Regel C stellt sicher, daß die −6 · 2 −B S<br />

-Schranke in Bedingung 3 aufrecht erhalten<br />

wird. Wenn sie es nicht täte, dann wäre der berechnete Winkel des Extenders in Bezug<br />

auf den Vertebra mindestens −3 · 2 −B S<br />

, und Regel C würde ihn entfernen. Schließlich<br />

sichert Regel A die Einhaltung der 6 · 2 −B S<br />

-Schranke in Bedingung 3. Der berechnete<br />

Winkel des Extenders in Bezug auf den vorhergehenden Vertebra ist höchstens 21·2 −B S<br />

,<br />

und der Winkel des nachfolgenden Vertebra in Bezug auf den vorhergenden Vertebra ist<br />

mindestens 21 · 2 −B S<br />

. Diese beiden Berechnung können höchstens um 3 · 2 −B S<br />

-daneben<br />

liegen-, so daß der Gesamtfehler durch 6 · 2 −B S<br />

beschränkt ist.<br />

Lemma 4.2. Sei V 0 ein Vertex, der der linke Endpunkt eines Vertebra ist, und sei L<br />

die Strecke durch V 0 , die 6 · 2 −B S<br />

gegen den Uhrzeigersinn in Bezug auf den Vertebra<br />

gedreht ist. Jeder Punkt der Spine rechts von V 0 liegt rechts von L (Abbildung 6).<br />

Beweis. Die Bedingung 3 impliziert, daß der nachfolgende Extender im schlimmsten Fall<br />

parallel zu L sein kann. Jeder weitere nachfolgende Vertebra ist um mindestens 18 · 2 −B S<br />

in Bezug auf den Vertebra von V 0 im Uhrzeigersinn gedreht, und jeder weitere Extender<br />

ist um mindestens 12 · 2 −B S<br />

gedreht.<br />

Lemma 4.3. Angenommen, wir lassen den Spine-Algorithmus laufen, und zu einem<br />

Zeitpunkt s ist V 0 der linke Endpunkt eines Vertebra V 0 E s , und zu einem anderen<br />

Zeitpunkt t ist es der linke Endpunkt eines anderen Vertebra V 0 E t . Dann ist V 0 E t im<br />

Bezug auf V 0 E s gegen den Uhrzeigersinn gedreht.<br />

Beweis. Es reicht, anzunehmen, daß wen V 0 E s gelöscht wurde, V 0 E t der nächste Vertebra,<br />

der erstellt wurde, war. Das bedeutet aber, daß V 0 E t aus einer unbearbeiteten<br />

Kante erstellt wurde, die von Regel C generiert wurde. Diese Kante von V 0 E s gegen den<br />

Uhrzeigersinn gedreht, da V 0 E s E t ein reflexer Winkel ist.<br />

16


Lemma 4.4. Sei V 0 V0 ∗ irgendein Vertebra aus dem letztlichen Ergebnis. Für alle Punkte<br />

P aus S rechts von V 0 ist V 0 P höchstens um 6 · 2 −B S<br />

in Bezug auf V 0 V0 ∗ gegen den<br />

Uhrzeigersinn gedreht. Mit anderen Worten liegt P rechts von L in Abbildung 5.<br />

Beweis. Angenommen, es gibt ein P, daß dieses Lemma bricht. Wenn wir zuerst P zu<br />

einem Zeitpunkt t begegnen, ist der Punkt V der linke Endpunkt eines im Ergebnis<br />

nicht undbedingt gleichen Vertebra. Wenn er nicht derselbe ist, wird er nach Lemma 4.3<br />

in Bezug auf den endgültigen Vertebra im Uhrzeigersinn gedreht sein. Außerdem wir der<br />

am meisten rechts stehende Vertebra VE zum Zeitpunkt t noch mehr im Uhrzeigersinn<br />

gedreht sein. Allerdings liegt V rechts von L (Lemma 4.2) und rechts von V 0 . Daher<br />

wird VP in Bezug auf V 0 P gegen den Uhrzeigersinn gedreht sein. Deswegen wird der<br />

Winkel EVP größer als 6·2 −B S<br />

sein, und Regel C wird dafür sorgen, daß E gelöscht wird.<br />

Schließlich werden alle Punkte zwischen V 0 und P auf diese Weise entfernt werden. Dies<br />

ist ein Widerspruch, denn dann würden wir auch V ∗ 0 aus dem Endergebnis löschen.<br />

Lemma 4.5. Kein Punkt liegt weiter als 30µ außerhalb der Spine.<br />

Beweis. Es reicht zu beweisen, daß diese Schranke für alle Punkte P in der monotonen<br />

Sequenz gilt. Seien VE und EE ∗ das Vertebra-Extender-Paar, so daß P irgendwo in der<br />

ursprünglichen monotonen Sequenz zwischen V und E ∗ auftaucht. Lemma 4.4 impliziert,<br />

daß P in einem Bereich wie in Abbildung 7 dargestellt liegt. Die Strecke L bildet eine<br />

Winkel von 6 · 2 −B S<br />

in Bezug auf VE; EE ∗ bildet einen Winkel von höchstens 24 · 2 −B S<br />

in die andere Richtung (Bedingung 3). Daher ist der Winkel E ∗ VP durch 30 · 2 −B S<br />

beschränkt. Der Abstand von P zur Spine ist beschränkt durch<br />

δ(P, VE ∗ ) < 30 · 2 −B S<br />

|VE ∗ |<br />

< 30 · 2 −BS · ∆ = 30µ<br />

Dies vervollständigt den Beweis, daß die Spine eine 30µ-Hülle ist.<br />

4.3 Entfernen von reflexen Winkeln<br />

Die Spine könnte immer noch einige reflexe Winkel enthalten. Dieses Kapitel beschreibt<br />

eine einfach Post-Processing-Phase, wie man diese Winkel entfernen kann, ohne den<br />

Fehler zu vergrößern.<br />

Falls ein Extender einen reflexen Winkel mit einem der benachbarten Vertebrae bilden<br />

könnte (wenn der berechnete Winkel kleiner ist als 3·2 −B S<br />

), dann entfernen wir den entsprechenden<br />

Endpunkt. Aufgrund des großen Winkels (mindestens 18 · 2 −B S<br />

) zwischen<br />

aufeinanderfolgenden Vertebrae werden nie beide Endpunkte eines Extenders entfernt.<br />

Daher entfernt das Löschen von möglichen reflexen Winkeln höchstens einen Bereich von<br />

6µ und ändert die Orientierung des Vertebras um höchstens 6 · 2 −B S<br />

. Da sich Vertebrae<br />

um mindestens 18 · 2 −B S<br />

in ihrer Orientierung unterscheiden vor dem letzten Trimmen,<br />

17


L<br />

E<br />

P<br />

< 40 . 2<br />

-P radians<br />

E*<br />

V<br />

< 8 . 2<br />

-P radians<br />

Abbildung 7: Bereich, der durch das Extrahieren abgeschnitten wird<br />

unterscheiden sie sich hinterher um mindestens 6·2 −B S<br />

, so daß alle Winkel messbar konvex<br />

sind. Der gesamte Fehler beträgt 36µ. Das Entfernen von reflexen Winkeln benötigt<br />

nur lineare Zeit. Daher haben wir folgendes bewiesen:<br />

Lemma 4.6 (Theorem). Mit floating point arithmetic mit einer P -bit langen MAntisse<br />

und einer rounding unit µ = 2 −B S<br />

∆ kann man eine <strong>konvexe</strong> 36µ-Hülle einer Menge von<br />

n Punkten in O(n log n) Zeit konstruieren. Um eine Genauigkeit von B bit zu erhalten,<br />

benötigt man (B + 6)-Bit-Arithmetik.<br />

Wenn wir wollten, könnten wir 21 · 2 −B S<br />

in Regel A durch einen größere Winkel 21 ·<br />

2 −B S<br />

+ 2ɛ/∆ ersetzen. Dann würde man beim post processing die Winkel entfernen,<br />

deren Wert weniger als ɛ/∆ + 3 · 2 −B S<br />

beträgt. Dies würde sicherstellen, daß alle Winkel<br />

messbar größer als ɛ/∆ sind, dafür der Gesamtfehler auf 4ɛ + 36µ ansteigt.<br />

4.4 Zusammenfassung des Algorithmus<br />

1. Extrahiere aus einer Menge von Punkten, die 4 monotonen Sequenzen, die eine<br />

Hülle zu der Menge bilden.<br />

2. Extrahiere jeweils aus den monotonen Sequenzen eine Spine<br />

3. Entferne die letzte reflexen Winkel aus den Spines und füge diese zu einer 36µ-Hülle<br />

zusammen.<br />

4. Führe das forward trimming aus.<br />

5. Führe das backward trimming aus.<br />

18


6. Das Ergebnis ist eine ɛ-strenge <strong>konvexe</strong> 54µ-Hülle.<br />

5 Schlußwort<br />

Was haben wir nun erreicht Wir haben hier einen Algorithmus für die Berechnung einer<br />

<strong>konvexe</strong>n Hülle, der uns in quasi optimaler Zeit O(n log n) (schneller geht es aufgrund des<br />

Sortierens nicht) eine Hülle berechnet, die auf jeden Fall konvex ist, bei der man sogar<br />

die gewünschte Konvexität vorher festlegen kann, denn ein ɛ-streng <strong>konvexe</strong>s Polygon<br />

hat die Eigenschaft, daß alle Innenwinkel kleiner als π − ɛ/∆ sind. Ist man mit einer<br />

12ɛ + 54µ-Hülle zufrieden, so reichen (B + 6)-Bit zur Berechnung aus gegenübern den<br />

typischen (2B+1)-Bit bei exakter Arithmetik.<br />

Nach [1]] zeigte eine empirische Studie, daß der typische Fehler des exakten Algorithmus<br />

eher bei ɛ als bei 12ɛ liegt, als Beispiel dazu dienen die Abbildungen 8 und 9 mit ɛ = 0.5<br />

und ɛ = 1. Für den robusten Algorithmus wird erwartet, daß der typische Fehler deutlich<br />

kleiner als 54µ ist.<br />

80<br />

Strong Convex Hull with 9 Points<br />

Initial Convex Hull with 274 Points<br />

60<br />

y-axis<br />

40<br />

20<br />

0<br />

0 20 40 60 80 100<br />

x-axis<br />

ɛ-streng <strong>konvexe</strong>s Polygon mit ɛ = 0.5<br />

19


Strong Convex Hull with 6 Points<br />

Initial Convex Hull with 274 Points<br />

80<br />

60<br />

y-axis<br />

40<br />

20<br />

0<br />

0 20 40 60 80 100<br />

x-axis<br />

ɛ-streng <strong>konvexe</strong>s Polygon mit ɛ = 1<br />

Literatur<br />

[1] Zehnyu Li und Victor Milenkovic, Constructing Strongly Convex Hulls Using Exact<br />

Or Rounded Arithmetic, 1992<br />

[2] Minsick Park, Chang-Woo Park, Mignon Park und Chang-Hoon Lee, Algorithm for<br />

detecting human faces based on convex-hull,<br />

http://www.opticsexpress.org/view file.cfmdoc=%23)%5CO(%0A&id=<br />

%24(%2CO-KP%20%20%0A<br />

[3] H. W. Lang, Graham Scan, 2003,<br />

http://www.iti.fh-flensburg.de/lang/algorithmen/geo/graham.htm<br />

[4] Eugene Fink und Derick Wood, Planar Strong Visibility,<br />

http://www.cs.ust.hk/tcsc/RR/2003-03.ps.gz<br />

[5] John Fisher, John Lowther and Ching-Kuang Shene, If You Know B-Splines Well,<br />

You Also Know NURBS!,<br />

http://db.grinnell.edu/sigcse/sigcse2004/viewAcceptedSession.asp<br />

sessionType=Paper&sessionNumber=66<br />

20


[6] Geometry Lab, Arbeitsgruppe Prof. Dr. R. Klein, Die Minkowski-Summe zweier<br />

beliebiger Polygone<br />

http://www.geometrylab.de/MinkowskiSum/<br />

21

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!