15#include "libmesh/plane.h"
16#include "libmesh/point.h"
17#include "libmesh/mesh.h"
18#include "libmesh/elem.h"
35 std::vector<int> & not_side,
37 Point & intersection_point)
39 unsigned int n_sides = elem->n_sides();
42 bool intersect =
false;
44 unsigned int dim = elem->dim();
46 for (
unsigned int i = 0; i < n_sides; i++)
50 if (std::find(not_side.begin(), not_side.end(),
static_cast<int>(i)) != not_side.end())
54 std::unique_ptr<const Elem> side_elem = elem->side_ptr(i);
59 libMesh::Plane plane(side_elem->point(0), side_elem->point(1), side_elem->point(2));
62 intersect = line_segment.
intersect(plane, intersection_point);
67 LineSegment side_segment(side_elem->point(0), side_elem->point(1));
70 intersect = line_segment.
intersect(side_segment, intersection_point);
79 intersection_point = side_elem->point(0);
84 if (side_elem->contains_point(intersection_point))
86 const Elem * neighbor = elem->neighbor_ptr(i);
92 not_side.push_back(i);
96 if (better_side != -1)
117 unsigned int n_sides = elem->n_sides();
119 for (
unsigned int i = 0; i < n_sides; i++)
121 if (elem->neighbor_ptr(i) == neighbor)
145 const Elem * current_elem,
147 const Point & incoming_point,
148 std::vector<Elem *> & intersected_elems,
149 std::vector<LineSegment> & segments)
151 Point intersection_point;
153 std::vector<int> not_side(1, incoming_side);
157 int intersected_side =
160 if (intersected_side != -1)
163 const Elem * neighbor = current_elem->neighbor_ptr(intersected_side);
168 intersected_elems.push_back(
const_cast<Elem *
>(neighbor));
171 segments.push_back(
LineSegment(incoming_point, intersection_point));
179 line_segment, neighbor, incoming_side, intersection_point, intersected_elems, segments);
182 segments.push_back(
LineSegment(incoming_point, line_segment.
end()));
185 segments.push_back(
LineSegment(incoming_point, line_segment.
end()));
195 const PointLocatorBase & point_locator,
196 std::vector<Elem *> & intersected_elems,
197 std::vector<LineSegment> & segments)
200 intersected_elems.clear();
203 const Elem * first_elem = point_locator(p0);
209 intersected_elems.push_back(
const_cast<Elem *
>(first_elem));
216 line_segment, first_elem, -1, p0, intersected_elems, segments);
The LineSegment class is used by the LineMaterialSamplerBase class and for some ray tracing stuff.
bool intersect(const libMesh::Plane &pl, Point &intersect_p) const
Check if a line segment intersects a plane, and if so, return the intersection point.
bool contains_point(const Point &p) const
Determines whether a point is in a line segment or not.
const Point & end() const
Ending of the line segment.
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.
void elementsIntersectedByLine(const Point &p0, const Point &p1, const MeshBase &mesh, const libMesh::PointLocatorBase &point_locator, std::vector< Elem * > &intersected_elems, std::vector< LineSegment > &segments)
Find all of the elements intersected by a line.
int sideNeighborIsOn(const Elem *elem, const Elem *neighbor)
Returns the side number for elem that neighbor is on.
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.