mirror of https://github.com/CGAL/cgal
nearest_k_neighbors() implemented in terms of indices
This commit is contained in:
parent
8712032193
commit
43b7543d3b
|
|
@ -1027,15 +1027,6 @@ private: // functions :
|
||||||
reassign_points(m_nodes[n], begin, end, center, coord, dimension);
|
reassign_points(m_nodes[n], begin, end, center, coord, dimension);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool do_intersect(const Node& node, const Sphere& sphere) const {
|
|
||||||
|
|
||||||
// Create a cubic bounding box from the node
|
|
||||||
Bbox node_cube = bbox(node);
|
|
||||||
|
|
||||||
// Check for intersection between the node and the sphere
|
|
||||||
return CGAL::do_intersect(node_cube, sphere);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool do_intersect(Node_index n, const Sphere& sphere) const {
|
bool do_intersect(Node_index n, const Sphere& sphere) const {
|
||||||
|
|
||||||
// Create a cubic bounding box from the node
|
// Create a cubic bounding box from the node
|
||||||
|
|
@ -1052,25 +1043,25 @@ private: // functions :
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Node_index_with_distance {
|
struct Node_index_with_distance {
|
||||||
typename Node::Local_coordinates index;
|
Node_index index;
|
||||||
FT distance;
|
FT distance;
|
||||||
|
|
||||||
Node_index_with_distance(const typename Node::Local_coordinates& index,
|
Node_index_with_distance(const Node_index& index, const FT& distance) :
|
||||||
const FT& distance)
|
index(index), distance(distance) {}
|
||||||
: index(index), distance(distance) {}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void nearest_k_neighbors_recursive(Sphere& search_bounds, const Node& node,
|
void nearest_k_neighbors_recursive(Sphere& search_bounds, Node_index node,
|
||||||
std::vector<Point_with_distance>& results, FT epsilon = 0) const {
|
std::vector<Point_with_distance>& results, FT epsilon = 0) const {
|
||||||
|
|
||||||
// Check whether the node has children
|
// Check whether the node has children
|
||||||
if (node.is_leaf()) {
|
if (is_leaf(node)) {
|
||||||
|
|
||||||
// Base case: the node has no children
|
// Base case: the node has no children
|
||||||
|
|
||||||
// Loop through each of the points contained by the node
|
// Loop through each of the points contained by the node
|
||||||
// Note: there might be none, and that should be fine!
|
// Note: there might be none, and that should be fine!
|
||||||
for (auto point_index: node.points()) {
|
for (auto point_index: m_nodes[node].points()) {
|
||||||
|
|
||||||
// Retrieve each point from the orthtree's point map
|
// Retrieve each point from the orthtree's point map
|
||||||
auto point = get(m_point_map, point_index);
|
auto point = get(m_point_map, point_index);
|
||||||
|
|
@ -1115,12 +1106,12 @@ private: // functions :
|
||||||
|
|
||||||
// Fill the list with child nodes
|
// Fill the list with child nodes
|
||||||
for (int i = 0; i < Degree::value; ++i) {
|
for (int i = 0; i < Degree::value; ++i) {
|
||||||
auto& child_node = children(node)[i];
|
auto child_node = index(children(node)[i]);
|
||||||
|
|
||||||
// Add a child to the list, with its distance
|
// Add a child to the list, with its distance
|
||||||
children_with_distances.emplace_back(
|
children_with_distances.emplace_back(
|
||||||
typename Node::Local_coordinates(i),
|
child_node,
|
||||||
CGAL::squared_distance(search_bounds.center(), barycenter(index(child_node)))
|
CGAL::squared_distance(search_bounds.center(), barycenter(child_node))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1131,13 +1122,12 @@ private: // functions :
|
||||||
|
|
||||||
// Loop over the children
|
// Loop over the children
|
||||||
for (auto child_with_distance: children_with_distances) {
|
for (auto child_with_distance: children_with_distances) {
|
||||||
auto& child_node = children(node)[child_with_distance.index.to_ulong()];
|
|
||||||
|
|
||||||
// Check whether the bounding box of the child intersects with the search bounds
|
// Check whether the bounding box of the child intersects with the search bounds
|
||||||
if (do_intersect(child_node, search_bounds)) {
|
if (do_intersect(child_with_distance.index, search_bounds)) {
|
||||||
|
|
||||||
// Recursively invoke this function
|
// Recursively invoke this function
|
||||||
nearest_k_neighbors_recursive(search_bounds, child_node, results);
|
nearest_k_neighbors_recursive(search_bounds, child_with_distance.index, results);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1191,7 +1181,7 @@ private: // functions :
|
||||||
points_list.reserve(k);
|
points_list.reserve(k);
|
||||||
|
|
||||||
// Invoking the recursive function adds those points to the vector (passed by reference)
|
// Invoking the recursive function adds those points to the vector (passed by reference)
|
||||||
nearest_k_neighbors_recursive(query_sphere, root(), points_list);
|
nearest_k_neighbors_recursive(query_sphere, index(root()), points_list);
|
||||||
|
|
||||||
// Add all the points found to the output
|
// Add all the points found to the output
|
||||||
for (auto& item: points_list)
|
for (auto& item: points_list)
|
||||||
|
|
|
||||||
|
|
@ -17,11 +17,11 @@ typedef CGAL::Point_set_3<Point> Point_set;
|
||||||
typedef CGAL::Octree<Kernel, Point_set, typename Point_set::Point_map> Octree;
|
typedef CGAL::Octree<Kernel, Point_set, typename Point_set::Point_map> Octree;
|
||||||
typedef CGAL::Orthtrees::Leaves_traversal<Octree> Leaves_traversal;
|
typedef CGAL::Orthtrees::Leaves_traversal<Octree> Leaves_traversal;
|
||||||
|
|
||||||
std::size_t count_jumps(Octree &octree) {
|
std::size_t count_jumps(Octree& octree) {
|
||||||
|
|
||||||
std::size_t jumps = 0;
|
std::size_t jumps = 0;
|
||||||
|
|
||||||
for (auto node : octree.traverse_indices<Leaves_traversal>()) {
|
for (auto node: octree.traverse_indices<Leaves_traversal>()) {
|
||||||
|
|
||||||
for (int direction = 0; direction < 6; ++direction) {
|
for (int direction = 0; direction < 6; ++direction) {
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue