diff --git a/AABB_tree/include/CGAL/AABB_transformed_traits.h b/AABB_tree/include/CGAL/AABB_transformed_traits.h index b78aad44f54..20788e833d9 100644 --- a/AABB_tree/include/CGAL/AABB_transformed_traits.h +++ b/AABB_tree/include/CGAL/AABB_transformed_traits.h @@ -35,6 +35,7 @@ #include #include +#include #include #include @@ -52,14 +53,17 @@ namespace CGAL { /// \sa `AABBPrimitive` /// \sa `AABBPrimitiveWithSharedData` - template + template class AABB_transformed_traits: public BaseTraits { - typedef typename CGAL::Object Object; public: - typedef BaseTraits Geom_traits; + //Constructor + AABB_transformed_traits(const Aff_transformation_3& transf = Aff_transformation_3(IDENTITY)) + :m_transfo(transf) + {} // AABBTraits concept types typedef typename BaseTraits::FT FT; typedef typename BaseTraits::Point_3 Point_3; @@ -86,19 +90,45 @@ public: typedef typename BaseTraits::Construct_cartesian_const_iterator_3 Construct_cartesian_const_iterator_3; //Splitting - typedef typename BaseTraits::Split_primitives Split_primitives; - typedef typename BaseTraits::Compute_bbox Compute_bbox; + typedef typename BaseTraits::Split_primitives Split_primitives; + + typedef typename BaseTraits::Compute_bbox Compute_bbox; //Intersections - typedef typename BaseTraits::Do_intersect Do_intersect; - //typedef typename BaseTraits::Intersect Intersect; - typedef typename BaseTraits::Intersection Intersection; + class Do_intersect { + const AABB_transformed_traits& m_traits; + public: + Do_intersect(const AABB_transformed_traits& traits) + :m_traits(traits) {} + + template + bool operator()(const Query& q, const Bounding_box& bbox) const + { + Point_3 min(bbox.xmin(), bbox.ymin(), bbox.zmin()), + max(bbox.xmax(), bbox.ymax(), bbox.zmax()); + + min = m_traits.transformation().transform(min); + max = m_traits.transformation().transform(max); + Bounding_box transfo_box(to_double(min.x()), to_double(min.y()), to_double(min.z()), + to_double(max.x()), to_double(max.y()), to_double(max.z())); + bool res = CGAL::do_intersect(q, transfo_box); + return res; + } + + template + bool operator()(const Query& q, const Primitive& pr) const + { + return Kernel().do_intersect_3_object()(q, internal::Primitive_helper::get_datum(pr,m_traits).transform(m_traits.transformation())); + } + }; + + typedef typename BaseTraits::Intersection Intersection; //Distance Queries - typedef typename BaseTraits::Compare_distance Compare_distance; - typedef typename BaseTraits::Closest_point Closest_point ; - typedef typename BaseTraits::Squared_distance Squared_distance; - typedef typename BaseTraits::Equal_3 Equal_3 ; + typedef typename BaseTraits::Compare_distance Compare_distance; + typedef typename BaseTraits::Closest_point Closest_point ; + typedef typename BaseTraits::Squared_distance Squared_distance; + typedef typename BaseTraits::Equal_3 Equal_3 ; //Operations Split_primitives split_primitives_object() const { @@ -108,8 +138,8 @@ public: Compute_bbox compute_bbox_object() const{ return BaseTraits::compute_bbox_object(); } - Do_intersect do_intersect_3_object() const{ - return BaseTraits::do_intersect_3_object(); + Do_intersect do_intersect_object() const{ + return Do_intersect(*this); } Intersection intersection_object() const{ @@ -128,6 +158,18 @@ public: Equal_3 equal_3_object() const{ return BaseTraits::equal_3_object; } + + //Specific + void set_transformation(const Aff_transformation_3& trans) const + { + m_transfo = trans; + } + + const Aff_transformation_3& transformation() const { return m_transfo; } + +private: + mutable Aff_transformation_3 m_transfo; + }; diff --git a/AABB_tree/test/AABB_tree/aabb_any_all_benchmark.cpp b/AABB_tree/test/AABB_tree/aabb_any_all_benchmark.cpp index 5a14a58a893..394bce109b5 100644 --- a/AABB_tree/test/AABB_tree/aabb_any_all_benchmark.cpp +++ b/AABB_tree/test/AABB_tree/aabb_any_all_benchmark.cpp @@ -13,7 +13,6 @@ #include #include -#include #include #include @@ -71,8 +70,7 @@ boost::tuple test(const char* name) typedef CGAL::Polyhedron_3 Polyhedron; typedef CGAL::AABB_face_graph_triangle_primitive Primitive; - typedef CGAL::AABB_traits Base_Traits; - typedef CGAL::AABB_transformed_traits Traits; + typedef CGAL::AABB_traits Traits; typedef CGAL::AABB_tree Tree; std::ifstream ifs(name); diff --git a/AABB_tree/test/AABB_tree/aabb_test_transformed_traits.cpp b/AABB_tree/test/AABB_tree/aabb_test_transformed_traits.cpp new file mode 100644 index 00000000000..afbb9c28ba5 --- /dev/null +++ b/AABB_tree/test/AABB_tree/aabb_test_transformed_traits.cpp @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +typedef CGAL::Epick K; +typedef K::FT FT; +typedef K::Point_3 Point; +typedef K::Vector_3 Vector; +typedef K::Segment_3 Segment; +typedef K::Ray_3 Ray; +typedef CGAL::Polyhedron_3 Polyhedron; +typedef CGAL::AABB_face_graph_triangle_primitive Primitive; +typedef CGAL::AABB_traits Base_traits; +typedef CGAL::AABB_transformed_traits Traits; +typedef CGAL::AABB_tree Tree; +typedef Tree::Primitive_id Primitive_id; + +int main() +{ + typedef std::vector< Tree::Intersection_and_primitive_id::Type > IntersectionVector; + Polyhedron polyhedron; + std::ifstream in("data/bunny00.off"); + if(in) + in >> polyhedron; + else{ + std::cout << "error reading bunny" << std::endl; + return 1; + } + CGAL::Aff_transformation_3 transfo(CGAL::TRANSLATION, Vector(250,300,1)); + IntersectionVector all_intersections; + Tree tree(faces(polyhedron).first, faces(polyhedron).second, polyhedron); + tree.traits().set_transformation(transfo); + tree.build(); + tree.traits().set_transformation(CGAL::Aff_transformation_3(CGAL::IDENTITY)); + Point bunny_center = + CGAL::centroid(polyhedron.points_begin(), polyhedron.points_end()); + + Ray ray1(Point(0,0,-10),bunny_center); + tree.all_intersections(ray1, std::back_inserter(all_intersections)); + std::size_t nb_inter = all_intersections.size(); + std::cout<