Algorithmische Geometrie Thema: Konvexe Hüllen Christoph Hermes [email protected] 17. Juni 2003 Ausblick auf den Vortrag • Was sind konvexe Hüllen? Wozu braucht man sie? • Wie kann man sie berechnen → gibt es Algorithmen? ? naiver Algorithmus: Einwickeln ? Graham Scan ? Quickhull • Wie kann man die Laufzeit verbessern? → innere Elimination • Fazit/ Demonstration 1/32 1 Was sind konvexe Hüllen? • mathematisch: definiert als das kleinste Polygon, dass alle Punkte enthält 2/32 2 Was sind konvexe Hüllen? • mathematisch: definiert als das kleinste Polygon, dass alle Punkte enthält • analog: kürzester Pfad, der alle Punkte umschließt 2/32 2 Was sind konvexe Hüllen? 2/32 • mathematisch: definiert als das kleinste Polygon, dass alle Punkte enthält • analog: kürzester Pfad, der alle Punkte umschließt • oder auch: Jede Linie, die zwei Punkte dieser Punktmenge verbindet, muss innerhalb des Polygons liegen 2 Wozu braucht man sie? • Datamining 3/32 3 Wozu braucht man sie? • Datamining • Computergraphik - Näherung für Objektgeometrie 3/32 3 Wozu braucht man sie? • Datamining • Computergraphik - Näherung für Objektgeometrie • Pathfinding 3/32 3 Einwickeln - graphisch • gegeben: Punktmenge P 4/32 4 Einwickeln - graphisch • gegeben: Punktmenge P • Suche den Punkt mit y = min 5/32 5 Einwickeln - graphisch • gegeben: Punktmenge P • Suche den Punkt mit y = min • Finde den kleinsten Winkel von der Horizontalen ausgehend 5/32 5 Einwickeln - graphisch • gegeben: Punktmenge P • Suche den Punkt mit y = min • Finde den kleinsten Winkel von der Horizontalen ausgehend • Suche den kleinsten Winkel zum nächsten Punkt 6/32 6 Einwickeln - graphisch • gegeben: Punktmenge P • Suche den Punkt mit y = min • Finde den kleinsten Winkel von der Horizontalen ausgehend • Suche den kleinsten Winkel zum nächsten Punkt • Fahre so lange fort, bis der Anfangspunkt wieder erreicht ist 7/32 7 Einwickeln - Bewertung 8/32 • Vorteil: Algorithmus lässt sich auch auf höhere Dimensionen erweitern 8 Einwickeln - Bewertung 8/32 • Vorteil: Algorithmus lässt sich auch auf höhere Dimensionen erweitern • Nachteil: Effizienz leidet erheblich NP −1 N 2−N Laufzeit: (N − i) = 2 ⇒ Θ(N 2) i=1 Das ist auch gleichzeitig Worst Case: O(N 2) 8 Einwickeln - Bewertung 8/32 • Vorteil: Algorithmus lässt sich auch auf höhere Dimensionen erweitern • Nachteil: Effizienz leidet erheblich NP −1 N 2−N Laufzeit: (N − i) = 2 ⇒ Θ(N 2) i=1 Das ist auch gleichzeitig Worst Case: O(N 2) • Es geht auch besser: Graham Scan (von R.L. Graham, 1972) 8 GrahamScan - graphisch • wieder gegeben: Punktmenge P mit A als Minimum und Pivot (A.y = min ∨ A.x = max) 9/32 9 GrahamScan - graphisch • wieder gegeben: Punktmenge P mit A als Minimum und Pivot (A.y = min ∨ A.x = max) • erzeuge ein einfaches Polygon 10/32 10 GrahamScan - graphisch • wieder gegeben: Punktmenge P mit A als Minimum und Pivot (A.y = min ∨ A.x = max) • erzeuge ein einfaches Polygon • A und B stehen schon als Teil der konvexen Hülle fest Beginne daher, ein Polygon ABC zu konstruieren 10/32 10 GrahamScan - graphisch • erzeuge eine neues Teilpolygon mit dem nächsten Punkt → hier D 11/32 11 GrahamScan - graphisch • erzeuge eine neues Teilpolygon mit dem nächsten Punkt → hier D • backtracking: Eliminiere Punkte, bei denen die Hülle einen Knick nach rechts macht 12/32 12 GrahamScan - graphisch • erzeuge eine neues Teilpolygon mit dem nächsten Punkt → hier D • backtracking: Eliminiere Punkte, bei denen die Hülle einen Knick nach rechts macht • wiederhole nun die letzten beiden Schritte so lange, bis das einfache Polygon abgearbeitet ist. Hier im Schnelldurchlauf. 12/32 12 GrahamScan - graphisch • erzeuge eine neues Teilpolygon mit dem nächsten Punkt → hier D • backtracking: Eliminiere Punkte, bei denen die Hülle einen Knick nach rechts macht • wiederhole nun die letzten beiden Schritte so lange, bis das einfache Polygon abgearbeitet ist. Hier im Schnelldurchlauf. 13/32 13 GrahamScan - graphisch • erzeuge eine neues Teilpolygon mit dem nächsten Punkt → hier D • backtracking: Eliminiere Punkte, bei denen die Hülle einen Knick nach rechts macht • wiederhole nun die letzten beiden Schritte so lange, bis das einfache Polygon abgearbeitet ist. Hier im Schnelldurchlauf. 14/32 14 GrahamScan - graphisch • erzeuge eine neues Teilpolygon mit dem nächsten Punkt → hier D • backtracking: Eliminiere Punkte, bei denen die Hülle einen Knick nach rechts macht • wiederhole nun die letzten beiden Schritte so lange, bis das einfache Polygon abgearbeitet ist. Hier im Schnelldurchlauf. 15/32 15 GrahamScan - graphisch • erzeuge eine neues Teilpolygon mit dem nächsten Punkt → hier D • backtracking: Eliminiere Punkte, bei denen die Hülle einen Knick nach rechts macht • wiederhole nun die letzten beiden Schritte so lange, bis das einfache Polygon abgearbeitet ist. Hier im Schnelldurchlauf. 16/32 16 GrahamScan - graphisch • erzeuge eine neues Teilpolygon mit dem nächsten Punkt → hier D • backtracking: Eliminiere Punkte, bei denen die Hülle einen Knick nach rechts macht • wiederhole nun die letzten beiden Schritte so lange, bis das einfache Polygon abgearbeitet ist. Hier im Schnelldurchlauf. 17/32 17 GrahamScan - Pseudocode PointList GrahamScan(PointList ptLst) { ptLst = createSimplePolygon(ptLst); 18/32 // Erstelle ein einfaches Polygon 18 GrahamScan - Pseudocode 18/32 PointList GrahamScan(PointList ptLst) { ptLst = createSimplePolygon(ptLst); // Erstelle ein einfaches Polygon Point cur; for (int i=2; i<ptLst.len; i++) { // Durchlaufe Polygon mit Backtracking cur = ptLst[i-1]; while(turnRight(cur.Prev,cur,cur.Next)) { cur = cur.Prev; cur.Next.delete(); } } } 18 GrahamScan - Bewertung • eigentlicher Algorithmus läuft in linearer Zeit ab ⇒ Θ(N ) 19/32 19 GrahamScan - Bewertung • eigentlicher Algorithmus läuft in linearer Zeit ab ⇒ Θ(N ) • aber: das Sortieren erfordert Θ(N log N ) darum gesamt Θ(N log N ) 19/32 19 GrahamScan - Bewertung 19/32 • eigentlicher Algorithmus läuft in linearer Zeit ab ⇒ Θ(N ) • aber: das Sortieren erfordert Θ(N log N ) darum gesamt Θ(N log N ) • ein anderes Verfahren in der gleichen Effizienzklasse: Quickhull (analog zu Quicksort) 19 Quickhull - graphisch • Gegeben: Punktmenge P 20/32 20 Quickhull - graphisch • Gegeben: Punktmenge P • Suche zwei Punkte, die garantiert auf der konvexen Hülle liegen und teile die Punkte dementsprechend in zwei Hälften 21/32 21 Quickhull - graphisch • Gegeben: Punktmenge P • Suche zwei Punkte, die garantiert auf der konvexen Hülle liegen und teile die Punkte dementsprechend in zwei Hälften • Finde den Punkt mit dem größten Abstand von der Teilungslinie und elimiere Punkte innerhalb des neuen Polygons 22/32 22 Quickhull - graphisch 23/32 • Gegeben: Punktmenge P • Suche zwei Punkte, die garantiert auf der konvexen Hülle liegen und teile die Punkte dementsprechend in zwei Hälften • Finde den Punkt mit dem größten Abstand von der Teilungslinie und elimiere Punkte innerhalb des neuen Polygons • Verfahre genauso mit den neuen Grenzen bis keine neuen Punkte mehr zu finden sind 23 Quickhull - graphisch 24/32 • Gegeben: Punktmenge P • Suche zwei Punkte, die garantiert auf der konvexen Hülle liegen und teile die Punkte dementsprechend in zwei Hälften • Finde den Punkt mit dem größten Abstand von der Teilungslinie und elimiere Punkte innerhalb des neuen Polygons • Verfahre genauso mit den neuen Grenzen bis keine neuen Punkte mehr zu finden sind 24 Quickhull - graphisch 25/32 • Gegeben: Punktmenge P • Suche zwei Punkte, die garantiert auf der konvexen Hülle liegen und teile die Punkte dementsprechend in zwei Hälften • Finde den Punkt mit dem größten Abstand von der Teilungslinie und elimiere Punkte innerhalb des neuen Polygons • Verfahre genauso mit den neuen Grenzen bis keine neuen Punkte mehr zu finden sind 25 Quickhull - graphisch 26/32 • Gegeben: Punktmenge P • Suche zwei Punkte, die garantiert auf der konvexen Hülle liegen und teile die Punkte dementsprechend in zwei Hälften • Finde den Punkt mit dem größten Abstand von der Teilungslinie und elimiere Punkte innerhalb des neuen Polygons • Verfahre genauso mit den neuen Grenzen bis keine neuen Punkte mehr zu finden sind 26 Quickhull - graphisch 27/32 • Gegeben: Punktmenge P • Suche zwei Punkte, die garantiert auf der konvexen Hülle liegen und teile die Punkte dementsprechend in zwei Hälften • Finde den Punkt mit dem größten Abstand von der Teilungslinie und elimiere Punkte innerhalb des neuen Polygons • Verfahre genauso mit den neuen Grenzen bis keine neuen Punkte mehr zu finden sind und verbinde den Rest zu einem Polygon 27 Quickhull - Bewertung • Effizienz wie bei Quicksort: Θ(N log N ) 28/32 28 Quickhull - Bewertung 28/32 • Effizienz wie bei Quicksort: Θ(N log N ) aber mit Worst Case: O(N 2) (wenn alle Punkte auf der konvexen Hülle liegen) 28 Quickhull - Bewertung 28/32 • Effizienz wie bei Quicksort: Θ(N log N ) aber mit Worst Case: O(N 2) (wenn alle Punkte auf der konvexen Hülle liegen) • Im direkten Vergleich zum GrahamScan und WrapAlgorithmus das schnellste Verfahren in der praktischen Anwendung 28 Quickhull - Bewertung 28/32 • Effizienz wie bei Quicksort: Θ(N log N ) aber mit Worst Case: O(N 2) (wenn alle Punkte auf der konvexen Hülle liegen) • Im direkten Vergleich zum GrahamScan und WrapAlgorithmus das schnellste Verfahren in der praktischen Anwendung • lässt sich auch auf die dritte Dimension anwenden 28 innere Elimination 29/32 • Verbesserung des GrahamScan´s und der naiven Hülle? Sicherlich kann man an den Konstanten ein wenig ”rütteln”, aber was ist mit der Anzahl der Punkte an sich? 29 innere Elimination 29/32 • Verbesserung des GrahamScan´s und der naiven Hülle? Sicherlich kann man an den Konstanten ein wenig ”rütteln”, aber was ist mit der Anzahl der Punkte an sich? • Lösung: Vorberechung mit der ”inneren Elimination” 29 innere Elimination - Verfahren gegeben: Punktmenge P 30/32 30 innere Elimination - Verfahren → gegeben: Punktmenge P Suche vier Extrempunkte und bilde daraus ein rechteckähnliches Polygon 30/32 30 innere Elimination - Verfahren → gegeben: Punktmenge P 30/32 → Suche vier Extrempunkte und bilde daraus ein rechteckähnliches Polygon Bilde in dem Polygon ein Rechteck und eliminiere die darin enthaltene Punkte 30 innere Elimination - Bewertung • Effizienz: Θ(N ) 31/32 31 innere Elimination - Bewertung • Effizienz: Θ(N ) √ • Es bleiben N Punkte im Schnitt übrig (lt. stochastischer Geometrie) 31/32 31 innere Elimination - Bewertung • Effizienz: Θ(N ) √ • Es bleiben N Punkte im Schnitt übrig (lt. stochastischer Geometrie) • Eliminationsverfahren schon in Quickhull enthalten 31/32 31 Fazit 32/32 • Welchen der bisher dargestellten Algorithmen sollte man nun bevorzugen? 32 Fazit 32/32 • Welchen der bisher dargestellten Algorithmen sollte man nun bevorzugen? • Ist die Wahrscheinlichkeit groß, dass Punkte schon auf einer konvexen Hülle liegen: innere Elimination + GrahamScan 32 Fazit 32/32 • Welchen der bisher dargestellten Algorithmen sollte man nun bevorzugen? • Ist die Wahrscheinlichkeit groß, dass Punkte schon auf einer konvexen Hülle liegen: innere Elimination + GrahamScan • sonst: Quickhull 32 Fazit 32/32 • Welchen der bisher dargestellten Algorithmen sollte man nun bevorzugen? • Ist die Wahrscheinlichkeit groß, dass Punkte schon auf einer konvexen Hülle liegen: innere Elimination + GrahamScan • sonst: Quickhull ⇒ Und das Beste zum Schluss: Die Demonstration 32 Literatur zum Nachschlagen • R. Sedgewick: Algorithmen in C, Kap. 24/25 • Java-Applets: I http://www.cs.princeton.edu/ ah/ alg anim/version1/GrahamScan.html I http://www.pms.informatik.uni-muenchen.de/ lehre/compgeometry/Gosper/convex hull/ applet/convex hull applet.html • Ansonsten hilft meistens googlen :)