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