Streng konvexe Hüllen

Transcription

Streng konvexe Hüllen
Streng konvexe Hüllen
Jörg Wegener
30. Mai 2005
Inhaltsverzeichnis
1 Einführung
1.1 Konvexe Hüllen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 -streng konvexe δ-Hüllen . . . . . . . . . . . . . . . . . . . . . . . . . .
2
2
3
2 Bausteine
2.1 Arithmetisches Modell . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Berechnen von Winkeln . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3 Geometrischer Abstand . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
4
5
8
3 Der Algorithmus mit exakter Arithmetik
9
4 Der
4.1
4.2
4.3
4.4
robuste Algorithmus für die konvexe Hülle
Extrahieren eines Spines . . . . . . . . . . .
Beweis des Algorithmus . . . . . . . . . . .
Entfernen von reflexen Winkeln . . . . . . .
Zusammenfassung des Algorithmus . . . . .
5 Schlußwort
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
13
14
15
17
18
19
1
1 Einführung
1.1 Konvexe Hüllen
Definition 1. Eine konvexe Hülle einer Punktemenge S ist das kleinste konvexe Polygon, daß alle Punkte aus S enthält.
Abbildung 1: Menge von Punkten und ihre konvexe Hülle
Konvexe Hüllen sind häufig verwendete Bausteine in der algorithmischen Geometrie.
Zum Beispiel tauchen sie bei Gesichtserkennung ([2]) oder NURBS ([5]) auf.
Um eine konvexe Hülle zu berechnen. wird häufig der Graham Scan angeführt (siehe
auch [3]):
1. Wähle Punkt p mit minimaler y-Koordinate.
2. Sortiere die übrigen Punkte in Relation zu ihrem Winkel zu p.
3. Von p ausgehend, durchlaufe die Punkte in Sortierreihenfolge.
4. Sei pi der aktuell betrachtete Punkt. Ist der Winkel zwischen den Strecken (pi−1 pi , pi pi +1)
konkav, dann: Lösche p, pi−1 wird der aktuell betrachtete Punkt und wiederhole
diesen Schritt. Ist der Winkel konvex, dann verbinde pi und pi+1 und wiederhole
den Schritt, falls pi+1 6= p.
Der Algorithmus fügt der konvexen Hülle also immer einen Punkt hinzu, und löscht in
einem Backtracking-Schritt die vorhergehenden solange, bis kein konkaver Winkel mehr
vorhanden ist.
Bei der Ausführung eines solchen Algorithmus am Computer treten aber Rechenungenauigkeiten auf, die dieser nicht berücksichtigt. So kann weder garantiert werden, daß
2
die Ausgabe eine Hülle oder aber alle Winkel konvex sind. Außerdem könnte man ein
Polygon benötigen, dessen Winkel ein bestimmtes Minimum an Konvexität besitzen, da
der weiterverarbeitende Algorithmus wieder Ungenauigkeiten einführt oder aber nur auf
konvexen Polygonen operieren kann, die dann z.B. auch keinen 180◦ -Winkel enthalten
dürfen (ein Beispiel dafür ist die Minkowski-Summe, [6]). Dieses Problem soll hier besprochen werden. Dabei wird ein Algorithmus vorgestellt, dessen Ausgabe in jedem Fall
konvex ist bzw. eine gewünschte Konvexität erzeugt.
1.2 -streng konvexe δ-Hüllen
Im Genauen berechnet dieser Algorithmus eine -strenge konvexe δ-Hülle. Dies ist ein
konvexes Polygon, aus dem jeder Punkt um pertuerbiert werden kann, ohne daß die
Konvexität verloren geht. Gleichzeitig liegt kein Punkt der zu Grunde liegenden Menge
weiter als δ außerhalb der Hülle.
Hier werden ein Algorithmus mit exakter Arithmetik vorgestellt, der in der Lage ist, eine
-strenge konvexe O()-Hülle in Zeit O(n log n) zu berechnen, und ein Algorithmus mit
gerundeter Arithmetik, der eine -strenge O( + µ) ebenfalls in O(n log n) Zeit berechnet
(wobei die rounding unit µ im folgenden Kapitel definiert wird).
Definition 2. Ein Polygon P ist eine δ-Hülle einer Punktmenge S, wenn alle Vertices
von P zu S gehören und wenn kein Punkt von S weiter als δ von dem von P begrenzten
Gebiet entfernt ist.
Ein Polygon P ist -schwach konvex ( > 0), wenn es eine Möglichkeit gibt, jeden Vertex
um nicht mehr als zu perturbieren, so daß P konvex wird.
Ein Polygon P ist -streng konvex ( > 0), falls P konvex ist und auch konvex bleibt,
selbst wenn jeder Punkt von P um bis zu perturbiert wird.
Definition 3. Seien A, B und C gegen den Uhrzeigersinn aufeinanderfolgende Punkte
eines Polygons P . Der Vertex B ist -streng konvex, wenn der Abstand δ(B, CA) von B
zu der Geraden CA größer als ist.
Lemma 1.1. Wenn jeder Vertex eines Polygons P 2-streng konvex ist, dann ist P
-streng konvex.
D.h. wenn man jeden Vertex für sich um 2 bewegen kann, lassen sich alle Vertices um
bewegen. Die Umkehrung gilt i.A. nicht.
Beweis: Angenommen, alle Punkte seien 2-streng konvex, aber P sei nicht -streng
konvex. Dann müsste eine -Perturbation existieren, durch die manche Punkte B nicht
mehr konvex sind. Seien A und C die zu B benachbarten Punkte. Es ist offensichtlich,
daß alle Punkte des Dreiecks ABC 2-streng konvex sind hinsichtlich dieses Dreiecks.
3
C
B
ε
A
Abbildung 2: -strenger Vertex
Es muss also eine kleinere Perturbation geben, die ABC in ein degeneriertes Dreieck
A0 B 0 C 0 transformiert, in dem B 0 auf A0 C 0 liegt. Die Punkte A0 und C 0 befinden sich dann
innerhalb von der Geraden AC. Also muss sich auch B 0 innerhalb von AC befinden. B
ist nicht mehr als von B 0 entfernt, also muss sich B innerhalb von 2 von AC befinden.
Das ist ein Widerspruch dazu, daß B 2-streng konvex ist.
2 Bausteine
Bevor wir uns dem Algorithmus widmen können, müssen wir uns mehrere Dinge klar
machen: Wie kann man mit gerundeter Arithmetik Winkel und Abstände berechnen und
wie hoch sind dabei die Genauigkeit und die Kosten? Beide Operationen werden bei der
Berechnung von konvexen Hüllen benötigt. Außerdem gibt es mehrere Möglichkeiten,
die Eingabe darzustellen. Wir betrachten hier fixed point, single precision floating point
und double precision floating point arithmetic. Da sich fixed point-Operationen mit
floating point ausgeführt werden können, reicht es, wenn wir uns den beiden letzteren
widmen. Da die genaue Darstellung von Zahlen auf verschiedenen Computersystemen
unterschiedlich ist, abstrahieren wir hier:
2.1 Arithmetisches Modell
Fixed point-Darstellung ist im Prinzip nichts anderes, als Integer-Darstellung mit der
Implikation, daß jede Zahl mit 2P bei einem festen P multipliziert wird. Floating point
hat einen explizit angegebenen Exponenten sowie eine Mantisse. Der Wert einer floating
point-Zahl mit Mantisse m und Exponent e ist 2e m.
4
Im folgenden habe die fixed point- oder Integer-Darstellung BI Bit, die single precision
floating point-Mantisse BS Bit und die double precision floating point-Mantisse BD Bit.
In einem typischen PC liegt BI bei 16 oder 32, BS ist 21, und BD ist 53. Wir nehmen
daher an, daß BS < 2BI und BD > 2BS , single precision ist also weniger als zweimal
so groß wie ein Integer, aber double precision ist mindestens zweimal so groß wie single
precision.
Berechnungen mit single precision und BS Bit haben eine relative Fehlerschranke von
2−BS . Zum Beispiel ist
|(a +BS b) − (a + b)| 6 2−BS |a + b|,
wobei a+BS b die Summe von a und b berechnet mit single precision-Arithmetik darstellt.
Für die übrigen drei Standardrechenoperationen gelten analoge Fehlerschranken. Diese
Annahme reicht hier für alle floating point-Darstellungen aus.
Für eine gegebene Menge S von Punkten in der Ebene sei der Durchmesser Delta von
S der maximale Abstand eines Punktepaares aus S. Für geometrische Berechnungen in
einer Menge von Punkten wird der absolute Fehler als ein Vielfachen der rounding unit
µ = 2−BS ∆ angegeben. Dieses Vielfache ist unabhängig von der gewählten Präzision
und Maßstab.
2.2 Berechnen von Winkeln
Im folgenden werden alle Winkel im Bogenmaß angegeben.
Eine essentielle Berechnung beim Konstruieren von konvexen Hüllen ist zu entscheiden,
ob zwei Segmente AB und BC einen konvexen oder kokaven Winkel bilden. Der robuste
Algorithmus zur Berechnung der konvexen Hülle benötigt etwas allgemeiner die Funktion, den Winkel zwischen zwei Liniensegmenten AB und CD zu berechnen. O.b.d.A.
nehme man an, daß die beiden Segmente positive Steigung haben und nach rechts zei”
gen“: Ax < Bx , Ay < By , Cx < Dx und Cy < Dy . Sei θ(AB) als der Winkel zwischen
AB und der x-Achse definiert, d.h. von der Strecke AB gegen den Uhrzeigersinn zur xAchse. Sei θ(AB, CD) = θCD −θAB der Winkel zwischen den Strecken CD und AB. Die
folgende Funktion exakter Arithmetik überprüft, ob θ(AB, CD) größer oder gleich 0 ist.
PositiveAngleSign(AB, CD)
if [(Bx − A − x)(Dy − Cy ) − (By − Ay )(Dx − Cx ) > 0]
then return true
else return false
Um den Winkel θ(AB, CD) zu berechnen, müssen wir sowohl eine Quadratwurzel ziehen,
als auch einen Arcussinus berechnen. Dies können wir vermeiden, indem wir die relative
5
Änderung der Steigung berechnen:
τ (AB, CD) =
tan θ(CD) − tan θ(AB)
|tan θ(CD)| + |tan θ(AB)|
Dy − Cy
By − Ay
−
D − Cx Bx − Ax = x
Dy − Cy + By − Ay Dx − Cx Bx − Ax =
(Bx − Ax )(Dy − Cy ) − (By − Ay )(Dx − Cx )
|(Bx − Ax )(Dy − Cy )| + |(By − Ay )(Dx − Cx )|
Unter der Annahme, daß alle Segmente positive Steigung haben, können wir die Betragsstriche weglassen. Wir können dir relative Änderung der Steigung mit Hilfe der
dritten Formel berechnen, oder aber, falls wir Divisionen vermeiden möchten, mit Hilfe
der folgenden Funktion entscheiden, ob die relative Änderung der Steigung größer als
ein bestimmter Wert κ ist.
ReleativeSlopeCompare(AB, CD, κ)
if [(Bx − Ax )(Dy − Cy ) − (By − Ay )(Dx − Cx )
> κ((Bx − Ax )(Dy − Cy ) + (By − Ay )(Dx − Cx ))]
then return true
else return false
Exakte Konvexe-Hüllen-Algorithmen benutzen PositiveAngleSign, der hier vorgestellte robuste Algorithmus verwendet RelativeSlopeCompare. Es könnte so aussehen, daß
RelativeSlopeCompare teurer in der Berechnung ist, tatsächlich kann man es aber so
implementieren, daß es nur eine Addition und eine Multiplikation mehr benötigt. Außerdem können die tatsächlichen Kosten bei exakter Arithmetic höher sein, als es zuerst
den Anschein hat, wie die folgenden Lemmata zeigen:
Lemma 2.1. PositiveAngleSign kann mit double precision Additionen (oder Subtraktionen) und Multiplikationen exakt berechnet werden. Die folgene Tabelle zeigt die Schranken für die Anzahl benötigter Operationen für verschiedene Arten der Eingabe. Im Falle
von fixed point-Eingaben können vier Additionen mit Integeroperationen gemacht werden.
Eingabedarstellung
Additionen
Fixed Point
5
Single Precision Floating Point
7
Double Precision Floating Point
71
Multiplikationen
2
8
72
Beweis. Im Falle von fixed point-Eingaben können vier Subtraktionen mit fixed pointArithmetik durchgeführt werden. Die verbleibenden zwei Multiplikationen und eine Subtraktion können mit double precision durchgeführt werden, ohne daß ein Rundungsfehler
auftritt - vorrausgesetzt double precision kann das Quadrat eines Integers aufnehmen.
6
Im Fall von single precision floating point-Inputs kann der Ausdruck auf acht Terme
erweiter werden, die aus dem Produkt zweier single precision floating point-Zahlen bestehen. Jedes dieser Produkte kann mit double precision berechnet werden. Haben diese
passende least significant bits, können diese ohne Rundungsfehler addiert werden. Sonst
werden die Zahlen in der Reihenfolge kleinste bis größte addiert. Auf diese Weise hat
das gerundete Ergebnis das gleiche Vorzeichen wie das exakte.
Im Fall von double precision floating point-Input kann jede Eingabe als Summe aus drei
single precision floating point-Zahlen dargestellt werden. Erweitern wie vorher liefert 72
double precision-Terme, die wie vor addiert werden können.
Lemma 2.2. RelativeSlopeComapre kann mit 6 single precision floating point-Additionen
und 3 single precision floating point-Multiplikationen annähernd berechnet werden. Die
absolute Genauigkeit ist (3 + 6κ) · 2−BS . Insbesondere:
• if RelativeSlopeCompare(AB, CD, κ) = true then τ (AB, CD) > κ−(3+6κ)·2−BS
• if RelativeSlopeCompare(AB, CD, κ) = false then τ (AB, CD) 6 κ + (3 + 6κ) ·
2−BS
Die Fehlerschranke bei double precision beträgt analog (3 + 6κ) · 2−BD .
In der Praxis benutzen wir RelativeSlopeCompare nur für kleine Werte von κ (ca. 32 ·
2−BS ). In diesem Fall können wir den Fehlerterm 6 · 2−BS κ vernachlässigen. Aus diesem
Grund wird die Fehlerschranke ab hier einfach 3 · 2−BS sein.
Beweis. Ein relativer Fehler von 2−BS in der Berechnung von Bx − Ax mündet in einen
absoluten Fehler von 2−BS (Bx − Ax )(Dy − Cy ) in der Berechnung des Ausdrucks
(Bx − Ax )(Dy − Cy ) − (By − Ay )(Dx − Cx ).
Ähnliche Schranken gelten für die anderen zwei Multiplikationen und drei der anderen
Subtraktionen. Die Summe dieser Fehler ist beschränkt durch
3 · 2−BS ((Bx − Ax )(Dy − Cy ) + (By − Ay )(Dx − Cx )).
Die Auswertung der letzten Subtraktion ergibt einen absoluten Fehler, der beschränkt
ist durch
2−BS |(Bx − Ax )(Dy − Cy ) − (By − Ay )(Dx − Cx )|.
Dies entspricht einem relativen Fehler von bis zu 2−BS bei der Berechnung des Winkels.
Da dieser Fehler relativ ist, können wir ihn behandeln, als träte er auf der rechten Seite
der Ungleichung auf. Mit ähnlicher Argumentation kann gezeigt werden, daß der absolute
Fehler beim Berechnen des Ausdruck
κ((Bx − Ax )(Dy − Cy ) + (By − Ay )(Dx − Cx ))
7
durch
5 · 2−BS κ((Bx − Ax )(Dy − Cy ) + (By − Ay )(Dx − Cx )).
Der Transfer des Fehler von der rechten zur linken Seite macht aus der 5 eine 6. Zusammen implizieren die Fehlerschranken das Lemma.
Von nun an wird τ (AB, CD) behandelt, als wäre es θ(AB, CD), also der Winkel zwischen AB und CD. Aus zweierlei Gründen ist dies möglich: Zuerst ist τ (AB, CD) immer
eine Überschätzung von θ(AB, CD), genauer ist
τ (AB, CD) 6 sin θ(AB, CD) 6 θ(AB, CD)
für alle positiv steigenden Liniensegmente, die nach rechts zeigen“. Für fast horizontale
”
oder vertikale AB und CD ist τ (AB, CD) wesentlich größer als θ(AB, CD). Dies bedeutet, daß ein absoluter Fehler von 3 · 2−BS bei der Messung von τ einem viel kleineren
Fehler bei der Messung von θ entspricht.
Der zweite Grund besteht darin, daß für feste AB τ (AB, CD) eine monotone Funktion
von θ(AB, CD) ist. Dies impliziert folgendes Lemma:
Lemma 2.3. If τ (AB, BC), τ (AB, CD) < κ, then τ (AB, BD) < κ.
Beweis. Dies folgt aus der Monotonie von τ und der Tatsache, daß
min(θ(BC), θ(CD)) 6 θ(BD) 6 max(θ(BC), θ(CD)).
2.3 Geometrischer Abstand
Der vorzeichenbehaftete Abstand eines Punktes C zu einer Geraden AB kann mit der
folgenden Formel berechnet werden:
δ(C, AB) =
AB × AC)
(Bx − Ax )(Cy − Ay ) + (By − Ay )(Cx − Ax )
p
=
|AB|
(Bx − Ax )2 + (By − Ay )2
Die Abstandsfunktion hat positives Vorzeichen, wenn C links von AB liegt, wenn man
von A auf B schaut.
Die folgende Funktion entscheidet, ob (δ(C, AB) größer ist, als ein positiver Wert κ.
Die Variante, die negatives κ behandelt, ist ähnlich und benötigt die selbe Anzahl von
arithmetischen Operationen.
8
DistanceCompare(AB, C, κ)
if [(Bx − Ax )(Cy − Ay ) − (By − Ay )(Cx − Ax ) > 0
and
((Bx − Ax )(Cy − Ay ) − (By − Ay )(Cx − Ax ))2
> κ2 ((Bx − Ax )2 + (By − Ay )2 )]
then return true
else return false
DistanceCompare vermeidet Quadratwurzeln und Divisionen. Selbst für fixed pointEingaben kostet es mehr, diese Funktion exakt zu berechnen, als approximate arithmetic
zu benutzen.
Lemma 2.4. DistanceCompare kann annähernd mit single precision floating pointOperationen berechnet werden. Die absolute Genauigkeit beträgt 3·2−BS |AB|+6.5κ·2−BS .
Die Fehlerschranke bei double precision arithmetic ist 3 · 2−BD |AB| + 6.5κ · 2−BD .
Teilweiser Beweis. Der Beweis dieses Lemmas ist ähnlich zu dem des Lemmas 2.2. Wie
bei RelativeSlopeCompare werden wir diese Funktion nur für sehr kleine κ aufrufen.
Daher werden wir die Fehlerschranke 3 · 2−BD |AB| verwenden, welche wiederum durch
3µ beschränkt ist, da |AB| 6 ∆, der Durchmesser der Menge von Eingabepunkten.
3 Der Algorithmus mit exakter Arithmetik
Die -streng konvexe Hülle soll in zwei Phasen konstruiert werden: Zuerst wird eine
einfache konvexe Hülle generiert (z.B. mittels Graham-Scan). Danach werden alle Winkel
durch Entfernen oder Ändern einiger Punkte angepasst, so daß das Polygon schließlich
-streng konvex ist. Lemma 1.1 zeigt uns, daß es reicht, jeden Vertex des Polygons 2streng zu machen.
Im folgenden sind A,B und C drei aufeinanderfolgende Punkte. Ist also δ(B, AC) > 2,
dann ist B 2-streng konvex und braucht nicht geändert zu werden. Andere Punkte
lassen sich entfernen, da H konvex ist und so B nur noch strenger“ werden kann. Mit
”
Hilfe eines Prädikats IsStrong(V) werden daher alle 2-strengen Vertices als STRONG
markiert.
Was passiert nun, wenn IsStrong(B) false zurückliefert? In diesem Fall ist B zu nah
an der Strecke AC und ABC fast ein gestreckter Winkel. Die Strecken AB und BC
werden jetzt durch zwei Strecken A0 B und C0 B ersetzt. Dabei sind A0 und C0 zwei
Punkte auf dem Rand von H, so daß δ(A0 , AB) > 2 und δ(C0 , BC) > 2. C0 und A0
müssen nicht zwingend Vertices aus H sein. Dadurch wird ein Bereich der Dicke 2 vom
Polygon abgeschnitten. Wie man in Abbildung 3 sieht, kann dies auch das Abschneiden
anderer Punkte aus H beinhalten. Diesen Vorgang bezeichnen wird mit Trimming. Nach
9
dem Trimming sind alle Punkte von H nicht mehr als 2 von dem getrimmten Polygon
entfernt.
B
C
A
2ε
2ε
A’
C’
Abbildung 3: Trimming
Diese einfache Methode des Trimmings bereitet aber einige Probleme:
• Wie oben erwähnt, könnte es sein, daß A0 oder C0 keine Punkte des ursprünglichen
Polygons sind.
• Die Punkte des Polygons könnten zu nah oder zu weit weg von der Geraden AB
sein, um als Annäherung zu A0 zu fungieren.
• Ein Trimming-Schritt könnte einen vorhergehenden wieder rückgängig machen.
• Bei mehrfachem Trimmen könnte ein Bereich, der dicker als c ist, abgeschnitten
werden.
Um diese Probleme zu umgehen, führen wir das Trimming in zwei Phasen durch: forward
trimming und backward trimming.
1. Forward Trimming
Wir definieren die Funktion ForwardTrim(B), um einige Nachfolger des Punktes
B (gegen den Uhrzeigersinn) zu entfernen. Diese Funktion wenden wir gegen den
Uhrzeigersinn um das Polygon wandernd auf jeden Punkt an. Sei C der ursprüngliche Nachfolger von B in H, und sei C0 der aktuelle Nachfolger von B, nachdem
wir ein paar Vertices entfernt haben (siehe Bild 3). Die Funktion ForwardTrim(B)
entfernt jeden Nachfolger von B aus dem Polygon bis einer der folgenden Events
eintritt (die in dieser Reihenfolge getestet werden):
a) IsStrong(B) ist true → B wird als STRONG markiert
10
b) IsStrong(C) ist true → B wird als FAILED markiert
c) C0 ist markiert (d.h. wir haben das komplette Polygon überprüft) → B wird
als FAILED markiert
d) δ(C0 , BC) > 2 → B wird als FTRIMMED markiert.
C
B
< 2ε
< 2ε
> 2ε
C’
< 4ε
Abbildung 4: Forward Trimming
Lemma 3.1. Nach dem Forward Trimming ist kein Vertex aus H mehr als 4 von
dem getrimmten Polygon entfernt.
Beweis. Abbildung 4 zeigt den Fall, bei dem das Trimmen bei C 0 0 aufgrund Bedingung d) beendet wird. Da wir die Funktion ForwardTrim beim Vorgänger von C0
nicht angehalten haben, muss der Vorgänger weniger als 2 von BC entfernt sein.
Der Teil von H von B bis C 0 liegt innerhalb des schattierten Bereichs, der sich innerhalb von 4 der Strecke BC 0 befindet. BC 0 wird aber nie entfernt. Daraus folgt,
daß sich jeder Punkt des ursprünglichen Polygons innerhalb 4 eines Segments des
getrimmten Polygons befinden muss.
2. Backward Trimming
Die Funktion BackwardTrim(B) wird analog zu ForwardTrim definiert. Sie kann
die Nachfolger von B (im Uhrzeigersinn), die FAILED oder FTRIMMED aber
nicht STRONG (aufgrund der zweiten Abbruchsbedingung) markiert sind entfernen. Diese Funktion wenden wir wieder im Uhrzeigersinn auf jeden Punkt des
11
getrimmten Polygons an, der als FTRIMMED markiert ist. Die dritte Abbruchsbedingung bezieht sich natürlich auf die in dieser Phase markierten Punkte, nicht
auf die durch ForwardTrim markierten. Bei der Abbruchsbedingung d) wird der
Vertex nicht als FTRIMMED sondern als STRONG markiert, da er, wir vorher
überlegt, dann 2-streng sein muss (siehe Abb. 3).
Die einzelnen Bedingungen sind also:
a) IsStrong(B) ist true → B wird als STRONG markiert
b) IsStrong(C) ist true → B wird als FAILED markiert
c) C0 ist markiert (d.h. wir haben das komplette Polygon überprüft) → B als
FAILED markiert
d) δ(C0 , BC) > 2 → B wird als STRONG markiert.
Bei der Abbruchsbedingung d) wird der Vertex nicht als FTRIMMED sondern als
STRONG markiert, da er, wir vorher überlegt, dann 2-streng sein muss (siehe
Abb. 3).
Anschließend werden alle als FAILED markierten Vertices entfernt. Übrig bleiben
nur als STRONG markierte Punkte.
Lemma 3.1 impliziert, daß das erste getrimmte Polygon innerhalb von 4 des zweiten getrimmten Polygons liegt, also alle Punkte aus H innerhalb von 8 des zweiten
getrimmten Polygons liegen.
Lemma 3.2. Nach dem Forward und Backward Trimming gibt es keine Folge mit mehr
als drei konsekutiven, als FAILED markierten Vertices. Daraus folgt, daß das Entfernen
von als FAILED markierten Punkten höchsten 4 zum Fehler addiert.
Beweis. Nach dem Forward Trimming folgt jedem als FAILED markierten Vertex ein als
STRONG markierter (zweite Abbruchsbedingung), außer es handelt sich um den letzten markierten Vertex (dritte Abbruchsbedingung), in welchem Fall im ein als FAILED
markierter und danach ein als STRONG markierter Vertex folgt. Es gibt also höchstens
zwei aufeinanderfolgende als FAILED markierte Vertices. Backward Trimming kann jedem als FAILED markierten Vertex höchstens einen weiteren als FAILED markierten
Vertex hinzufügen (da wir vorher jedem FAILED Vertex ein STRONG Vertex folgt). Im
schlimmsten Fall wird also eine Folge von drei als FAILED markierten Vertices aus den
zwei aufeinanderfolgenden Vertices des Forward Trimmings erstellt.
Wenn A, B und C aufeinanderfolgende Punkte sind und B als FAILED markiert ist,
dann ist B nicht STRONG und liegt demnach innerhalb von 2 von AC. Wenn B entfernt
wird, wird das Polygon höchstens um 2 vom ursprünglichen Polygon entfernt. Wenn zwei
oder drei aufeinanderfolgende als FAILED markierte Vertices entfernt werden, addieren
sich die Fehler, aber nicht auf mehr als 4. Für zwei Punkte ist dies offentsichtlich.
12
Für drei Punkte entfernen wir erst den ersten und dritten (keine Überschneidung) und
entfernen dann den zweiten.
Jede Phase des Algorithmus entfernt das getrimmte Polygon um maximal 4 von der
ürsprünglichen konvexen Hülle H. Der größte Abstand von H zum fertigen −strengen
Polygon ist 12. Da alle Punkte aus S in H liegen, genügen auch diese jener Fehlerschranke. Dies beweist das folgende Theorem.
Lemma 3.3 (Theorem). Sei eine konvexe Hülle (der größe h) einer Menge von Punkten
S gegeben. Dann kann eine -strenge konvexe 12-Hülle in O(h) konstruiert werden.
4 Der robuste Algorithmus für die konvexe Hülle
Um den Algorithmus aus Kapitel 3 mit Hilfe von single (oder double) precision floating
point arithmetic zu implementieren, benutzen wir Lemma 2.4. Da die Abstandsmessung
zusätzlich einen Fehler von 3µ hinzufügt, wird im Algorithmus jedes 2 durch 2 + 3µ
ersetzt. Der Algorithmus berechnet dann eine -strenge konvexe (12 + 18µ)-Hülle (da
jedesmal, wenn wir 2 + 3µ entfernt wird, zusätzlich 3µ entfernt werden könnten).
Nun fehlt uns zum Start noch eine konvexe Hülle, die wir aber mit gerundeter Arithmetik
nicht berechnen können. Daher wird hier gezeigt, wie mit einer Abwandlung des GrahamAlgorithmus eine konvexe 36µ-Hülle einer Menege S von n Punkten generiert wird, die
dann als Basis für unseren Algorithmus dient. Mit dieser erhalten wir am Schluss dann
eine -strenge konvexe (12 + 54µ)-Hülle.
Zuerst müssen wir vier monotone Sequenzen von Punkten aus S extrahieren, die mindestens alle Punkte aus der konvexen Hülle beinhalten. In jeder Sequenz sind die x- und
y-Koordianten der Punkte monotone Funktionen ihres Index, d.h. die Punkte finden sich
von links nach rechts (oder rechts nach links) streng in aufsteigender (oder absteigender)
Reihenfolge.
Um eine Sequenz zu generieren, sortieren wir S aufsteigend nach der x-Koordinate und
betrachten die Punkte in dieser Reihenfolge. Jedesmal, wenn wir einem Punkt begegnen,
dessen y-Koordinate gleich oder kleiner als die größte y-Koordinate, die wir bislang gesehen haben, ist, schmeißen wir ihn raus. Wenn mehrere Punkte dieselbe x-Koordinate
haben, schmeißen wir alle außer dem mit der höchsten y-Koordinate raus. In Abbildung 5 ist der Punkt H der Anfangspunkt der Sequenz und H∗ und H∗∗ nachfolgende
Elemente, wobei ∗ den Nachfolgeoperator darstellt. Um die anderen drei Sequenzen zu
erstellen, lassen wir den Algorithmus auf derselben Menge S laufen, aber drehen jeweils
die Vergleichsrichtung. Abbildung 5 illustriert die vier Sequenzen. Die aufsteigenden sind
durchgehend und die absteigenden gepunktet gezeichnet.
13
H**
H*
H
Abbildung 5: Die 4 monotonen Sequenzen, die zusammen die konvexe Hülle beinhalten
Nun haben wir zwar eine Hülle für die Punktemenge, diese ist aber nicht konvex. Sämtliche Punkte, deren Innenwinkel > 180◦ ist (diese Punkte nennen wir reflex) müssen nun
noch überbrückt“ werden.
”
4.1 Extrahieren eines Spines
Wenn wir nun einfach hingehen, und alle reflexen Vertices aus der monotonen Sequenz
entfernen, kann es passieren, daß wir einen Fehler von nµ hinzufügen, da auch nichtreflexe Punkte durch Rundungsfehler reflex erscheinen können. Die Lösung nennt sich
Spine, dies ist eine Subsequenz mit der Eigenschaft, daß das Entfernen von reflexen
Winkeln aus dieser einen Fehler von O(µ) gibt. Wir werden sehen, daß die vier erstellten
Spines eine 30µ-Hülle bilden, bei der das Entfernen der restlichen reflexen Winkel nur
noch 6µ zum Fehler hinzufügt.
Eine Spine ist eine Sequenz von Kanten zweierlei Typs: Vertebrae (Wirbel) und Extender
(Erweiterung). Diese Kanten genügen drei Bedingungen:
1. Die erste Kante ist ein Vertebra, und jedem Vertebra folgt höchstens ein Extender.
2. Jeder Vertebra ist mindestens um 18 · 2−BS im Uhrzeigersinn rotiert bezogen auf
den vorhergehenden Vertebra.
3. Jeder Extender ist zwischen −6 · 2−BS und 24 · 2−BS im Uhrzeigersinn gedreht
bezogen auf den vorhergehenden Vertebra, und ist höchstens um 6·2−BS gegenüber
dem nachfolgenden Vertebra rotiert.
14
Abbildung 6 zeigt eine Spine. Die dunklen Kanten sind Vertebrae, die gepunkteten Extender. Offensichtlich bilden die Winkel der Vertebrae, so wie sie in Kapitel 2.2 definiert
sind, eine aufsteigende Sequenz. Nur ein Extender kann mit einem benachbarten Vertebra einen reflexen Winkel bilden, dieser kann aber nicht allzu groß sein.
L
V0
E
V
E*
E**
8 . 2 -P radians
Abbildung 6: Polygonale Kurve aus Vertebrae und Extendern
Ähnlich zum Graham-Algorithmus erstellen wir eine Spine von links nach rechts, indem
wir Punkte aus einer monotonen Sequenz entfernen. Zu jedem Zeitpunkt der Berechnung
haben wir eine teilweise konstruiertes Spine, dem noch unverarbeitete Kanten folgen. Sei
VE der am weitesten rechts liegende Vertebra und EE∗ sein nachfolgender Extender.
Folgt kein Extender, dann gilt E = E∗ . Sei E∗ E∗∗ die nächste unbearbeitete Kante.
RelativeSlopeCompare(E∗ E∗∗ , VE, κ) ist true, wenn die Rotation im Uhrzeigersinn von
E∗ E∗∗ in Bezug auf VE größer ist als κ, berechnet mit rounded arithmetic.
A. Wenn RelativeSlopeCompare(E∗ E∗∗ , VE, 21 · 2−BS ) = true, dann mache E∗ E∗∗ zu
einem Vertebra.
B. Wenn nicht, dann vereinige E∗ E∗∗ mit dem Extender EE∗ , d.h. entferne E∗ , wenn
E∗ 6= E, Vertex E∗∗ ändert seinen Namen zu E∗ .
C. Wenn RelativeSlopeCompare(VE, EE∗ , 3 · 2−BS )= true (der eben erstellte Extender bildet einen reflexen Winkel mit dem Vertebra), entferne auch E. Die erstellte
Kante VE∗ wird zu der Liste unbearbeiteter Kanten hinzugefügt.
4.2 Beweis des Algorithmus
Der Beweis des Algorithmus gliedert sich in zwei Teile: Zuerst wird gezeigt, daß der
Algorithmus den Bedingungen 1-3 genügt. Dann wird gezeigt, daß die generierte Spine
eine 30µ-Hülle ist.
15
Lemma 4.1. Jedesmal, wenn die Regeln A, B und C angewendet werden, genügt die
teilweise konstruierte Spine den Bedingungen 1-3.
Beweis. Das meiste dieses Beweises folgt unmittelbar aus der Tatsache, daß wir Winkel
mit einer Genauigkeit von ±3 · 2−BS messen können (Lemma 2.2). Der schwierigste Teil
ist, zu zeigen, daß der neue Extender, der mit der Regel B erstellt wird, Regel 3 genügt.
Die Bedingung 1 ist leicht zu sehen. Die Bedingung 2 ist eine Konsequenz der Regel A.
Eine Kante wird nur zu einem neuen Vertebra, wenn seine berechnete Rotation in Bezug
auf die vorhergehende um mindestens 21 · 2−BS größer ist. Dies impliziert, daß der echte
Winkel mindestens 18 · 2−BS größer ist. Die 24 · 2−BS -Schranke in Bedingung 3 ist eine
Folge der Regel B. Eine Kante wird mit dem augenblicklichen Extender verschmolzen,
wenn ihre Rotation weniger als 21 · 2−BS erscheint. Die impliziert, daß der echte Winkel
nicht mehr als 24 · 2−BS beträgt. Wenn der Extender dieser Schranke vor der Vereinigung
genügt, genügt er ihr auch hinterher.
Die Regel C stellt sicher, daß die −6 · 2−BS -Schranke in Bedingung 3 aufrecht erhalten
wird. Wenn sie es nicht täte, dann wäre der berechnete Winkel des Extenders in Bezug
auf den Vertebra mindestens −3 · 2−BS , und Regel C würde ihn entfernen. Schließlich
sichert Regel A die Einhaltung der 6 · 2−BS -Schranke in Bedingung 3. Der berechnete
Winkel des Extenders in Bezug auf den vorhergehenden Vertebra ist höchstens 21 · 2−BS ,
und der Winkel des nachfolgenden Vertebra in Bezug auf den vorhergenden Vertebra ist
mindestens 21 · 2−BS . Diese beiden Berechnung können höchstens um 3 · 2−BS -daneben
liegen-, so daß der Gesamtfehler durch 6 · 2−BS beschränkt ist.
Lemma 4.2. Sei V0 ein Vertex, der der linke Endpunkt eines Vertebra ist, und sei L
die Strecke durch V0 , die 6 · 2−BS gegen den Uhrzeigersinn in Bezug auf den Vertebra
gedreht ist. Jeder Punkt der Spine rechts von V0 liegt rechts von L (Abbildung 6).
Beweis. Die Bedingung 3 impliziert, daß der nachfolgende Extender im schlimmsten Fall
parallel zu L sein kann. Jeder weitere nachfolgende Vertebra ist um mindestens 18 · 2−BS
in Bezug auf den Vertebra von V0 im Uhrzeigersinn gedreht, und jeder weitere Extender
ist um mindestens 12 · 2−BS gedreht.
Lemma 4.3. Angenommen, wir lassen den Spine-Algorithmus laufen, und zu einem
Zeitpunkt s ist V0 der linke Endpunkt eines Vertebra V0 Es , und zu einem anderen
Zeitpunkt t ist es der linke Endpunkt eines anderen Vertebra V0 Et . Dann ist V0 Et im
Bezug auf V0 Es gegen den Uhrzeigersinn gedreht.
Beweis. Es reicht, anzunehmen, daß wen V0 Es gelöscht wurde, V0 Et der nächste Vertebra, der erstellt wurde, war. Das bedeutet aber, daß V0 Et aus einer unbearbeiteten
Kante erstellt wurde, die von Regel C generiert wurde. Diese Kante von V0 Es gegen den
Uhrzeigersinn gedreht, da V0 Es Et ein reflexer Winkel ist.
16
Lemma 4.4. Sei V0 V0∗ irgendein Vertebra aus dem letztlichen Ergebnis. Für alle Punkte
P aus S rechts von V0 ist V0 P höchstens um 6 · 2−BS in Bezug auf V0 V0∗ gegen den
Uhrzeigersinn gedreht. Mit anderen Worten liegt P rechts von L in Abbildung 5.
Beweis. Angenommen, es gibt ein P, daß dieses Lemma bricht. Wenn wir zuerst P zu
einem Zeitpunkt t begegnen, ist der Punkt V der linke Endpunkt eines im Ergebnis
nicht undbedingt gleichen Vertebra. Wenn er nicht derselbe ist, wird er nach Lemma 4.3
in Bezug auf den endgültigen Vertebra im Uhrzeigersinn gedreht sein. Außerdem wir der
am meisten rechts stehende Vertebra VE zum Zeitpunkt t noch mehr im Uhrzeigersinn
gedreht sein. Allerdings liegt V rechts von L (Lemma 4.2) und rechts von V0 . Daher
wird VP in Bezug auf V0 P gegen den Uhrzeigersinn gedreht sein. Deswegen wird der
Winkel EVP größer als 6·2−BS sein, und Regel C wird dafür sorgen, daß E gelöscht wird.
Schließlich werden alle Punkte zwischen V0 und P auf diese Weise entfernt werden. Dies
ist ein Widerspruch, denn dann würden wir auch V0∗ aus dem Endergebnis löschen.
Lemma 4.5. Kein Punkt liegt weiter als 30µ außerhalb der Spine.
Beweis. Es reicht zu beweisen, daß diese Schranke für alle Punkte P in der monotonen
Sequenz gilt. Seien VE und EE∗ das Vertebra-Extender-Paar, so daß P irgendwo in der
ursprünglichen monotonen Sequenz zwischen V und E∗ auftaucht. Lemma 4.4 impliziert,
daß P in einem Bereich wie in Abbildung 7 dargestellt liegt. Die Strecke L bildet eine
Winkel von 6 · 2−BS in Bezug auf VE; EE∗ bildet einen Winkel von höchstens 24 · 2−BS
in die andere Richtung (Bedingung 3). Daher ist der Winkel E∗ VP durch 30 · 2−BS
beschränkt. Der Abstand von P zur Spine ist beschränkt durch
δ(P, VE∗ ) < 30 · 2−BS |VE∗ |
< 30 · 2−BS · ∆ = 30µ
Dies vervollständigt den Beweis, daß die Spine eine 30µ-Hülle ist.
4.3 Entfernen von reflexen Winkeln
Die Spine könnte immer noch einige reflexe Winkel enthalten. Dieses Kapitel beschreibt
eine einfach Post-Processing-Phase, wie man diese Winkel entfernen kann, ohne den
Fehler zu vergrößern.
Falls ein Extender einen reflexen Winkel mit einem der benachbarten Vertebrae bilden
könnte (wenn der berechnete Winkel kleiner ist als 3 · 2−BS ), dann entfernen wir den entsprechenden Endpunkt. Aufgrund des großen Winkels (mindestens 18 · 2−BS ) zwischen
aufeinanderfolgenden Vertebrae werden nie beide Endpunkte eines Extenders entfernt.
Daher entfernt das Löschen von möglichen reflexen Winkeln höchstens einen Bereich von
6µ und ändert die Orientierung des Vertebras um höchstens 6 · 2−BS . Da sich Vertebrae
um mindestens 18 · 2−BS in ihrer Orientierung unterscheiden vor dem letzten Trimmen,
17
P
L
E
E*
< 40 . 2 -P radians
< 8 . 2 -P radians
V
Abbildung 7: Bereich, der durch das Extrahieren abgeschnitten wird
unterscheiden sie sich hinterher um mindestens 6 · 2−BS , so daß alle Winkel messbar konvex sind. Der gesamte Fehler beträgt 36µ. Das Entfernen von reflexen Winkeln benötigt
nur lineare Zeit. Daher haben wir folgendes bewiesen:
Lemma 4.6 (Theorem). Mit floating point arithmetic mit einer P -bit langen MAntisse
und einer rounding unit µ = 2−BS ∆ kann man eine konvexe 36µ-Hülle einer Menge von
n Punkten in O(n log n) Zeit konstruieren. Um eine Genauigkeit von B bit zu erhalten,
benötigt man (B + 6)-Bit-Arithmetik.
Wenn wir wollten, könnten wir 21 · 2−BS in Regel A durch einen größere Winkel 21 ·
2−BS + 2/∆ ersetzen. Dann würde man beim post processing die Winkel entfernen,
deren Wert weniger als /∆ + 3 · 2−BS beträgt. Dies würde sicherstellen, daß alle Winkel
messbar größer als /∆ sind, dafür der Gesamtfehler auf 4 + 36µ ansteigt.
4.4 Zusammenfassung des Algorithmus
1. Extrahiere aus einer Menge von Punkten, die 4 monotonen Sequenzen, die eine
Hülle zu der Menge bilden.
2. Extrahiere jeweils aus den monotonen Sequenzen eine Spine
3. Entferne die letzte reflexen Winkel aus den Spines und füge diese zu einer 36µ-Hülle
zusammen.
4. Führe das forward trimming aus.
5. Führe das backward trimming aus.
18
6. Das Ergebnis ist eine -strenge konvexe 54µ-Hülle.
5 Schlußwort
Was haben wir nun erreicht? Wir haben hier einen Algorithmus für die Berechnung einer
konvexen Hülle, der uns in quasi optimaler Zeit O(n log n) (schneller geht es aufgrund des
Sortierens nicht) eine Hülle berechnet, die auf jeden Fall konvex ist, bei der man sogar
die gewünschte Konvexität vorher festlegen kann, denn ein -streng konvexes Polygon
hat die Eigenschaft, daß alle Innenwinkel kleiner als π − /∆ sind. Ist man mit einer
12 + 54µ-Hülle zufrieden, so reichen (B + 6)-Bit zur Berechnung aus gegenübern den
typischen (2B+1)-Bit bei exakter Arithmetik.
Nach [1]] zeigte eine empirische Studie, daß der typische Fehler des exakten Algorithmus
eher bei als bei 12 liegt, als Beispiel dazu dienen die Abbildungen 8 und 9 mit = 0.5
und = 1. Für den robusten Algorithmus wird erwartet, daß der typische Fehler deutlich
kleiner als 54µ ist.
Strong Convex Hull with 9 Points
Initial Convex Hull with 274 Points
80
y-axis
60
40
20
0
0
20
40
60
x-axis
-streng konvexes Polygon mit = 0.5
19
80
100
Strong Convex Hull with 6 Points
Initial Convex Hull with 274 Points
80
y-axis
60
40
20
0
0
20
40
60
80
100
x-axis
-streng konvexes Polygon mit = 1
Literatur
[1] Zehnyu Li und Victor Milenkovic, Constructing Strongly Convex Hulls Using Exact
Or Rounded Arithmetic, 1992
[2] Minsick Park, Chang-Woo Park, Mignon Park und Chang-Hoon Lee, Algorithm for
detecting human faces based on convex-hull,
http://www.opticsexpress.org/view file.cfm?doc=%23)%5CO(%0A&id=
%24(%2CO-KP%20%20%0A
[3] H. W. Lang, Graham Scan, 2003,
http://www.iti.fh-flensburg.de/lang/algorithmen/geo/graham.htm
[4] Eugene Fink und Derick Wood, Planar Strong Visibility,
http://www.cs.ust.hk/tcsc/RR/2003-03.ps.gz
[5] John Fisher, John Lowther and Ching-Kuang Shene, If You Know B-Splines Well,
You Also Know NURBS!,
http://db.grinnell.edu/sigcse/sigcse2004/viewAcceptedSession.asp?
sessionType=Paper&sessionNumber=66
20
[6] Geometry Lab, Arbeitsgruppe Prof. Dr. R. Klein, Die Minkowski-Summe zweier
beliebiger Polygone
http://www.geometrylab.de/MinkowskiSum/
21