diff --git a/AABB_tree/benchmark/AABB_tree/test.cpp b/AABB_tree/benchmark/AABB_tree/test.cpp index ef73cc00348..beff8c25fcd 100644 --- a/AABB_tree/benchmark/AABB_tree/test.cpp +++ b/AABB_tree/benchmark/AABB_tree/test.cpp @@ -86,7 +86,7 @@ void test_no_collision(int k, const char* fname, int main(int argc, const char** argv) { - int k = atoi(argv[1]); + int k = (argc>1) ? atoi(argv[1]) : 10; const char* path = (argc>2)?argv[2]:"data/handle" ".off"; std::cout<< k<<" steps in "< +#include +#include -#include +namespace CGAL{ +template +class AABB_transformed_traits + :public AABB_transformed_traits_base +{}; -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -/// \file AABB_transformed_traits.h - -namespace CGAL { -// forward declaration -template< typename AABBTraits> -class AABB_tree; -/// \addtogroup PkgAABB_tree -/// @{ - -/// \tparam BaseTraits a model of `CGAL::AABBTraits` -/// -/// \sa `AABBTraits` -/// \sa `AABB_tree` -/// \sa `AABBPrimitive` -/// \sa `AABBPrimitiveWithSharedData` - - template -class AABB_transformed_traits: - public BaseTraits +template +class AABB_transformed_traits + :public AABB_transformed_traits_base { -public: - - //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; - typedef typename BaseTraits::Primitive Primitive; - typedef typename BaseTraits::Bounding_box Bounding_box; - typedef typename BaseTraits::Point_and_primitive_id Point_and_primitive_id; - typedef typename BaseTraits::Object_and_primitive_id Object_and_primitive_id; - template - struct Intersection_and_primitive_id { - typedef typename BaseTraits::template Intersection_and_primitive_id::Intersection_type Intersection_type; - - typedef typename BaseTraits::template Intersection_and_primitive_id::Type Type; - }; + typedef typename Kernel::Exact_kernel EK; + typedef typename Kernel::Approximate_kernel FK; + typedef typename Kernel::C2E C2E; + typedef typename Kernel::C2F C2F; - //SearchGeomTriats_3 concept types - typedef typename BaseTraits::Iso_cuboid_3 Iso_cuboid_3; - typedef typename BaseTraits::Sphere_3 Sphere_3; - typedef typename BaseTraits::Construct_iso_cuboid_3 Construct_iso_cuboid_3; - typedef typename BaseTraits::Construct_min_vertex_3 Construct_min_vertex_3; - typedef typename BaseTraits::Construct_max_vertex_3 Construct_max_vertex_3; - typedef typename BaseTraits::Construct_center_3 Construct_center_3; - typedef typename BaseTraits::Compute_squared_radius_3 Compute_squared_radius_3; - typedef typename BaseTraits::Cartesian_const_iterator_3 Cartesian_const_iterator_3; - typedef typename BaseTraits::Construct_cartesian_const_iterator_3 Construct_cartesian_const_iterator_3; + typedef Filtered_predicate::Split_primitives, + typename AABB_transformed_traits_base::Split_primitives, + C2E,C2F> Split_primitives; - //Splitting - typedef typename BaseTraits::Split_primitives Split_primitives; + typedef Filtered_predicate::Compute_bbox, + typename AABB_transformed_traits_base::Compute_bbox, + C2E,C2F> Compute_bbox; - typedef typename BaseTraits::Compute_bbox Compute_bbox; + typedef Filtered_predicate::Do_intersect, + typename AABB_transformed_traits_base::Do_intersect, + C2E,C2F> Do_intersect; - //Intersections - 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)); - } - - // intersection with AABB-tree - template - bool operator()(const CGAL::AABB_tree& other_tree, const Primitive& pr) const - { - return other_tree.do_intersect( internal::Primitive_helper::get_datum(pr,m_traits)); - } - - template - bool operator()(const CGAL::AABB_tree& other_tree, 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())); - return other_tree.do_intersect(transfo_box); - } - }; + typedef Filtered_predicate::Intersection, + typename AABB_transformed_traits_base::Intersection, + C2E,C2F> Intersection; - typedef typename BaseTraits::Intersection Intersection; + typedef Filtered_predicate::Compare_distance, + typename AABB_transformed_traits_base::Compare_distance, + C2E,C2F> Compare_distance; - //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 Filtered_predicate::Closest_point, + typename AABB_transformed_traits_base::Closest_point, + C2E,C2F> Closest_point; - //Operations - Split_primitives split_primitives_object() const { - return BaseTraits::split_primitives_object(); - } + typedef Filtered_predicate::Squared_distance, + typename AABB_transformed_traits_base::Squared_distance, + C2E,C2F> Squared_distance; - Compute_bbox compute_bbox_object() const{ - return BaseTraits::compute_bbox_object(); - } - Do_intersect do_intersect_object() const{ - return Do_intersect(*this); - } + typedef Filtered_predicate::Equal_3, + typename AABB_transformed_traits_base::Equal_3, + C2E,C2F> Equal_3; - Intersection intersection_object() const{ - return BaseTraits::intersection_object(); - } - - Compare_distance compare_distance_object() const{ - return BaseTraits::compare_distance_object(); - } - Closest_point closest_point_object() const{ - return BaseTraits::closest_point_object(); - } - Squared_distance squared_distance_object() const{ - return BaseTraits::squared_distance_object(); - } - 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; - }; - - -} // end namespace CGAL - -#include +}//end CGAL #endif // CGAL_AABB_TRANSFORMED_TRAITS_H diff --git a/AABB_tree/include/CGAL/AABB_transformed_traits_base.h b/AABB_tree/include/CGAL/AABB_transformed_traits_base.h new file mode 100644 index 00000000000..1749f625d91 --- /dev/null +++ b/AABB_tree/include/CGAL/AABB_transformed_traits_base.h @@ -0,0 +1,202 @@ + +// Copyright (c) 2018 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// You can redistribute it and/or modify it under the terms of the GNU +// General Public License as published by the Free Software Foundation, +// either version 3 of the License, or (at your option) any later version. +// +// Licensees holding a valid commercial license may use this file in +// accordance with the commercial license agreement provided with the software. +// +// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0+ +// +// +// Author(s) : Maxime Gimeno +// + +#ifndef CGAL_AABB_TRANSFORMED_TRAITS_BASE_H +#define CGAL_AABB_TRANSFORMED_TRAITS_BASE_H + +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +/// \file AABB_transformed_traits_base.h + +namespace CGAL { +// forward declaration +template< typename AABBTraits> +class AABB_tree; +/// \addtogroup PkgAABB_tree +/// @{ + +/// \tparam BaseTraits a model of `CGAL::AABBTraits` +/// +/// \sa `AABBTraits` +/// \sa `AABB_tree` +/// \sa `AABBPrimitive` +/// \sa `AABBPrimitiveWithSharedData` + + template +class AABB_transformed_traits_base: + public BaseTraits +{ +public: + + //Constructor + AABB_transformed_traits_base(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; + typedef typename BaseTraits::Primitive Primitive; + typedef typename BaseTraits::Bounding_box Bounding_box; + typedef typename BaseTraits::Point_and_primitive_id Point_and_primitive_id; + typedef typename BaseTraits::Object_and_primitive_id Object_and_primitive_id; + template + struct Intersection_and_primitive_id { + typedef typename BaseTraits::template Intersection_and_primitive_id::Intersection_type Intersection_type; + + typedef typename BaseTraits::template Intersection_and_primitive_id::Type Type; + }; + + //SearchGeomTriats_3 concept types + typedef typename BaseTraits::Iso_cuboid_3 Iso_cuboid_3; + typedef typename BaseTraits::Sphere_3 Sphere_3; + typedef typename BaseTraits::Construct_iso_cuboid_3 Construct_iso_cuboid_3; + typedef typename BaseTraits::Construct_min_vertex_3 Construct_min_vertex_3; + typedef typename BaseTraits::Construct_max_vertex_3 Construct_max_vertex_3; + typedef typename BaseTraits::Construct_center_3 Construct_center_3; + typedef typename BaseTraits::Compute_squared_radius_3 Compute_squared_radius_3; + typedef typename BaseTraits::Cartesian_const_iterator_3 Cartesian_const_iterator_3; + 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; + + //Intersections + class Do_intersect { + const AABB_transformed_traits_base& m_traits; + public: + Do_intersect(const AABB_transformed_traits_base& 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)); + } + + // intersection with AABB-tree + template + bool operator()(const CGAL::AABB_tree& other_tree, const Primitive& pr) const + { + return other_tree.do_intersect( internal::Primitive_helper::get_datum(pr,m_traits)); + } + + template + bool operator()(const CGAL::AABB_tree& other_tree, 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())); + return other_tree.do_intersect(transfo_box); + } + }; + + 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 ; + + //Operations + Split_primitives split_primitives_object() const { + return BaseTraits::split_primitives_object(); + } + + Compute_bbox compute_bbox_object() const{ + return BaseTraits::compute_bbox_object(); + } + Do_intersect do_intersect_object() const{ + return Do_intersect(*this); + } + + Intersection intersection_object() const{ + return BaseTraits::intersection_object(); + } + + Compare_distance compare_distance_object() const{ + return BaseTraits::compare_distance_object(); + } + Closest_point closest_point_object() const{ + return BaseTraits::closest_point_object(); + } + Squared_distance squared_distance_object() const{ + return BaseTraits::squared_distance_object(); + } + 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; + +}; + + +} // end namespace CGAL + +#include + +#endif // CGAL_AABB_TRANSFORMED_TRAITS_BASE_H