#define CGAL_TRACE_STREAM std::cerr #include #include #include #include #include using Kernel = CGAL::Simple_cartesian; using Point = Kernel::Point_3; using Point_set = CGAL::Point_set_3; using Octree = CGAL::Octree; class Split_nth_child_of_root { std::size_t m_n; public: Split_nth_child_of_root(std::size_t n) : m_n(n) {} template bool operator()(const Node& node) const { return (node.depth() == 1 && node.local_coordinates().to_ulong() == m_n); } template bool operator()(Node_index i, const Tree &tree) const { return (tree.depth(i) == 1 && tree.local_coordinates(i).to_ulong() == m_n); } }; void test_1_point() { // Define the dataset Point_set points; points.insert({-1, -1, -1}); // Create the octree Octree octree(points, points.point_map()); octree.refine(10, 1); // Check that the root node was never split assert(octree.is_leaf(octree.root())); assert(0 == octree.depth()); } void test_2_points() { // Define the dataset Point_set points; points.insert({-1, -1, -1}); points.insert({1, -1, -1}); // Create the octree Octree octree(points, points.point_map()); octree.refine(10, 1); // The octree should have been split once Octree other(points, points.point_map()); other.split(other.root()); assert(Octree::is_topology_equal(other, octree)); assert(1 == octree.depth()); } void test_4_points() { Point_set points; points.insert({1, 1, 1}); points.insert({1, 1, 2}); points.insert({1, 1, 3}); points.insert({1, 1, 4}); // Create the octree Octree octree(points, points.point_map()); octree.refine(10, 1); Octree other(points, points.point_map()); other.split(other.root()); other.split(other.node(3)); other.split(other.node(7)); assert(Octree::is_topology_equal(other, octree)); assert(2 == octree.depth()); // Applying another splitting criterion shouldn't reset the tree. octree.refine(Split_nth_child_of_root(2)); other.split(other.node(2)); assert(Octree::is_topology_equal(other, octree)); } int main(void) { test_1_point(); test_2_points(); test_4_points(); return EXIT_SUCCESS; }