#include #include #include #include #include #include #include #include #include #include #include #include #include constexpr int N = 1000; template void test_no_cover(const Mesh& mesh) { std::cout << "Test WITHOUT cover" << std::endl; using GT = typename CGAL::GetGeomTraits::type; using FT = typename GT::FT; using Point = typename GT::Point_3; using Ray_3 = typename GT::Ray_3; using Line_3 = typename GT::Line_3; using Primitive = CGAL::AABB_face_graph_triangle_primitive; using Traits = CGAL::AABB_traits_3; using Tree = CGAL::AABB_tree; // Build Tree tree(faces(mesh).first, faces(mesh).second, mesh); std::cout << faces(mesh).size() << " input faces and " << tree.size() << " primitives" << std::endl; // Usage std::cout << "Traverse..." << std::endl; CGAL::Random r; // = CGAL::Random(1337); CGAL::Random_points_in_cube_3 > g(1., r); std::vector points; points.reserve(N); std::copy_n(g, N, std::back_inserter(points)); CGAL::Real_timer timer; timer.start(); for(int i=0; i void test_cover(const Mesh& mesh, const NamedParameters& np) { std::cout << "Test WITH cover" << std::endl; constexpr bool check_with_standard_tree = true; using VPM = typename CGAL::GetVertexPointMap::const_type; using GT = typename CGAL::GetGeomTraits::type; using FT = typename GT::FT; using Point = typename boost::property_traits::value_type; using Ray_3 = typename GT::Ray_3; using Line_3 = typename GT::Line_3; using Triangle_3 = typename GT::Triangle_3; using AABB_tree = CGAL::AABB_trees::internal::AABB_covered_triangle_tree; using FG_Primitive = CGAL::AABB_face_graph_triangle_primitive; using FG_Traits = CGAL::AABB_traits_3; using FG_Tree = CGAL::AABB_tree; CGAL::Bbox_3 bbox = CGAL::Polygon_mesh_processing::bbox(mesh); const double diag_length = std::sqrt(CGAL::square(bbox.xmax() - bbox.xmin()) + CGAL::square(bbox.ymax() - bbox.ymin()) + CGAL::square(bbox.zmax() - bbox.zmin())); // Build ----------------------------------------------------------------------------------------- using CGAL::parameters::get_parameter; using CGAL::parameters::choose_parameter; VPM vpm = choose_parameter(get_parameter(np, CGAL::internal_np::vertex_point), get_const_property_map(CGAL::vertex_point, mesh)); GT gt = choose_parameter(get_parameter(np, CGAL::internal_np::geom_traits)); AABB_tree tree(diag_length / 100.); tree.reserve(num_faces(mesh)); for(auto f : faces(mesh)) { if(CGAL::Polygon_mesh_processing::is_degenerate_triangle_face(f, mesh, np)) continue; const Point& p0 = get(vpm, target(halfedge(f, mesh), mesh)); const Point& p1 = get(vpm, target(next(halfedge(f, mesh), mesh), mesh)); const Point& p2 = get(vpm, source(halfedge(f, mesh), mesh)); const Triangle_3 tr = gt.construct_triangle_3_object()(p0, p1, p2); tree.split_and_insert(tr); } std::cout << faces(mesh).size() << " input faces and " << tree.size() << " primitives" << std::endl; FG_Tree fg_tree(faces(mesh).first, faces(mesh).second, mesh); // Usage ----------------------------------------------------------------------------------------- std::cout << "Traverse..." << std::endl; CGAL::Random r; // = CGAL::Random(1337); CGAL::Random_points_in_cube_3 > g(1., r); std::vector points; points.reserve(N); std::copy_n(g, N, std::back_inserter(points)); using AABB_traits = typename AABB_tree::AABB_traits; using AABB_traversal_traits = CGAL::AABB_trees::internal::Covered_tree_traversal_traits; using Do_intersect_traits = typename AABB_traversal_traits::template Do_intersect_traits; using First_intersection_traits = typename AABB_traversal_traits::template First_intersection_traits; using Projection_traits = typename AABB_traversal_traits::Projection_traits; using size_type = typename AABB_tree::size_type; using Primitive_id = typename AABB_tree::Primitive_id; using Counting_iterator = CGAL::internal::AABB_tree::Counting_output_iterator; using Listing_primitive_traits = typename AABB_traversal_traits::template Listing_primitive_traits; CGAL::Real_timer timer; timer.start(); for(int i=0; ifirst == fg_inter_res->first); } } for(int i=0; i 0); if(check_with_standard_tree) { typename FG_Tree::size_type fg_counter = 0; CGAL::internal::AABB_tree::Counting_output_iterator fg_out(&fg_counter); fg_tree.all_intersected_primitives(query, fg_out); assert(counter == fg_counter); } } timer.stop(); std::cout << "Elapsed: " << timer.time() << " s." << std::endl; } template void test(const char* filename) { std::cout << " === Test Kernel " << typeid(K).name() << " === " << std::endl; using Point_3 = typename K::Point_3; using Mesh = CGAL::Surface_mesh; Mesh mesh; if(!CGAL::IO::read_polygon_mesh(filename, mesh) || !is_triangle_mesh(mesh)) { std::cerr << "Error: invalid input" << std::endl; return; } test_no_cover(mesh); test_cover(mesh, CGAL::parameters::default_values()); } int main(int, char**) { std::cout.precision(17); std::cerr.precision(17); test("data/bunny00.off"); test("data/bunny00.off"); }