17 double const radius_squared)
21 if (radius_squared == 0.)
23 return {start_element.
getID()};
27 std::vector<MathLib::Point3d> start_element_nodes;
30 start_element_nodes.reserve(start_element_n_nodes);
31 for (
unsigned n = 0; n < start_element_n_nodes; ++n)
33 start_element_nodes.push_back(*start_element.
getNode(n));
39 auto node_inside_radius =
40 [&start_element_nodes, radius_squared](
Node const* test_node)
43 start_element_nodes.begin(), start_element_nodes.end(),
44 [test_node, &radius_squared](
auto const node)
45 { return MathLib::sqrDist(*test_node, node) <= radius_squared; });
50 auto element_in_radius = [&node_inside_radius](
Element const& element)
52 auto const n_nodes = element.getNumberOfNodes();
53 for (
unsigned i = 0; i < n_nodes; ++i)
55 if (node_inside_radius(element.getNode(i)))
63 std::set<std::size_t> found_elements;
64 std::vector<Element const*> neighbors_to_visit;
65 std::unordered_set<std::size_t> visited_elements;
67 auto mark_visited_and_add_neighbors =
68 [&found_elements, &neighbors_to_visit, &visited_elements](
71 found_elements.insert(element.getID());
72 visited_elements.insert(element.getID());
73 auto const n_neighbors = element.getNumberOfNeighbors();
74 for (
unsigned n = 0; n < n_neighbors; ++n)
76 auto neighbor = element.getNeighbor(n);
77 if (neighbor ==
nullptr)
81 auto x = visited_elements.find(neighbor->getID());
82 if (x != visited_elements.end())
87 neighbors_to_visit.push_back(neighbor);
89 visited_elements.insert(neighbor->getID());
94 mark_visited_and_add_neighbors(start_element);
96 while (!neighbors_to_visit.empty())
98 auto const& current_element = *neighbors_to_visit.back();
99 neighbors_to_visit.pop_back();
102 if (element_in_radius(current_element))
104 mark_visited_and_add_neighbors(current_element);
108 return {std::begin(found_elements), std::end(found_elements)};