diff --git a/Spatial_sorting/examples/Spatial_sorting/hilbert_sort_on_sphere.cpp b/Spatial_sorting/examples/Spatial_sorting/hilbert_sort_on_sphere.cpp index 3849215161b..79b5f6e429b 100644 --- a/Spatial_sorting/examples/Spatial_sorting/hilbert_sort_on_sphere.cpp +++ b/Spatial_sorting/examples/Spatial_sorting/hilbert_sort_on_sphere.cpp @@ -40,7 +40,8 @@ int main () CGAL::Random_points_on_sphere_3 given_sphere(2.0, random); // generate points for (int i = 0; i < size; ++i) v.push_back(*given_sphere++ + trans); - CGAL::hilbert_sort_on_sphere(v.begin(), v.end(), sphere); // sort + CGAL::hilbert_sort_on_sphere(v.begin(), v.end(), // sort + sphere.squared_radius(), sphere.center()); for(std::size_t i=0; i given_sphere(2.0, random); // generate points for (int i = 0; i < size; ++i) v.push_back(*given_sphere++ + trans); - CGAL::spatial_sort_on_sphere(v.begin(), v.end(), sphere); // sort + CGAL::spatial_sort_on_sphere(v.begin(), v.end(), // sort + sphere.squared_radius(), sphere.center()); for(std::size_t i=0; i class Hilbert_sort_on_sphere_3 { - typedef typename K::Sphere_3 Sphere_3; typedef typename K::Point_3 Point_3; - typedef typename K::FT FT; static const double _sqrt_of_one_over_three = 0.57735026919; @@ -57,13 +55,15 @@ class Hilbert_sort_on_sphere_3 { Hilbert_sort_2 _hs_5_object; Hilbert_sort_2 _hs_6_object; K _k; - Sphere_3 _s; + Point_3 _p; + double _sq_r; public: Hilbert_sort_on_sphere_3 (const K &k=K(), - const Sphere_3 &s = Sphere_3(Point_3(FT(0),FT(0),FT(0)),FT(1)), + double sq_r = 1.0, + const Point_3 &p = Point_3(0,0,0), std::ptrdiff_t limit=1) - : _k(k), _s(s), + : _k(k), _p(p), _sq_r(sq_r), _hs_1_object(Face_1_traits_3(),limit), _hs_2_object(Face_2_traits_3(),limit), _hs_3_object(Face_3_traits_3(),limit), @@ -77,11 +77,10 @@ public: typedef typename std::iterator_traits::value_type Point; std::vector< Point > vec[6]; - const FT mulcte = FT(_sqrt_of_one_over_three) * - FT(CGAL_NTS sqrt(CGAL_NTS to_double(_s.squared_radius()))); - const FT lxi = _s.center().x() - mulcte, lxs = _s.center().x() + mulcte; - const FT lyi = _s.center().y() - mulcte, lys = _s.center().y() + mulcte; - const FT lzs = _s.center().z() + mulcte; + const double mulcte = _sqrt_of_one_over_three * CGAL_NTS sqrt(_sq_r); + const double lxi = _p.x() - mulcte, lxs = _p.x() + mulcte; + const double lyi = _p.y() - mulcte, lys = _p.y() + mulcte; + const double lzs = _p.z() + mulcte; for(RandomAccessIterator i = begin; i != end; ++i) { const Point &p = *i; diff --git a/Spatial_sorting/include/CGAL/hilbert_sort.h b/Spatial_sorting/include/CGAL/hilbert_sort.h index a008fd8b421..59d53c1df36 100644 --- a/Spatial_sorting/include/CGAL/hilbert_sort.h +++ b/Spatial_sorting/include/CGAL/hilbert_sort.h @@ -84,12 +84,13 @@ namespace internal { const Kernel &k, Policy, typename Kernel::Point_3 *, - const typename Kernel::Sphere_3 &s) + double sq_r, + const typename Kernel::Point_3 &p) { boost::rand48 random; boost::random_number_generator rng(random); std::random_shuffle(begin,end, rng); - (Hilbert_sort_on_sphere_3 (k,s))(begin, end); + (Hilbert_sort_on_sphere_3 (k,sq_r,p))(begin, end); } } @@ -162,13 +163,9 @@ void hilbert_sort (RandomAccessIterator begin, RandomAccessIterator end, template void hilbert_sort_on_sphere (RandomAccessIterator begin, RandomAccessIterator end, - const typename CGAL::Kernel_traits::value_type>::Kernel::Sphere_3 &s = - typename CGAL::Kernel_traits::value_type>::Kernel::Sphere_3( - typename CGAL::Kernel_traits::value_type>::Kernel::Point_3( - typename CGAL::Kernel_traits::value_type>::Kernel::FT(0), - typename CGAL::Kernel_traits::value_type>::Kernel::FT(0), - typename CGAL::Kernel_traits::value_type>::Kernel::FT(0) - ), typename CGAL::Kernel_traits::value_type>::Kernel::FT(1))) + double sq_r = 1.0, + const typename CGAL::Kernel_traits::value_type>::Kernel::Point_3 &p = + typename CGAL::Kernel_traits::value_type>::Kernel::Point_3(0,0,0)) { typedef std::iterator_traits ITraits; @@ -177,30 +174,26 @@ void hilbert_sort_on_sphere (RandomAccessIterator begin, RandomAccessIterator en typedef typename KTraits::Kernel Kernel; internal::hilbert_sort_on_sphere(begin, end, Kernel(), Hilbert_sort_median_policy(), - static_cast (0), s); + static_cast (0), sq_r, p); } template void hilbert_sort_on_sphere (RandomAccessIterator begin, RandomAccessIterator end, - const typename Kernel::Sphere_3 &s, const Kernel &k) + const typename Kernel::Point_3 &p, double sq_r, const Kernel &k) { typedef std::iterator_traits ITraits; typedef typename ITraits::value_type value_type; internal::hilbert_sort_on_sphere(begin, end, k, Hilbert_sort_median_policy(), - static_cast (0), s); + static_cast (0), sq_r, p); } template void hilbert_sort_on_sphere (RandomAccessIterator begin, RandomAccessIterator end, Hilbert_sort_median_policy policy, - const typename CGAL::Kernel_traits::value_type>::Kernel::Sphere_3 &s = - typename CGAL::Kernel_traits::value_type>::Kernel::Sphere_3( - typename CGAL::Kernel_traits::value_type>::Kernel::Point_3( - typename CGAL::Kernel_traits::value_type>::Kernel::FT(0), - typename CGAL::Kernel_traits::value_type>::Kernel::FT(0), - typename CGAL::Kernel_traits::value_type>::Kernel::FT(0) - ), typename CGAL::Kernel_traits::value_type>::Kernel::FT(1))) + double sq_r = 1.0, + const typename CGAL::Kernel_traits::value_type>::Kernel::Point_3 &p = + typename CGAL::Kernel_traits::value_type>::Kernel::Point_3(0,0,0)) { typedef std::iterator_traits ITraits; typedef typename ITraits::value_type value_type; @@ -208,19 +201,15 @@ void hilbert_sort_on_sphere (RandomAccessIterator begin, RandomAccessIterator en typedef typename KTraits::Kernel Kernel; internal::hilbert_sort_on_sphere(begin, end, Kernel(), policy, - static_cast (0), s); + static_cast (0), sq_r, p); } template void hilbert_sort_on_sphere (RandomAccessIterator begin, RandomAccessIterator end, Hilbert_sort_middle_policy policy, - const typename CGAL::Kernel_traits::value_type>::Kernel::Sphere_3 &s = - typename CGAL::Kernel_traits::value_type>::Kernel::Sphere_3( - typename CGAL::Kernel_traits::value_type>::Kernel::Point_3( - typename CGAL::Kernel_traits::value_type>::Kernel::FT(0), - typename CGAL::Kernel_traits::value_type>::Kernel::FT(0), - typename CGAL::Kernel_traits::value_type>::Kernel::FT(0) - ), typename CGAL::Kernel_traits::value_type>::Kernel::FT(1))) + double sq_r = 1.0, + const typename CGAL::Kernel_traits::value_type>::Kernel::Point_3 &p = + typename CGAL::Kernel_traits::value_type>::Kernel::Point_3(0,0,0)) { typedef std::iterator_traits ITraits; typedef typename ITraits::value_type value_type; @@ -228,21 +217,19 @@ void hilbert_sort_on_sphere (RandomAccessIterator begin, RandomAccessIterator en typedef typename KTraits::Kernel Kernel; internal::hilbert_sort_on_sphere(begin, end, Kernel(), policy, - static_cast (0), s); + static_cast (0), sq_r, p); } template void hilbert_sort_on_sphere (RandomAccessIterator begin, RandomAccessIterator end, const Kernel &k, Policy policy, - const typename Kernel::Sphere_3 &s = typename Kernel::Sphere_3( - typename Kernel::Point_3(typename Kernel::FT(0), typename Kernel::FT(0), typename Kernel::FT(0)), - typename Kernel::FT(1))) + double sq_r = 1.0, const typename Kernel::Point_3 &p = typename Kernel::Point_3(0,0,0)) { typedef std::iterator_traits ITraits; typedef typename ITraits::value_type value_type; internal::hilbert_sort_on_sphere(begin, end, - k, policy, static_cast (0), s); + k, policy, static_cast (0), sq_r, p); } } // namespace CGAL diff --git a/Spatial_sorting/include/CGAL/spatial_sort.h b/Spatial_sorting/include/CGAL/spatial_sort.h index 50c900ce700..83d2d7052e8 100644 --- a/Spatial_sorting/include/CGAL/spatial_sort.h +++ b/Spatial_sorting/include/CGAL/spatial_sort.h @@ -91,7 +91,8 @@ namespace internal { std::ptrdiff_t threshold_hilbert, std::ptrdiff_t threshold_multiscale, double ratio, - const typename Kernel::Sphere_3 &s) + double sq_r, + const typename Kernel::Point_3 &p) { typedef Hilbert_sort_on_sphere_3 Sort; boost::rand48 random; @@ -102,7 +103,7 @@ namespace internal { if (threshold_multiscale==0) threshold_multiscale=16; if (ratio==0.0) ratio=0.25; - (Multiscale_sort (Sort (k, s, threshold_hilbert), + (Multiscale_sort (Sort (k, sq_r, p, threshold_hilbert), threshold_multiscale, ratio)) (begin, end); } @@ -212,15 +213,14 @@ void spatial_sort_on_sphere (RandomAccessIterator begin, RandomAccessIterator en std::ptrdiff_t threshold_hilbert=0, std::ptrdiff_t threshold_multiscale=0, double ratio=0.0, - const typename Kernel::Sphere_3 &s = typename Kernel::Sphere_3( - typename Kernel::Point_3(typename Kernel::FT(0), typename Kernel::FT(0), typename Kernel::FT(0)), - typename Kernel::FT(1))) + double sq_r=1.0, + const typename Kernel::Point_3 &p = typename Kernel::Point_3(0,0,0)) { typedef std::iterator_traits ITraits; typedef typename ITraits::value_type value_type; internal::spatial_sort_on_sphere(begin, end, k, policy, static_cast (0), - threshold_hilbert,threshold_multiscale,ratio,s); + threshold_hilbert,threshold_multiscale,ratio,sq_r,p); } template @@ -229,13 +229,9 @@ void spatial_sort_on_sphere (RandomAccessIterator begin, RandomAccessIterator en std::ptrdiff_t threshold_hilbert=0, std::ptrdiff_t threshold_multiscale=0, double ratio=0.0, - const typename CGAL::Kernel_traits::value_type>::Kernel::Sphere_3 &s = - typename CGAL::Kernel_traits::value_type>::Kernel::Sphere_3( - typename CGAL::Kernel_traits::value_type>::Kernel::Point_3( - typename CGAL::Kernel_traits::value_type>::Kernel::FT(0), - typename CGAL::Kernel_traits::value_type>::Kernel::FT(0), - typename CGAL::Kernel_traits::value_type>::Kernel::FT(0) - ), typename CGAL::Kernel_traits::value_type>::Kernel::FT(1))) + double sq_r=1.0, + const typename CGAL::Kernel_traits::value_type>::Kernel::Point_3 &p = + typename CGAL::Kernel_traits::value_type>::Kernel::Point_3(0,0,0)) { typedef std::iterator_traits ITraits; typedef typename ITraits::value_type value_type; @@ -243,7 +239,7 @@ void spatial_sort_on_sphere (RandomAccessIterator begin, RandomAccessIterator en typedef typename KTraits::Kernel Kernel; spatial_sort_on_sphere (begin, end, Kernel(), policy, - threshold_hilbert,threshold_multiscale,ratio,s); + threshold_hilbert,threshold_multiscale,ratio,sq_r,p); } template void spatial_sort_on_sphere (RandomAccessIterator begin, RandomAccessIterator end, @@ -251,13 +247,9 @@ void spatial_sort_on_sphere (RandomAccessIterator begin, RandomAccessIterator en std::ptrdiff_t threshold_hilbert=0, std::ptrdiff_t threshold_multiscale=0, double ratio=0.0, - const typename CGAL::Kernel_traits::value_type>::Kernel::Sphere_3 &s = - typename CGAL::Kernel_traits::value_type>::Kernel::Sphere_3( - typename CGAL::Kernel_traits::value_type>::Kernel::Point_3( - typename CGAL::Kernel_traits::value_type>::Kernel::FT(0), - typename CGAL::Kernel_traits::value_type>::Kernel::FT(0), - typename CGAL::Kernel_traits::value_type>::Kernel::FT(0) - ), typename CGAL::Kernel_traits::value_type>::Kernel::FT(1))) + double sq_r=1.0, + const typename CGAL::Kernel_traits::value_type>::Kernel::Point_3 &p = + typename CGAL::Kernel_traits::value_type>::Kernel::Point_3(0,0,0)) { typedef std::iterator_traits ITraits; typedef typename ITraits::value_type value_type; @@ -265,13 +257,14 @@ void spatial_sort_on_sphere (RandomAccessIterator begin, RandomAccessIterator en typedef typename KTraits::Kernel Kernel; spatial_sort_on_sphere (begin, end, Kernel(), policy, - threshold_hilbert,threshold_multiscale,ratio,s); + threshold_hilbert,threshold_multiscale,ratio,sq_r,p); } template void spatial_sort_on_sphere (RandomAccessIterator begin, RandomAccessIterator end, - const typename Kernel::Sphere_3 &s, + double sq_r, + const typename Kernel::Point_3 &p, const Kernel &k, std::ptrdiff_t threshold_hilbert=0, std::ptrdiff_t threshold_multiscale=0, @@ -279,25 +272,21 @@ void spatial_sort_on_sphere (RandomAccessIterator begin, RandomAccessIterator en { spatial_sort_on_sphere (begin, end, k, Hilbert_sort_median_policy(), - threshold_hilbert,threshold_multiscale,ratio,s); + threshold_hilbert,threshold_multiscale,ratio,sq_r,p); } template void spatial_sort_on_sphere (RandomAccessIterator begin, RandomAccessIterator end, - const typename CGAL::Kernel_traits::value_type>::Kernel::Sphere_3 &s = - typename CGAL::Kernel_traits::value_type>::Kernel::Sphere_3( - typename CGAL::Kernel_traits::value_type>::Kernel::Point_3( - typename CGAL::Kernel_traits::value_type>::Kernel::FT(0), - typename CGAL::Kernel_traits::value_type>::Kernel::FT(0), - typename CGAL::Kernel_traits::value_type>::Kernel::FT(0) - ), typename CGAL::Kernel_traits::value_type>::Kernel::FT(1)), + double sq_r = 1.0, + const typename CGAL::Kernel_traits::value_type>::Kernel::Point_3 &p = + typename CGAL::Kernel_traits::value_type>::Kernel::Point_3(0,0,0), std::ptrdiff_t threshold_hilbert=0, std::ptrdiff_t threshold_multiscale=0, double ratio=0.0) { spatial_sort_on_sphere (begin, end, Hilbert_sort_median_policy(), - threshold_hilbert,threshold_multiscale,ratio,s); + threshold_hilbert,threshold_multiscale,ratio,sq_r,p); } diff --git a/Spatial_sorting/test/Spatial_sorting/test_hilbert.cpp b/Spatial_sorting/test/Spatial_sorting/test_hilbert.cpp index f82aa9f96b3..a09531095b6 100644 --- a/Spatial_sorting/test/Spatial_sorting/test_hilbert.cpp +++ b/Spatial_sorting/test/Spatial_sorting/test_hilbert.cpp @@ -23,7 +23,6 @@ typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef K::Point_2 Point_2; typedef K::Point_3 Point_3; typedef K::Vector_3 Vector_3; -typedef K::Sphere_3 Sphere_3; typedef CGAL::Creator_uniform_2 Creator_2; typedef CGAL::Creator_uniform_3 Creator_3; @@ -329,7 +328,7 @@ int main () std::cout << " Sorting points... " << std::flush; cost.reset();cost.start(); - CGAL::hilbert_sort_on_sphere(v.begin(),v.end(),Sphere_3(CGAL::ORIGIN + Vector_3(3,5,5),4)); + CGAL::hilbert_sort_on_sphere(v.begin(),v.end(), 4, CGAL::ORIGIN + Vector_3(3,5,5)); cost.stop(); std::cout << "done in "< Creator_2; typedef CGAL::Creator_uniform_3 Creator_3; @@ -143,7 +142,7 @@ int main () std::cout << " Sorting points... " << std::flush; - CGAL::spatial_sort_on_sphere (v.begin(), v.end(), Sphere_3(Point_3(10,10,3),9)); + CGAL::spatial_sort_on_sphere (v.begin(), v.end(), 9, Point_3(10,10,3)); std::cout << "done." << std::endl;