From 78a07a0e69ae1a92922d5741bcff2e3a3bc3f5fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 8 Aug 2017 11:53:44 +0200 Subject: [PATCH 1/3] avoid redoing the same sort if the bounds does not change --- Spatial_sorting/include/CGAL/Hilbert_sort_middle_2.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Spatial_sorting/include/CGAL/Hilbert_sort_middle_2.h b/Spatial_sorting/include/CGAL/Hilbert_sort_middle_2.h index bc63fefcf2d..c1a1eb9f49c 100644 --- a/Spatial_sorting/include/CGAL/Hilbert_sort_middle_2.h +++ b/Spatial_sorting/include/CGAL/Hilbert_sort_middle_2.h @@ -116,10 +116,14 @@ public: RandomAccessIterator m3 = internal::fixed_hilbert_split (m2, m4, Cmp< y, !upy> (ymed,_k)); - sort (m0, m1, ymin, xmin, ymed, xmed); - sort (m1, m2, xmin, ymed, xmed, ymax); - sort (m2, m3, xmed, ymed, xmax, ymax); - sort (m3, m4, ymed, xmax, ymin, xmed); + if (m1!=m4) + sort (m0, m1, ymin, xmin, ymed, xmed); + if (m1!=m0 || m2!=m4) + sort (m1, m2, xmin, ymed, xmed, ymax); + if (m2!=m0 || m3!=m4) + sort (m2, m3, xmed, ymed, xmax, ymax); + if (m3!=m0) + sort (m3, m4, ymed, xmax, ymin, xmed); } template From 3f8448f280a4e19b0f9d31cdd97f8559d158dca2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 8 Aug 2017 12:12:29 +0200 Subject: [PATCH 2/3] avoid infinite loop in 3D and dD --- .../include/CGAL/Hilbert_sort_middle_3.h | 24 ++++++++++++------- .../include/CGAL/Hilbert_sort_middle_d.h | 12 ++++++---- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/Spatial_sorting/include/CGAL/Hilbert_sort_middle_3.h b/Spatial_sorting/include/CGAL/Hilbert_sort_middle_3.h index 01a5747b7f7..1d61a6890d1 100644 --- a/Spatial_sorting/include/CGAL/Hilbert_sort_middle_3.h +++ b/Spatial_sorting/include/CGAL/Hilbert_sort_middle_3.h @@ -141,14 +141,22 @@ public: internal::fixed_hilbert_split (m6, m8, Cmp< z, !upz> (zmed,_k)); - sort (m0, m1, zmin, xmin, ymin, zmed, xmed, ymed); - sort (m1, m2, ymin, zmed, xmin, ymed, zmax, xmed); - sort (m2, m3, ymed, zmed, xmin, ymax, zmax, xmed); - sort (m3, m4, xmin, ymax, zmed, xmed, ymed, zmin); - sort (m4, m5, xmed, ymax, zmed, xmax, ymed, zmin); - sort (m5, m6, ymax, zmed, xmax, ymed, zmax, xmed); - sort (m6, m7, ymed, zmed, xmax, ymin, zmax, xmed); - sort (m7, m8, zmed, xmax, ymin, zmin, xmed, ymed); + if (m1!=m8) + sort (m0, m1, zmin, xmin, ymin, zmed, xmed, ymed); + if (m1!=m0 || m2!=m8) + sort (m1, m2, ymin, zmed, xmin, ymed, zmax, xmed); + if (m2!=m0 || m3!=m8) + sort (m2, m3, ymed, zmed, xmin, ymax, zmax, xmed); + if (m3!=m0 || m4!=m8) + sort (m3, m4, xmin, ymax, zmed, xmed, ymed, zmin); + if (m4!=m0 || m5!=m8) + sort (m4, m5, xmed, ymax, zmed, xmax, ymed, zmin); + if (m5!=m0 || m6!=m8) + sort (m5, m6, ymax, zmed, xmax, ymed, zmax, xmed); + if (m6!=m0 || m7!=m8) + sort (m6, m7, ymed, zmed, xmax, ymin, zmax, xmed); + if (m7!=m0) + sort (m7, m8, zmed, xmax, ymin, zmin, xmed, ymed); } template diff --git a/Spatial_sorting/include/CGAL/Hilbert_sort_middle_d.h b/Spatial_sorting/include/CGAL/Hilbert_sort_middle_d.h index 4cd7b61e074..9f6dce7efe1 100644 --- a/Spatial_sorting/include/CGAL/Hilbert_sort_middle_d.h +++ b/Spatial_sorting/include/CGAL/Hilbert_sort_middle_d.h @@ -117,19 +117,22 @@ public: /////////////start recursive calls last_dir = (direction + _dimension -1) % _dimension; // first step is special - sort( places[0], places[1], start, last_dir,cmin,cmax); + if (places[1]!=end) + sort( places[0], places[1], start, last_dir,cmin,cmax); cmin[last_dir] = med[last_dir]; cmax[last_dir] = maxi[last_dir]; for(int i=1; i Date: Tue, 8 Aug 2017 15:20:42 +0200 Subject: [PATCH 3/3] add duplicate points to the test of Hilbert sort in 2D, 3D, and dD --- .../test/Spatial_sorting/test_hilbert.cpp | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/Spatial_sorting/test/Spatial_sorting/test_hilbert.cpp b/Spatial_sorting/test/Spatial_sorting/test_hilbert.cpp index ec0bc701ef5..40d9596df1a 100644 --- a/Spatial_sorting/test/Spatial_sorting/test_hilbert.cpp +++ b/Spatial_sorting/test/Spatial_sorting/test_hilbert.cpp @@ -48,8 +48,9 @@ int main () CGAL::Random_points_in_square_2 gen (1.0, random); - for (int i = 0; i < nb_points_2; ++i) + for (int i = 0; i < nb_points_2 - 1; ++i) v.push_back (*gen++); + v.push_back(v[0]); //insert twice the same point std::cout << "done." << std::endl; @@ -107,8 +108,9 @@ int main () CGAL::Random_points_in_square_2 gen (1.0, random); - for (int i = 0; i < nb_points_2; ++i) + for (int i = 0; i < nb_points_2 - 1; ++i) v.push_back (*gen++); + v.push_back(v[0]); //insert twice the same point std::cout << "done." << std::endl; @@ -167,8 +169,9 @@ int main () CGAL::Random_points_in_cube_3 gen (1.0, random); - for (int i = 0; i < nb_points_3; ++i) + for (int i = 0; i < nb_points_3 - 1; ++i) v.push_back (*gen++); + v.push_back(v[0]); //insert twice the same point std::cout << "done." << std::endl; @@ -228,8 +231,9 @@ int main () CGAL::Random_points_in_cube_3 gen (1.0, random); - for (int i = 0; i < nb_points_3; ++i) + for (int i = 0; i < nb_points_3 - 1; ++i) v.push_back (*gen++); + v.push_back(v[0]); //insert twice the same point std::cout << "done." << std::endl; @@ -288,8 +292,9 @@ int main () CGAL::Random_points_on_sphere_3 gen (1.0, random); - for (int i = 0; i < nb_points_3; ++i) + for (int i = 0; i < nb_points_3 - 1; ++i) v.push_back (*gen++); + v.push_back(v[0]); //insert twice the same point std::cout << "done." << std::endl; @@ -319,8 +324,9 @@ int main () CGAL::Random_points_on_sphere_3 gen (2.0, random); - for (int i = 0; i < nb_points_3; ++i) + for (int i = 0; i < nb_points_3 - 1; ++i) v.push_back (*gen++ + Vector_3(3,5,5)); + v.push_back(v[0]); //insert twice the same point std::cout << "done." << std::endl; @@ -350,8 +356,9 @@ int main () CGAL::Random_points_on_sphere_3 gen (1.0, random); - for (int i = 0; i < nb_points_3; ++i) + for (int i = 0; i < nb_points_3 - 1; ++i) v.push_back (*gen++); + v.push_back(v[0]); //insert twice the same point std::cout << "done." << std::endl; @@ -381,8 +388,9 @@ int main () CGAL::Random_points_on_sphere_3 gen (2.0, random); - for (int i = 0; i < nb_points_3; ++i) + for (int i = 0; i < nb_points_3 - 1; ++i) v.push_back (*gen++ + Vector_3(3,5,5)); + v.push_back(v[0]); //insert twice the same point std::cout << "done." << std::endl; @@ -413,8 +421,9 @@ int main () CGAL::Random_points_in_cube_d gen (dim, 1.0, random); - for (int i = 0; i < nb_points_d; ++i) + for (int i = 0; i < nb_points_d - 1; ++i) v.push_back (*gen++); + v.push_back(v[0]); //insert twice the same point std::cout << "done." << std::endl; @@ -445,8 +454,9 @@ int main () CGAL::Random_points_in_cube_d gen (dim, 1.0, random); - for (int i = 0; i < nb_points_d; ++i) + for (int i = 0; i < nb_points_d - 1; ++i) v.push_back (*gen++); + v.push_back(v[0]); //insert twice the same point std::cout << "done." << std::endl; @@ -477,8 +487,9 @@ int main () CGAL::Random_points_in_cube_d gen (dim, 1.0, random); - for (int i = 0; i < nb_points_d; ++i) + for (int i = 0; i < nb_points_d - 1; ++i) v.push_back (*gen++); + v.push_back(v[0]); //insert twice the same point std::cout << "done." << std::endl; @@ -510,8 +521,9 @@ int main () CGAL::Random_points_in_cube_d gen (dim, 1.0, random); - for (int i = 0; i < nb_points_d; ++i) + for (int i = 0; i < nb_points_d - 1; ++i) v.push_back (*gen++); + v.push_back(v[0]); //insert twice the same point std::cout << "done." << std::endl; @@ -633,8 +645,9 @@ int main () CGAL::Random_points_in_cube_d gen (dim, 1.0, random); - for (int i = 0; i < nb_points_d; ++i) + for (int i = 0; i < nb_points_d - 1; ++i) v.push_back (*gen++); + v.push_back(v[0]); //insert twice the same point std::cout << "done." << std::endl;