The LineSegment class is used by the LineMaterialSamplerBase class and for some ray tracing stuff. More...
#include <LineSegment.h>
Public Member Functions | |
| LineSegment ()=default | |
| LineSegment (const Point &p0, const Point &p1) | |
| ~LineSegment () override=default | |
| Point | closest_point (const Point &p) const |
| Returns the closest point on the LineSegment to the passed in point. | |
| bool | closest_normal_point (const Point &p, Point &closest_p) const |
| Finds the closest point on the Line determined by the Line Segments. | |
| bool | contains_point (const Point &p) const |
| Determines whether a point is in a line segment or not. | |
| 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 | intersect (const LineSegment &l1, Point &intersect_p) const |
| Check if a line segment intersects another line segment, and if so, return the intersection point. | |
| bool | intersect (const LineSegment &line_segment) const override |
| Check if a line segment intersects another line segment, without returning the intersection point. | |
| Ball | computeBoundingBall () const override |
| Compute a bounding ball for this line segment. | |
| const Point & | start () const |
| Beginning of the line segment. | |
| const Point & | end () const |
| Ending of the line segment. | |
| void | setStart (const Point &p0) |
| Sets the beginning of the line segment. | |
| void | setEnd (const Point &p1) |
| Sets the end of the line segment. | |
| void | set (const Point &p0, const Point &p1) |
| Sets the points on the line segment. | |
| Real | length () const |
| Length of segment. | |
| Point | normal () const |
| normal vector of the line segment | |
Private Member Functions | |
| bool | closest_point (const Point &p, bool clamp_to_segment, Point &closest_p) const |
Private Attributes | |
| Point | _p0 |
| Point | _p1 |
The LineSegment class is used by the LineMaterialSamplerBase class and for some ray tracing stuff.
Definition at line 30 of file LineSegment.h.
|
default |
| LineSegment::LineSegment | ( | const Point & | p0, |
| const Point & | p1 | ||
| ) |
Definition at line 18 of file LineSegment.C.
|
overridedefault |
| bool LineSegment::closest_normal_point | ( | const Point & | p, |
| Point & | closest_p | ||
| ) | const |
Finds the closest point on the Line determined by the Line Segments.
Returns a boolean indicating whether that normal point is within the LineSegment or not
Definition at line 54 of file LineSegment.C.
| Point LineSegment::closest_point | ( | const Point & | p | ) | const |
Returns the closest point on the LineSegment to the passed in point.
Note that the closest point may be one of the ends of the LineSegment.
Definition at line 46 of file LineSegment.C.
Referenced by closest_normal_point(), closest_point(), and contains_point().
|
private |
Definition at line 21 of file LineSegment.C.
|
overridevirtual |
Compute a bounding ball for this line segment.
The ball is defined by the midpoint of the segment and a radius equal to half the segment length.
Implements GeometryBase.
Reimplemented in SurfaceEdge2.
Definition at line 302 of file LineSegment.C.
Referenced by SurfaceEdge2::computeBoundingBall().
| bool LineSegment::contains_point | ( | const Point & | p | ) | const |
Determines whether a point is in a line segment or not.
Definition at line 60 of file LineSegment.C.
Referenced by intersect(), and Moose::sideIntersectedByLine().
|
inline |
Ending of the line segment.
Definition at line 90 of file LineSegment.h.
Referenced by dataStore(), IntersectionPointsAlongLine::execute(), Ball::intersect(), Moose::recursivelyFindElementsIntersectedByLine(), and to_json().
| bool LineSegment::intersect | ( | const libMesh::Plane & | pl, |
| Point & | intersect_p | ||
| ) | const |
Check if a line segment intersects a plane, and if so, return the intersection point.
There are three cases in 3D for intersection of a line and a plane Case 1: The line is parallel to the plane - No intersection Numerator = non-zero Denominator = zero
Case 2: The line is within the plane - Inf intersection Numerator = zero Denominator = zero
Case 3: The line intersects the plane at a single point Denominator = non-zero
Definition at line 67 of file LineSegment.C.
Referenced by intersect(), SurfaceEdge2::intersect(), and Moose::sideIntersectedByLine().
| bool LineSegment::intersect | ( | const LineSegment & | l1, |
| Point & | intersect_p | ||
| ) | const |
Check if a line segment intersects another line segment, and if so, return the intersection point.
First check for concurance:
| x1 y1 z1 1 | | x2 y2 z2 1 | = (x3 - x1) * [(x2-x1) x (x4-x3)] = 0 | x3 y3 z3 1 | | x4 y4 z4 1 |
Solve: x = _p0 + (_p1 - _p0)*s x = l.p0 + (l._p1 - l.p0)*t
where a = _p1 - _p0 b = l._p1 - l._p0 c = l._p0 - _p0
s = (c x b) * (a x b) / | a x b |^2
Parameteric Equation of lines
_p0 + t(v0) = l._p0 + u(v1)
Case 1: Parallel Lines
v0 x v1 == 0
Case 1a: Collinear Lines
v0 x v1 == 0
(l._p0 - _p0) x (_p1 - _p0) == 0
Case 2: Intersecting Lines
0 <= t <= 1
0 <= u <= 1
Case 1: The lines do not intersect
vleft cross vright = non-zero
Case 2: The lines are co-linear
vleft cross vright = zero
vleft (Denominator) = zero
Case 3: The line intersect at a single point
vleft cross vright = zero
vleft (Denominator) = non-zero
RealVectorValue v0 = _p1 - _p0; RealVectorValue v1 = l._p1 - l._p0; RealVectorValue v2 = l._p0 - _p0;
RealVectorValue vbot = v0.cross(v1); RealVectorValue vtop = v2.cross(v1);
RealVectorValue crossed = vleft.cross(vright);
Case 1: No intersection if (std::abs(vleft.cross(vright).size()) > 1.e-10) return false;
Case 2: Co-linear (just return one of the end points) if (std::abs(vleft.size()) < 1.e-10) { intersect_p = _p0; return true; }
Case 3:
TODO: We could detect whether the Line Segments actually overlap instead of whether the Lines are co-linear
Real a = vright.size()/vleft.size(); intersect_p = _p0 + a*v0; return true;
Definition at line 115 of file LineSegment.C.
|
overridevirtual |
Check if a line segment intersects another line segment, without returning the intersection point.
Implements GeometryBase.
Reimplemented in SurfaceEdge2, and SurfaceEdge2.
Definition at line 250 of file LineSegment.C.
|
inline |
| Point LineSegment::normal | ( | ) | const |
normal vector of the line segment
Definition at line 288 of file LineSegment.C.
| void LineSegment::set | ( | const Point & | p0, |
| const Point & | p1 | ||
| ) |
Sets the points on the line segment.
| p0 | The start point of the line segment |
| p1 | The end point of the line segment |
Definition at line 257 of file LineSegment.C.
Referenced by dataLoad().
|
inline |
Sets the end of the line segment.
Definition at line 100 of file LineSegment.h.
Referenced by set().
|
inline |
Sets the beginning of the line segment.
Definition at line 95 of file LineSegment.h.
Referenced by set().
|
inline |
Beginning of the line segment.
Definition at line 85 of file LineSegment.h.
Referenced by dataStore(), Ball::intersect(), and to_json().
|
private |
Definition at line 122 of file LineSegment.h.
Referenced by closest_point(), computeBoundingBall(), intersect(), intersect(), length(), normal(), setStart(), and start().
|
private |
Definition at line 122 of file LineSegment.h.
Referenced by closest_point(), computeBoundingBall(), end(), intersect(), intersect(), length(), normal(), and setEnd().