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