14 #include <unordered_set>
24 double const radius_squared)
28 if (radius_squared == 0.)
30 return {start_element.
getID()};
34 std::vector<MathLib::Point3d> start_element_nodes;
37 start_element_nodes.reserve(start_element_n_nodes);
38 for (
unsigned n = 0; n < start_element_n_nodes; ++n)
40 start_element_nodes.push_back(*start_element.
getNode(n));
46 auto node_inside_radius =
47 [&start_element_nodes, radius_squared](
Node const* test_node)
49 for (
auto const& n : start_element_nodes)
61 auto element_in_radius = [&node_inside_radius](
Element const& element)
63 auto const n_nodes = element.getNumberOfNodes();
64 for (
unsigned i = 0; i < n_nodes; ++i)
66 if (node_inside_radius(element.getNode(i)))
74 std::set<std::size_t> found_elements;
75 std::vector<Element const*> neighbors_to_visit;
76 std::unordered_set<std::size_t> visited_elements;
78 auto mark_visited_and_add_neighbors =
79 [&found_elements, &neighbors_to_visit, &visited_elements](
82 found_elements.insert(element.getID());
83 visited_elements.insert(element.getID());
84 auto const n_neighbors = element.getNumberOfNeighbors();
85 for (
unsigned n = 0; n < n_neighbors; ++n)
87 auto neighbor = element.getNeighbor(n);
88 if (neighbor ==
nullptr)
92 auto x = visited_elements.find(neighbor->getID());
93 if (x != visited_elements.end())
98 neighbors_to_visit.push_back(neighbor);
100 visited_elements.insert(neighbor->getID());
105 mark_visited_and_add_neighbors(start_element);
107 while (!neighbors_to_visit.empty())
109 auto const& current_element = *neighbors_to_visit.back();
110 neighbors_to_visit.pop_back();
113 if (element_in_radius(current_element))
115 mark_visited_and_add_neighbors(current_element);
119 return {std::begin(found_elements), std::end(found_elements)};
Definition of the Element class.
Definition of the Node class.
virtual const Node * getNode(unsigned idx) const =0
virtual unsigned getNumberOfNodes() const =0
virtual std::size_t getID() const final
Returns the ID of the element.
double sqrDist(MathLib::Point3d const &p0, MathLib::Point3d const &p1)
std::vector< std::size_t > findElementsWithinRadius(Element const &start_element, double const radius_squared)