\( \newcommand{\E}{\mathrm{E}} \) \( \newcommand{\A}{\mathrm{A}} \) \( \newcommand{\R}{\mathrm{R}} \) \( \newcommand{\N}{\mathrm{N}} \) \( \newcommand{\Q}{\mathrm{Q}} \) \( \newcommand{\Z}{\mathrm{Z}} \) \( \def\ccSum #1#2#3{ \sum_{#1}^{#2}{#3} } \def\ccProd #1#2#3{ \sum_{#1}^{#2}{#3} }\)
CGAL 5.0.2 - Spatial Sorting
Spatial_sorting/hilbert_sort_on_sphere.cpp
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/point_generators_3.h>
#include <CGAL/hilbert_sort_on_sphere.h>
#include <iostream>
#include <vector>
typedef K::Point_3 Point;
typedef K::Vector_3 Vector;
typedef K::Sphere_3 Sphere;
int main ()
{
std::size_t size = 32;
CGAL::Random random (42);
std::vector<Point> v;
// unit sphere
std::cout << "UNIT SPHERE: " << std::endl;
v.reserve(size);
CGAL::Random_points_on_sphere_3<Point> unit_sphere(1.0, random); // generate points
for (std::size_t i = 0; i < size; ++i) v.push_back(*unit_sphere++);
CGAL::hilbert_sort_on_sphere(v.begin(), v.end()); // sort
for(std::size_t i=0; i<size; ++i) std::cout << v[i] << std::endl; //output
v.clear();
// given sphere
std::cout << "GIVEN SPHERE: " << std::endl;
v.reserve(size);
Vector trans = Vector(3,4,5);
Sphere sphere = Sphere(CGAL::ORIGIN + trans, 4);
CGAL::Random_points_on_sphere_3<Point> given_sphere(2.0, random); // generate points
for (std::size_t i = 0; i < size; ++i) v.push_back(*given_sphere++ + trans);
CGAL::hilbert_sort_on_sphere(v.begin(), v.end(), // sort
sphere.squared_radius(), sphere.center());
for(std::size_t i=0; i<size; ++i) std::cout << v[i] << std::endl; //output
return 0;
}