diff --git a/AABB_tree/demo/AABB_tree/AABB_demo.cpp b/AABB_tree/demo/AABB_tree/AABB_demo.cpp index 714dd22b4f5..0226617e35d 100644 --- a/AABB_tree/demo/AABB_tree/AABB_demo.cpp +++ b/AABB_tree/demo/AABB_tree/AABB_demo.cpp @@ -15,7 +15,7 @@ // $Id: $ // // -// Author(s) : Pierre Alliez +// Author(s) : Pierre Alliez, Camille Wormser // //****************************************************************************** // File Description : demo of AABB tree on polyhedral edge and facet primitives @@ -50,14 +50,14 @@ int main(int argc, char **argv) args.removeAt(0); } - Q_FOREACH(QString filename, args) { + Q_FOREACH(QString filename, args) mainWindow.open(filename); - } + return app.exec(); } # include "Scene.cpp" -# include "Scene_moc.cpp" +# include "benchmarks.cpp" # include "Viewer.cpp" # include "Viewer_moc.cpp" # include "MainWindow.cpp" diff --git a/AABB_tree/demo/AABB_tree/CMakeLists.txt b/AABB_tree/demo/AABB_tree/CMakeLists.txt index 89051f55496..763725e742f 100644 --- a/AABB_tree/demo/AABB_tree/CMakeLists.txt +++ b/AABB_tree/demo/AABB_tree/CMakeLists.txt @@ -55,8 +55,7 @@ if(CGAL_Qt4_FOUND AND QT4_FOUND AND OPENGL_FOUND AND QGLVIEWER_FOUND) qt4_add_resources ( RESOURCE_FILES AABB_demo.qrc ) add_file_dependencies( AABB_demo.cpp "${CMAKE_CURRENT_BINARY_DIR}/MainWindow_moc.cpp" - "${CMAKE_CURRENT_BINARY_DIR}/Scene_moc.cpp" - "${CMAKE_CURRENT_BINARY_DIR}/Viewer_moc.cpp" ) + "${CMAKE_CURRENT_BINARY_DIR}/Viewer_moc.cpp" ) add_executable ( AABB_demo AABB_demo.cpp ${UI_FILES} ${RESOURCE_FILES} ) # Link with Qt libraries diff --git a/AABB_tree/demo/AABB_tree/MainWindow.cpp b/AABB_tree/demo/AABB_tree/MainWindow.cpp index 3bf9872e67a..bf61ee18a26 100644 --- a/AABB_tree/demo/AABB_tree/MainWindow.cpp +++ b/AABB_tree/demo/AABB_tree/MainWindow.cpp @@ -250,6 +250,11 @@ void MainWindow::on_actionView_segments_triggered() m_pScene->toggle_view_segments(); } +void MainWindow::on_actionView_distance_function_triggered() +{ + m_pScene->toggle_view_distance_function(); +} + void MainWindow::on_actionClear_points_triggered() { m_pScene->clear_points(); @@ -259,3 +264,8 @@ void MainWindow::on_actionClear_segments_triggered() { m_pScene->clear_segments(); } + +void MainWindow::on_actionClear_distance_function_triggered() +{ + m_pScene->clear_distance_function(); +} diff --git a/AABB_tree/demo/AABB_tree/MainWindow.h b/AABB_tree/demo/AABB_tree/MainWindow.h index a0c8830c8e8..20e186d426e 100644 --- a/AABB_tree/demo/AABB_tree/MainWindow.h +++ b/AABB_tree/demo/AABB_tree/MainWindow.h @@ -24,7 +24,6 @@ public: public slots: void updateViewerBBox(); void open(QString filename); - void setAddKeyFrameKeyboardModifiers(Qt::KeyboardModifiers); protected slots: @@ -34,41 +33,39 @@ public: void readSettings(); void writeSettings(); - // load + // drag & drop + void dropEvent(QDropEvent *event); + void closeEvent(QCloseEvent *event); + void dragEnterEvent(QDragEnterEvent *event); + + // file menu void on_actionLoadPolyhedron_triggered(); - // view options - void on_actionView_polyhedron_triggered(); - void on_actionView_points_triggered(); - void on_actionView_segments_triggered(); + // edit menu + void on_actionClear_points_triggered(); + void on_actionClear_segments_triggered(); + void on_actionClear_distance_function_triggered(); - // algorithms + // algorithm menu + void on_actionEdge_points_triggered(); void on_actionInside_points_triggered(); void on_actionBoundary_points_triggered(); void on_actionBoundary_segments_triggered(); - void on_actionEdge_points_triggered(); - - // distance functions void on_actionSigned_distance_function_to_facets_triggered(); void on_actionUnsigned_distance_function_to_edges_triggered(); void on_actionUnsigned_distance_function_to_facets_triggered(); - // benchmarks + // benchmark menu void on_actionBench_distances_triggered(); void on_actionBench_intersections_triggered(); - // edit - void on_actionClear_points_triggered(); - void on_actionClear_segments_triggered(); - - // drag & drop - void dragEnterEvent(QDragEnterEvent *event); - void dropEvent(QDropEvent *event); - void closeEvent(QCloseEvent *event); + // view menu + void on_actionView_points_triggered(); + void on_actionView_segments_triggered(); + void on_actionView_polyhedron_triggered(); + void on_actionView_distance_function_triggered(); private: - QString strippedName(const QString &fullFileName); - Scene* m_pScene; Viewer* m_pViewer; Ui::MainWindow* ui; diff --git a/AABB_tree/demo/AABB_tree/MainWindow.ui b/AABB_tree/demo/AABB_tree/MainWindow.ui index 929049996dd..440ad3c66bd 100644 --- a/AABB_tree/demo/AABB_tree/MainWindow.ui +++ b/AABB_tree/demo/AABB_tree/MainWindow.ui @@ -16,6 +16,9 @@ :/cgal/icons/resources/cgal_logo.xpm:/cgal/icons/resources/cgal_logo.xpm + + + @@ -51,6 +54,7 @@ + @@ -78,6 +82,7 @@ + @@ -172,6 +177,16 @@ Intersections + + + Distance function + + + + + Clear distance function + + diff --git a/AABB_tree/demo/AABB_tree/Scene.cpp b/AABB_tree/demo/AABB_tree/Scene.cpp index 7209691fe8a..3ef4f9ebb20 100644 --- a/AABB_tree/demo/AABB_tree/Scene.cpp +++ b/AABB_tree/demo/AABB_tree/Scene.cpp @@ -6,13 +6,7 @@ #include #include #include -#include -#include -#include -#include -#include #include -#include #include #include "render_edges.h" @@ -26,13 +20,13 @@ Scene::Scene() m_view_points = true; m_view_segments = true; m_view_polyhedron = true; + m_view_distance_function = true; - // distance functions - m_max_distance_function = (FT)0.0; - m_signed_distance_function = false; - + // distance function m_red_ramp.build_red(); m_blue_ramp.build_blue(); + m_max_distance_function = (FT)0.0; + m_signed_distance_function = false; } Scene::~Scene() @@ -91,10 +85,13 @@ void Scene::draw() if(m_view_segments) draw_segments(); - if(m_signed_distance_function) - draw_signed_distance_function(); - else - draw_unsigned_distance_function(); + if(m_view_distance_function) + { + if(m_signed_distance_function) + draw_signed_distance_function(); + else + draw_unsigned_distance_function(); + } } void Scene::draw_polyhedron() @@ -267,6 +264,34 @@ Vector Scene::random_vector() return Vector(x,y,z); } +Ray Scene::random_ray() +{ + Point p = random_point(); + Point q = random_point(); + return Ray(p,q); +} + +Segment Scene::random_segment() +{ + Point p = random_point(); + Point q = random_point(); + return Segment(p,q); +} + +Line Scene::random_line() +{ + Point p = random_point(); + Point q = random_point(); + return Line(p,q); +} + +Plane Scene::random_plane() +{ + Point p = random_point(); + Vector vec = random_vector(); + return Plane(p,vec); +} + void Scene::generate_inside_points(const unsigned int nb_trials) { typedef CGAL::AABB_polyhedron_triangle_primitive Primitive; @@ -425,39 +450,6 @@ void Scene::generate_edge_points(const unsigned int nb_points) std::cout << nb_planes << " plane queries, " << time.elapsed() << " ms." << std::endl; } -void Scene::benchmark_distances() -{ - QTime time; - time.start(); - std::cout << "Construct AABB tree..."; - Facet_tree tree(m_pPolyhedron->facets_begin(),m_pPolyhedron->facets_end()); - tree.accelerate_distance_queries(); - std::cout << "done (" << time.elapsed() << " ms)" << std::endl; - - // TODO: check what the KD-tree is doing in there for large models. - std::cout << "One single call to initialize KD-tree" << std::endl; - tree.closest_point(CGAL::ORIGIN); - - std::cout << "------- Now, the real benchmark -------" << std::endl; - bench_closest_point(tree); - bench_squared_distance(tree); - bench_closest_point_and_primitive(tree); -} - -void Scene::benchmark_intersections() -{ - QTime time; - time.start(); - std::cout << "Construct AABB tree..."; - Facet_tree tree(m_pPolyhedron->facets_begin(),m_pPolyhedron->facets_end()); - std::cout << "done (" << time.elapsed() << " ms)" << std::endl; - - bench_do_intersect(tree); - bench_nb_intersections(tree); - bench_any_intersection(tree); - bench_all_intersections(tree); - bench_all_intersected_primitives(tree); -} void Scene::unsigned_distance_function() { @@ -556,376 +548,8 @@ unsigned_distance : m_max_distance_function; m_signed_distance_function = true; } -void Scene::bench_squared_distance(Facet_tree& tree) -{ - QTime time; - time.start(); - std::cout << "Benchmark squared distance" << std::endl; - - unsigned int nb = 0; - while(time.elapsed() < 1000) - { - Point query = random_point(); - tree.squared_distance(query); - nb++; - } - double speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s" << std::endl; -} -void Scene::bench_closest_point(Facet_tree& tree) -{ - QTime time; - time.start(); - std::cout << "Benchmark closest point" << std::endl; - - unsigned int nb = 0; - while(time.elapsed() < 1000) - { - Point query = random_point(); - tree.closest_point(query); - nb++; - } - double speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s" << std::endl; -} - -void Scene::bench_closest_point_and_primitive(Facet_tree& tree) -{ - QTime time; - time.start(); - std::cout << "Benchmark closest point and primitive" << std::endl; - - unsigned int nb = 0; - while(time.elapsed() < 1000) - { - Point query = random_point(); - tree.closest_point_and_primitive(query); - nb++; - } - double speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s" << std::endl; -} - - -void Scene::bench_all_intersected_primitives(Facet_tree& tree) -{ - std::list primitive_ids; - - QTime time; - time.start(); - std::cout << "Benchmark all_intersected_primitives" << std::endl; - - // with ray - unsigned int nb = 0; - while(time.elapsed() < 1000) - { - Point p = random_point(); - Point q = random_point(); - Ray ray(p,q); - tree.all_intersected_primitives(ray,std::back_inserter(primitive_ids)); - nb++; - } - double speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s with ray" << std::endl; - primitive_ids.clear(); - - // with line - nb = 0; - time.start(); - while(time.elapsed() < 1000) - { - Point p = random_point(); - Point q = random_point(); - Line line(p,q); - tree.all_intersected_primitives(line,std::back_inserter(primitive_ids)); - nb++; - } - speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s with line" << std::endl; - primitive_ids.clear(); - - // with segment - nb = 0; - time.start(); - while(time.elapsed() < 1000) - { - Point p = random_point(); - Point q = random_point(); - Segment segment(p,q); - tree.all_intersected_primitives(segment,std::back_inserter(primitive_ids)); - nb++; - } - speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s with segment" << std::endl; - - // with segment - nb = 0; - time.start(); - while(time.elapsed() < 1000) - { - Point p = random_point(); - Vector vec = random_vector(); - Plane plane(p,vec); - tree.all_intersected_primitives(plane,std::back_inserter(primitive_ids)); - nb++; - } - speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s with plane" << std::endl; -} - - -void Scene::bench_do_intersect(Facet_tree& tree) -{ - QTime time; - time.start(); - std::cout << "Benchmark do_intersect" << std::endl; - - // with ray - unsigned int nb = 0; - while(time.elapsed() < 1000) - { - Point p = random_point(); - Point q = random_point(); - Ray ray(p,q); - tree.do_intersect(ray); - nb++; - } - double speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s with ray" << std::endl; - - // with line - nb = 0; - time.start(); - while(time.elapsed() < 1000) - { - Point p = random_point(); - Point q = random_point(); - Line line(p,q); - tree.do_intersect(line); - nb++; - } - speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s with line" << std::endl; - - // with segment - nb = 0; - time.start(); - while(time.elapsed() < 1000) - { - Point p = random_point(); - Point q = random_point(); - Segment segment(p,q); - tree.do_intersect(segment); - nb++; - } - speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s with segment" << std::endl; - - // with plane - nb = 0; - time.start(); - while(time.elapsed() < 1000) - { - Point p = random_point(); - Vector vec = random_vector(); - Plane plane(p,vec); - tree.do_intersect(plane); - nb++; - } - speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s with plane" << std::endl; -} - -void Scene::bench_nb_intersections(Facet_tree& tree) -{ - QTime time; - time.start(); - std::cout << "Benchmark number_of_intersected_primitives" << std::endl; - - // with ray - unsigned int nb = 0; - while(time.elapsed() < 1000) - { - Point p = random_point(); - Point q = random_point(); - Ray ray(p,q); - tree.number_of_intersected_primitives(ray); - nb++; - } - double speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s with ray" << std::endl; - - // with line - nb = 0; - time.start(); - while(time.elapsed() < 1000) - { - Point p = random_point(); - Point q = random_point(); - Line line(p,q); - tree.number_of_intersected_primitives(line); - nb++; - } - speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s with line" << std::endl; - - // with segment - nb = 0; - time.start(); - while(time.elapsed() < 1000) - { - Point p = random_point(); - Point q = random_point(); - Segment segment(p,q); - tree.number_of_intersected_primitives(segment); - nb++; - } - speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s with segment" << std::endl; - - // with plane - nb = 0; - time.start(); - while(time.elapsed() < 1000) - { - Point p = random_point(); - Vector vec = random_vector(); - Plane plane(p,vec); - tree.number_of_intersected_primitives(plane); - nb++; - } - speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s with plane" << std::endl; -} - -void Scene::bench_any_intersection(Facet_tree& tree) -{ - QTime time; - time.start(); - std::cout << "Benchmark any_intersection" << std::endl; - - // with ray - unsigned int nb = 0; - while(time.elapsed() < 1000) - { - Point p = random_point(); - Point q = random_point(); - Ray ray(p,q); - tree.any_intersection(ray); - nb++; - } - double speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s with ray" << std::endl; - - // with line - nb = 0; - time.start(); - while(time.elapsed() < 1000) - { - Point p = random_point(); - Point q = random_point(); - Line line(p,q); - tree.any_intersection(line); - nb++; - } - speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s with line" << std::endl; - - // with segment - nb = 0; - time.start(); - while(time.elapsed() < 1000) - { - Point p = random_point(); - Point q = random_point(); - Segment segment(p,q); - tree.any_intersection(segment); - nb++; - } - speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s with segment" << std::endl; - - // with plane - nb = 0; - time.start(); - while(time.elapsed() < 1000) - { - Point p = random_point(); - Vector vec = random_vector(); - Plane plane(p,vec); - tree.any_intersection(plane); - nb++; - } - speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s with plane" << std::endl; -} - -void Scene::bench_all_intersections(Facet_tree& tree) -{ - std::list intersections; - - QTime time; - time.start(); - std::cout << "Benchmark all_intersections" << std::endl; - - // with ray - unsigned int nb = 0; - while(time.elapsed() < 1000) - { - Point p = random_point(); - Point q = random_point(); - Ray ray(p,q); - tree.all_intersections(ray,std::back_inserter(intersections)); - nb++; - } - double speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s with ray" << std::endl; - intersections.clear(); - - // with line - nb = 0; - time.start(); - while(time.elapsed() < 1000) - { - Point p = random_point(); - Point q = random_point(); - Line line(p,q); - tree.all_intersections(line,std::back_inserter(intersections)); - nb++; - } - speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s with line" << std::endl; - - // with segment - nb = 0; - time.start(); - while(time.elapsed() < 1000) - { - Point p = random_point(); - Point q = random_point(); - Segment segment(p,q); - tree.all_intersections(segment,std::back_inserter(intersections)); - nb++; - } - speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s with segment" << std::endl; - - // with plane - nb = 0; - time.start(); - while(time.elapsed() < 1000) - { - Point p = random_point(); - Vector vec = random_vector(); - Plane plane(p,vec); - tree.all_intersections(plane,std::back_inserter(intersections)); - nb++; - } - speed = 1000.0 * nb / time.elapsed(); - std::cout << speed << " queries/s with plane" << std::endl; -} void Scene::toggle_view_poyhedron() { @@ -942,4 +566,9 @@ void Scene::toggle_view_points() m_view_points = !m_view_points; } +void Scene::toggle_view_distance_function() +{ + m_view_distance_function = !m_view_distance_function; +} + diff --git a/AABB_tree/demo/AABB_tree/Scene.h b/AABB_tree/demo/AABB_tree/Scene.h index f89d6a285cd..f2675034e0a 100644 --- a/AABB_tree/demo/AABB_tree/Scene.h +++ b/AABB_tree/demo/AABB_tree/Scene.h @@ -16,94 +16,101 @@ class Scene { -public: - Scene(); - ~Scene(); - - Polyhedron* polyhedron() const; - - void draw(); - - typedef CGAL::Bbox_3 Bbox; - Bbox bbox() { return Bbox(); } - -public: - - // utility functions - Point random_point(); - Vector random_vector(); - - // file menu functions - int open(QString filename); - - // edit menus functions - void clear_points() { m_points.clear(); } - void clear_segments() { m_segments.clear(); } - - // benchmark menu functions - void benchmark_intersections(); - void benchmark_distances(); - - // algorithms - void generate_edge_points(const unsigned int nb_points); - void generate_inside_points(const unsigned int nb_trials); - void generate_boundary_points(const unsigned int nb_points); - void generate_boundary_segments(const unsigned int nb_slices); - - // distance functions - void signed_distance_function(); - void unsigned_distance_function(); - void unsigned_distance_function_to_edges(); - - // toggle view options - void toggle_view_points(); - void toggle_view_segments(); - void toggle_view_poyhedron(); - private: // member data - Polyhedron *m_pPolyhedron; - std::list m_points; - std::list m_segments; + Polyhedron *m_pPolyhedron; + std::list m_points; + std::list m_segments; - // distance functions (simple 2D arrays) - FT m_max_distance_function; - bool m_signed_distance_function; - typedef std::pair Point_distance; - Point_distance m_distance_function[100][100]; - Color_ramp m_thermal_ramp; - Color_ramp m_red_ramp; - Color_ramp m_blue_ramp; - - // view options - bool m_view_points; - bool m_view_segments; - bool m_view_polyhedron; + // distance functions (simple 2D arrays) + Color_ramp m_red_ramp; + Color_ramp m_blue_ramp; + Color_ramp m_thermal_ramp; + FT m_max_distance_function; + bool m_view_distance_function; + bool m_signed_distance_function; + typedef std::pair Point_distance; + Point_distance m_distance_function[100][100]; - // types - typedef CGAL::AABB_polyhedron_triangle_primitive Primitive; - typedef CGAL::AABB_traits Traits; - typedef CGAL::AABB_tree Facet_tree; - typedef Facet_tree::Object_and_primitive_id Object_and_primitive_id; - typedef Facet_tree::Primitive_id Primitive_id; +public: + Scene(); + ~Scene(); - // benchmarks - void bench_do_intersect(Facet_tree& tree); - void bench_closest_point(Facet_tree& tree); - void bench_squared_distance(Facet_tree& tree); - void bench_nb_intersections(Facet_tree& tree); - void bench_any_intersection(Facet_tree& tree); - void bench_all_intersections(Facet_tree& tree); - void bench_closest_point_and_primitive(Facet_tree& tree); - void bench_all_intersected_primitives(Facet_tree& tree); +public: + void draw(); + Polyhedron* polyhedron() const; - // drawing - void draw_points(); - void draw_segments(); - void draw_polyhedron(); - void draw_signed_distance_function(); - void draw_unsigned_distance_function(); + typedef CGAL::Bbox_3 Bbox; + Bbox bbox() { return Bbox(); } + +public: + + // utility functions + Ray random_ray(); + Line random_line(); + Point random_point(); + Plane random_plane(); + Vector random_vector(); + Segment random_segment(); + + // file menu + int open(QString filename); + + // edit menu + void clear_points() { m_points.clear(); } + void clear_segments() { m_segments.clear(); } + void clear_distance_function() { m_max_distance_function = 0.0; } + + // benchmarks + void benchmark_distances(); + void benchmark_intersections(); + + // algorithms + void generate_edge_points(const unsigned int nb_points); + void generate_inside_points(const unsigned int nb_trials); + void generate_boundary_points(const unsigned int nb_points); + void generate_boundary_segments(const unsigned int nb_slices); + + // distance functions + void signed_distance_function(); + void unsigned_distance_function(); + void unsigned_distance_function_to_edges(); + + // toggle view options + void toggle_view_points(); + void toggle_view_segments(); + void toggle_view_poyhedron(); + void toggle_view_distance_function(); + + // view options + bool m_view_points; + bool m_view_segments; + bool m_view_polyhedron; + + // types + typedef CGAL::AABB_polyhedron_triangle_primitive Primitive; + typedef CGAL::AABB_traits Traits; + typedef CGAL::AABB_tree Facet_tree; + typedef Facet_tree::Object_and_primitive_id Object_and_primitive_id; + typedef Facet_tree::Primitive_id Primitive_id; + + // benchmarks + void bench_do_intersect(Facet_tree& tree); + void bench_closest_point(Facet_tree& tree); + void bench_squared_distance(Facet_tree& tree); + void bench_nb_intersections(Facet_tree& tree); + void bench_any_intersection(Facet_tree& tree); + void bench_all_intersections(Facet_tree& tree); + void bench_closest_point_and_primitive(Facet_tree& tree); + void bench_all_intersected_primitives(Facet_tree& tree); + + // drawing + void draw_points(); + void draw_segments(); + void draw_polyhedron(); + void draw_signed_distance_function(); + void draw_unsigned_distance_function(); }; // end class Scene -#endif // SCENE_H +#endif // SCENE_H \ No newline at end of file diff --git a/AABB_tree/demo/AABB_tree/benchmarks.cpp b/AABB_tree/demo/AABB_tree/benchmarks.cpp new file mode 100644 index 00000000000..137a67d48a1 --- /dev/null +++ b/AABB_tree/demo/AABB_tree/benchmarks.cpp @@ -0,0 +1,377 @@ +#include "Scene.h" +#include + +void Scene::benchmark_intersections() +{ + QTime time; + time.start(); + std::cout << "Construct AABB tree..."; + Facet_tree tree(m_pPolyhedron->facets_begin(),m_pPolyhedron->facets_end()); + std::cout << "done (" << time.elapsed() << " ms)" << std::endl; + + bench_do_intersect(tree); + bench_nb_intersections(tree); + bench_any_intersection(tree); + bench_all_intersections(tree); + bench_all_intersected_primitives(tree); +} + +void Scene::benchmark_distances() +{ + QTime time; + time.start(); + std::cout << "Construct AABB tree..."; + Facet_tree tree(m_pPolyhedron->facets_begin(),m_pPolyhedron->facets_end()); + tree.accelerate_distance_queries(); + std::cout << "done (" << time.elapsed() << " ms)" << std::endl; + + // TODO: check what the KD-tree is doing in there for large models. + std::cout << "One single call to initialize KD-tree" << std::endl; + tree.closest_point(CGAL::ORIGIN); + + // benchmark + bench_closest_point(tree); + bench_squared_distance(tree); + bench_closest_point_and_primitive(tree); +} + +////////////////////////////////////////////////////////////// +// BENCH INTERSECTIONS +////////////////////////////////////////////////////////////// + +void Scene::bench_all_intersected_primitives(Facet_tree& tree) +{ + std::list primitive_ids; + + QTime time; + time.start(); + std::cout << "Benchmark all_intersected_primitives" << std::endl; + + // with ray + unsigned int nb = 0; + while(time.elapsed() < 1000) + { + Ray ray = random_ray(); + tree.all_intersected_primitives(ray,std::back_inserter(primitive_ids)); + nb++; + } + double speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s with ray" << std::endl; + primitive_ids.clear(); + + // with line + nb = 0; + time.start(); + while(time.elapsed() < 1000) + { + Line line = random_line(); + tree.all_intersected_primitives(line,std::back_inserter(primitive_ids)); + nb++; + } + speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s with line" << std::endl; + primitive_ids.clear(); + + // with segment + nb = 0; + time.start(); + while(time.elapsed() < 1000) + { + Segment segment = random_segment(); + tree.all_intersected_primitives(segment,std::back_inserter(primitive_ids)); + nb++; + } + speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s with segment" << std::endl; + + // with segment + nb = 0; + time.start(); + while(time.elapsed() < 1000) + { + Plane plane = random_plane(); + tree.all_intersected_primitives(plane,std::back_inserter(primitive_ids)); + nb++; + } + speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s with plane" << std::endl; +} + + +void Scene::bench_do_intersect(Facet_tree& tree) +{ + QTime time; + time.start(); + std::cout << "Benchmark do_intersect" << std::endl; + + // with ray + unsigned int nb = 0; + while(time.elapsed() < 1000) + { + Ray ray = random_ray(); + tree.do_intersect(ray); + nb++; + } + double speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s with ray" << std::endl; + + // with line + nb = 0; + time.start(); + while(time.elapsed() < 1000) + { + Line line = random_line(); + tree.do_intersect(line); + nb++; + } + speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s with line" << std::endl; + + // with segment + nb = 0; + time.start(); + while(time.elapsed() < 1000) + { + Segment segment = random_segment(); + tree.do_intersect(segment); + nb++; + } + speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s with segment" << std::endl; + + // with plane + nb = 0; + time.start(); + while(time.elapsed() < 1000) + { + Plane plane = random_plane(); + tree.do_intersect(plane); + nb++; + } + speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s with plane" << std::endl; +} + +void Scene::bench_nb_intersections(Facet_tree& tree) +{ + QTime time; + time.start(); + std::cout << "Benchmark number_of_intersected_primitives" << std::endl; + + // with ray + unsigned int nb = 0; + while(time.elapsed() < 1000) + { + Ray ray = random_ray(); + tree.number_of_intersected_primitives(ray); + nb++; + } + double speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s with ray" << std::endl; + + // with line + nb = 0; + time.start(); + while(time.elapsed() < 1000) + { + Line line = random_line(); + tree.number_of_intersected_primitives(line); + nb++; + } + speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s with line" << std::endl; + + // with segment + nb = 0; + time.start(); + while(time.elapsed() < 1000) + { + Segment segment = random_segment(); + tree.number_of_intersected_primitives(segment); + nb++; + } + speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s with segment" << std::endl; + + // with plane + nb = 0; + time.start(); + while(time.elapsed() < 1000) + { + Plane plane = random_plane(); + tree.number_of_intersected_primitives(plane); + nb++; + } + speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s with plane" << std::endl; +} + +void Scene::bench_any_intersection(Facet_tree& tree) +{ + QTime time; + time.start(); + std::cout << "Benchmark any_intersection" << std::endl; + + // with ray + unsigned int nb = 0; + while(time.elapsed() < 1000) + { + Ray ray = random_ray(); + tree.any_intersection(ray); + nb++; + } + double speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s with ray" << std::endl; + + // with line + nb = 0; + time.start(); + while(time.elapsed() < 1000) + { + Line line = random_line(); + tree.any_intersection(line); + nb++; + } + speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s with line" << std::endl; + + // with segment + nb = 0; + time.start(); + while(time.elapsed() < 1000) + { + Segment segment = random_segment(); + tree.any_intersection(segment); + nb++; + } + speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s with segment" << std::endl; + + // with plane + nb = 0; + time.start(); + while(time.elapsed() < 1000) + { + Plane plane = random_plane(); + tree.any_intersection(plane); + nb++; + } + speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s with plane" << std::endl; +} + +void Scene::bench_all_intersections(Facet_tree& tree) +{ + std::list intersections; + + QTime time; + time.start(); + std::cout << "Benchmark all_intersections" << std::endl; + + // with ray + unsigned int nb = 0; + while(time.elapsed() < 1000) + { + Ray ray = random_ray(); + tree.all_intersections(ray,std::back_inserter(intersections)); + nb++; + } + double speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s with ray" << std::endl; + intersections.clear(); + + // with line + nb = 0; + time.start(); + while(time.elapsed() < 1000) + { + Line line = random_line(); + tree.all_intersections(line,std::back_inserter(intersections)); + nb++; + } + speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s with line" << std::endl; + intersections.clear(); + + // with segment + nb = 0; + time.start(); + while(time.elapsed() < 1000) + { + Segment segment = random_segment(); + tree.all_intersections(segment,std::back_inserter(intersections)); + nb++; + } + speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s with segment" << std::endl; + intersections.clear(); + + // with plane + nb = 0; + time.start(); + while(time.elapsed() < 1000) + { + Plane plane = random_plane(); + tree.all_intersections(plane,std::back_inserter(intersections)); + nb++; + } + speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s with plane" << std::endl; +} + + +////////////////////////////////////////////////////////////// +// BENCH DISTANCES +////////////////////////////////////////////////////////////// + +void Scene::bench_squared_distance(Facet_tree& tree) +{ + QTime time; + time.start(); + std::cout << "Benchmark squared distance" << std::endl; + + unsigned int nb = 0; + while(time.elapsed() < 1000) + { + Point query = random_point(); + tree.squared_distance(query); + nb++; + } + double speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s" << std::endl; +} + + +void Scene::bench_closest_point(Facet_tree& tree) +{ + QTime time; + time.start(); + std::cout << "Benchmark closest point" << std::endl; + + unsigned int nb = 0; + while(time.elapsed() < 1000) + { + Point query = random_point(); + tree.closest_point(query); + nb++; + } + double speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s" << std::endl; +} + +void Scene::bench_closest_point_and_primitive(Facet_tree& tree) +{ + QTime time; + time.start(); + std::cout << "Benchmark closest point and primitive" << std::endl; + + unsigned int nb = 0; + while(time.elapsed() < 1000) + { + Point query = random_point(); + tree.closest_point_and_primitive(query); + nb++; + } + double speed = 1000.0 * nb / time.elapsed(); + std::cout << speed << " queries/s" << std::endl; +}