Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Konkrete Beispiele Bernhard Kornberger.

Ähnliche Präsentationen


Präsentation zum Thema: "Konkrete Beispiele Bernhard Kornberger."—  Präsentation transkript:

1 Konkrete Beispiele Bernhard Kornberger

2 Überblick Installation Konkrete Beispiele
Tipps zu Installation und Inbetriebnahme Konkrete Beispiele Konvexe Hülle berechnen Verschiedene Algorithmen Fehler in der numerischen Genauigkeit Beispielprogramm Ursachen und Lösungen

3 Installation und Inbetriebnahme
Download Entpacken nach /opt/ tar fxvz CGAL tar.gz Installations-Doku installation.pdf (27seitig) Starten der Installation ./install_cgal –i

4

5

6

7

8 2 1 3

9 Installation und Inbetriebnahme
Beispielprogramme sind vorhanden in /opt/CGAL/examples ...Beispiele ohne qt /opt/CGAL/demo ...Beispiele mit qt Compilieren mit: cd /opt/CGAL/examples/einBeispiel/ Variable CGAL_MAKEFILE setzen (WICHTIG) make

10 Algorithmen zur Berechnung konvexer Hüllen im 2D

11 Programm zur Berechnung der konvexen Hülle einer Punktemenge (verkürzte Version)
typedef CGAL::Point_2<CGAL::Cartesian<double>> Point; int main() { std::vector<Point> out, randomPoints; // Vektor mit zufälligen 2D Punkten im Einheitskreis CGAL::Random_points_in_disc_2<Point> g(1); for(int count=0; count<300000; count++) randomPoints.push_back(*g++); // Punkte der konvexen Hülle berechnen und im Vektor ‚out‘ speichern CGAL::ch_jarvis( randomPoints.begin(), (randomPoints.end()), std::back_inserter(out) ); // Ausgabe std::vector<Point>::const_iterator it=out.begin(); for(;it!=out.end();++it) cout << it<<endl; return 0; }

12 ...und das soll jetzt compiliert werden
/opt/CGAL-3.0.1/scripts/create_makefile ...dieses Skript baut für alle *.c und *.cpp-Files im Directory ein Makefile Variable CGAL_MAKEFILE setzen oder direkt ins Makefile eintragen: export CGAL_MAKEFILE=/opt/CGAL-3.0.1/make/makefile_i686_Linux mdk_g „make“ aufrufen, fertig.

13 Verschiedene Algorithmen zur Berechnung konvexer Hüllen im 2D
Die Algorithmen weisen unterschiedliche Laufzeiten für n Punkte mit h Extrempunkten auf: ch_akl_toussaint: O(n log n) ch_graham_andrew: O(n log n) ch_bykat: O(n h) ch_jarvis: O(n h) ch_eddy: O(n h)

14 Algorithmus: ch_eddy

15 Algorithmus: ch_akl_toussaint

16 Algorithmus: ch_bykat

17 Algorithmus: ch_graham_andrew

18 Algorithmus: ch_jarvis

19 Laufzeitvergleich (CPU: XP1700)
ch_jarvis O(n h) ch_eddy O(n h) ch_graham_andrew O(n log n)

20 Laufzeitvergleich (CPU: XP1700)

21 Robustheit und Rechengenauigkeit

22 Robustheit und Rechengenauigkeit
Die Typen int, float und double von C++ können ihre mathematischen Gegenstücke nur grob annähern Integer können überlaufen floats und double‘s produzieren Rundungsfehler Gerade Algorithmen für Geometrie können sehr empfindlich auf solche Fehler reagieren, wie das folgende Beispiel zeigt...

23 Programmbeispiel zur begrenzten Rechengenauigkeit
int main(){ std::vector<Point> convHullOut; std::vector<Point> inputPoints; // Zwei Segmente, die sich ueberschneiden Segment seg1( Point(0,0), Point(900,1000)); Segment seg2( Point(0,1000), Point(1000,0)); // Endpunkte des ersten Segments -> Vektor inputPoints.push_back(Point(0,0)); inputPoints.push_back(Point(900,1000)); // Den Schnittpunkt in den Vektor speichern CGAL::Object result = CGAL::intersection( seg1,seg2 ); Point pt; if (CGAL::assign( pt, result ) ) inputPoints.push_back(pt); // Errechnen der konvexen Huelle CGAL::ch_eddy( inputPoints.begin(), (inputPoints.end()), std::back_inserter(convHullOut) ); // Ausgabe der konvexen Huelle std::cout << "Die Punkte der konvexen Huelle lauten:\n"; for(;it!=convHullOut.end();++it) std::cout <<*it<<endl; return 0; }

24 Programmbeispiel zur begrenzten Rechengenauigkeit

25 Ursachen und Lösungen Im vorigen Programmbeispiel wurde typedef CGAL::Point_2<CGAL::Cartesian<double>> Point; verwendet. Die Rechengenauigkeit von ‚double‘ hat nicht ausgereicht.

26 LEDA – exakte Datentypen Integers of Arbitrary Length
Integers beliebiger Länge „integer“ Führen immer zu exakten Ergebnissen Kein Overflow/Underflow Verwendung wie und mit den eingebauten Typen Vordefinierte arithmetische Operationen wie Quadratwurzel, GCD, etc. Aber mal langsamer als ‚double‘

27 LEDA – exakte Datentypen Rational Numbers
Rationale Zahlen „rational“ Führen immer zu exakten Ergebnissen Implementiert als Quotient zweier Integer beliebiger Länge und mit deren Eigenschaften Kann wie ‚double‘ gemeinsam mit den eingebauten Datentypen verwendet werden. Aber mal langsamer als ‚double‘

28 LEDA – exakte Datentypen Typ „Rational“ - Beispiel
#include <LEDA/rational.h> #include <LEDA/integer.h> using namespace leda; int main() { integer denominator=1; int i; for (i=1;i<=40;i++) {denominator*=i;} // Nenner = (40!) rational r(1000,denominator); // Rationale Zahl r=( 1000 / (40!) ) cout << "r=" << r << endl; // Einige Operationen mit r: r.normalize(); cout << "After r.normalize(): r=" << r << endl; r.invert(); cout << "\nAfter r.invert(): r=" << r << endl; cout << "\nsqr(r)=" << sqr(r) << endl; cout << "\nceil(r)=" << ceil(r) << endl; return 0; }

29 LEDA – exakte Datentypen Real Numbers
Algebraic Real Numbers „real“ Führen zu exakten Ergebnissen Können wie und gemeinsam mit ‚doubles‘ verwendet werden Arithmetische Operationen wie die k-te Wurzel sind vordefiniert Nachteile: Speicherbedarf steigt linear mit der Größe der Berechnung – alle Operationen werden gespeichert. 10-80 mal langsamer als ‚double‘ Empfohlen für Berechnungen der k-ten Wurzel, sonst besser Big Floatingpoint Numbers

30 LEDA – Typ mit Rundung Big Floatingpoint Numbers
Big Floatingpoint Numbers „bigfloat“ Im Gegensatz zu den vorigen Typen ist „bigfloat“ ein Datentyp mit Rundung und führt nicht zu mathematisch exakten Ergebnissen Aber im Gegensatz zu „double“ kann „bigfloat“ mit beliebiger Genauigkeit arbeiten. Nachteile von „bigfloat“ mal langsamer als double, abhängig vom Rundungstyp Kompliziert in der Anwendung

31 LEDA - Weitere Typen Floating Point Filter Intervall Arithmetik
Schnell (nur noch 4 mal langsamer als double) Berechnet Fehlergrenzen und wenn das Resultat nicht eindeutig ist, kann man immer noch den langsameren exakten Typ verwenden. Intervall Arithmetik Vektoren und Matrizen ...aber diese Typen werden nicht direkt von CGAL unterstützt, das ist daher Stoff des LEDA-Vortrages.


Herunterladen ppt "Konkrete Beispiele Bernhard Kornberger."

Ähnliche Präsentationen


Google-Anzeigen