15 #include "libmesh/plane.h" 16 #include "libmesh/point.h" 17 #include "libmesh/mesh.h" 18 #include "libmesh/elem.h" 37 std::vector<int> & not_side,
39 Point & intersection_point)
41 unsigned int n_sides = elem->
n_sides();
44 bool intersect =
false;
46 unsigned int dim = elem->
dim();
48 for (
unsigned int i = 0; i < n_sides; i++)
52 if (std::find(not_side.begin(), not_side.end(),
static_cast<int>(i)) != not_side.end())
56 std::unique_ptr<const Elem> side_elem = elem->
side_ptr(i);
61 Plane plane(side_elem->point(0), side_elem->point(1), side_elem->point(2));
64 intersect = line_segment.
intersect(plane, intersection_point);
69 LineSegment side_segment(side_elem->point(0), side_elem->point(1));
72 intersect = line_segment.
intersect(side_segment, intersection_point);
81 intersection_point = side_elem->point(0);
86 if (side_elem->contains_point(intersection_point))
94 not_side.push_back(i);
98 if (better_side != -1)
119 unsigned int n_sides = elem->
n_sides();
121 for (
unsigned int i = 0; i < n_sides; i++)
147 const Elem * current_elem,
149 const Point & incoming_point,
150 std::vector<Elem *> & intersected_elems,
151 std::vector<LineSegment> & segments)
153 Point intersection_point;
155 std::vector<int> not_side(1, incoming_side);
159 int intersected_side =
162 if (intersected_side != -1)
170 intersected_elems.push_back(const_cast<Elem *>(neighbor));
173 segments.push_back(
LineSegment(incoming_point, intersection_point));
181 line_segment, neighbor, incoming_side, intersection_point, intersected_elems, segments);
184 segments.push_back(
LineSegment(incoming_point, line_segment.
end()));
187 segments.push_back(
LineSegment(incoming_point, line_segment.
end()));
198 std::vector<Elem *> & intersected_elems,
199 std::vector<LineSegment> & segments)
202 intersected_elems.clear();
211 intersected_elems.push_back(const_cast<Elem *>(
first_elem));
218 line_segment,
first_elem, -1, p0, intersected_elems, segments);
const Point & end() const
Ending of the line segment.
void elementsIntersectedByLine(const Point &p0, const Point &p1, const MeshBase &, const PointLocatorBase &point_locator, std::vector< Elem *> &intersected_elems, std::vector< LineSegment > &segments)
int sideNeighborIsOn(const Elem *elem, const Elem *neighbor)
Returns the side number for elem that neighbor is on.
The LineSegment class is used by the LineMaterialSamplerBase class and for some ray tracing stuff...
static constexpr std::size_t dim
This is the dimension of all vector and tensor datastructures used in MOOSE.
void recursivelyFindElementsIntersectedByLine(const LineSegment &line_segment, const Elem *current_elem, int incoming_side, const Point &incoming_point, std::vector< Elem *> &intersected_elems, std::vector< LineSegment > &segments)
Recursively find all elements intersected by a line segment.
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
bool intersect(const libMesh::Plane &pl, Point &intersect_p) const
bool contains_point(const Point &p) const
Determines whether a point is in a line segment or not.
virtual unsigned int n_sides() const=0
const Elem * neighbor_ptr(unsigned int i) const
virtual std::unique_ptr< Elem > side_ptr(unsigned int i)=0
virtual unsigned short dim() const=0
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...
int sideIntersectedByLine(const Elem *elem, std::vector< int > ¬_side, const LineSegment &line_segment, Point &intersection_point)
Figure out which (if any) side of an Elem is intersected by a line.