https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Public Member Functions | Private Member Functions | Private Attributes | List of all members
LineSegment Class Reference

The LineSegment class is used by the LineMaterialSamplerBase class and for some ray tracing stuff. More...

#include <LineSegment.h>

Inheritance diagram for LineSegment:
[legend]

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
 

Detailed Description

The LineSegment class is used by the LineMaterialSamplerBase class and for some ray tracing stuff.

Definition at line 30 of file LineSegment.h.

Constructor & Destructor Documentation

◆ LineSegment() [1/2]

LineSegment::LineSegment ( )
default

◆ LineSegment() [2/2]

LineSegment::LineSegment ( const Point p0,
const Point p1 
)

Definition at line 21 of file LineSegment.C.

21: _p0(p0), _p1(p1) {}

◆ ~LineSegment()

LineSegment::~LineSegment ( )
overridedefault

Member Function Documentation

◆ closest_normal_point()

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 57 of file LineSegment.C.

58{
59 return closest_point(p, false, closest_p);
60}
Point closest_point(const Point &p) const
Returns the closest point on the LineSegment to the passed in point.
Definition LineSegment.C:49

◆ closest_point() [1/2]

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 49 of file LineSegment.C.

50{
51 Point closest_p;
52 closest_point(p, true, closest_p);
53 return closest_p;
54}

Referenced by closest_normal_point(), closest_point(), and contains_point().

◆ closest_point() [2/2]

bool LineSegment::closest_point ( const Point p,
bool  clamp_to_segment,
Point closest_p 
) const
private

Definition at line 24 of file LineSegment.C.

25{
26 Point p0_p = p - _p0;
27 Point p0_p1 = _p1 - _p0;
28 Real p0_p1_2 = p0_p1.norm_sq();
29 Real perp = p0_p(0) * p0_p1(0) + p0_p(1) * p0_p1(1) + p0_p(2) * p0_p1(2);
30 Real t = perp / p0_p1_2;
31 bool on_segment = true;
32
33 if (t < 0.0 || t > 1.0)
34 on_segment = false;
35
36 if (clamp_to_segment)
37 {
38 if (t < 0.0)
39 t = 0.0;
40 else if (t > 1.0)
41 t = 1.0;
42 }
43
44 closest_p = _p0 + p0_p1 * t;
45 return on_segment;
46}
auto norm_sq() const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ computeBoundingBall()

Ball LineSegment::computeBoundingBall ( ) const
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.

Definition at line 303 of file LineSegment.C.

304{
305 const Point center = 0.5 * (_p0 + _p1);
306 const Real radius = 0.5 * (_p1 - _p0).norm();
307 return Ball(center, radius);
308}
Point center
Definition MortarUtils.C:58
Ball primitive: a circle in 2D or a sphere in 3D.
Definition Ball.h:35
auto norm(const T &a)
const Real radius

◆ contains_point()

bool LineSegment::contains_point ( const Point p) const

Determines whether a point is in a line segment or not.

Definition at line 63 of file LineSegment.C.

64{
65 Point closest_p;
66 return closest_point(p, false, closest_p) && closest_p.absolute_fuzzy_equals(p);
67}
bool absolute_fuzzy_equals(const TypeVector< Real > &rhs, Real tol=TOLERANCE) const

Referenced by Moose::sideIntersectedByLine().

◆ end()

const Point & LineSegment::end ( ) const
inline

◆ intersect() [1/3]

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 70 of file LineSegment.C.

71{
86 Point pl0 = pl.get_planar_point();
88 RealVectorValue I = (_p1 - _p0).unit();
89
90 Real numerator = (pl0 - _p0) * N;
91 Real denominator = I * N;
92
93 // The Line is parallel to the plane
94 if (std::abs(denominator) < 1.e-10)
95 {
96 // The Line is on the plane
97 if (std::abs(numerator) < 1.e-10)
98 {
99 // The solution is not unique so we'll just pick an end point for now
100 intersect_p = _p0;
101 return true;
102 }
103 return false;
104 }
105
106 Real d = numerator / denominator;
107
108 // Make sure we haven't moved off the line segment!
109 if (d + libMesh::TOLERANCE < 0 || d - libMesh::TOLERANCE > (_p1 - _p0).norm())
110 return false;
111
112 intersect_p = d * I + _p0;
113
114 return true;
115}
const Point & get_planar_point() const
virtual Point unit_normal(const Point &p) const override
VectorValue< Real > RealVectorValue
Definition SubProblem.h:34

Referenced by intersect(), and Moose::sideIntersectedByLine().

◆ intersect() [2/3]

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.

◆ intersect() [3/3]

bool LineSegment::intersect ( const LineSegment line_segment) const
overridevirtual

Check if a line segment intersects another line segment, without returning the intersection point.

Implements GeometryBase.

Definition at line 253 of file LineSegment.C.

254{
255 Point p;
256 return intersect(line_segment, p);
257}
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.
Definition LineSegment.C:70

◆ length()

Real LineSegment::length ( ) const
inline

Length of segment.

Definition at line 112 of file LineSegment.h.

112{ return (_p0 - _p1).norm(); }

◆ normal()

Point LineSegment::normal ( ) const

normal vector of the line segment

Definition at line 291 of file LineSegment.C.

292{
293 const auto tangent = _p1 - _p0;
294
295 // Rotate 90 degrees counter-clockwise (2D)
296 Point n(-tangent(1), tangent(0), 0.0);
297 n /= n.norm();
298
299 return n;
300}

◆ set()

void LineSegment::set ( const Point p0,
const Point p1 
)

Sets the points on the line segment.

Parameters
p0The start point of the line segment
p1The end point of the line segment

Definition at line 260 of file LineSegment.C.

261{
262 setStart(p0);
263 setEnd(p1);
264}
void setStart(const Point &p0)
Sets the beginning of the line segment.
Definition LineSegment.h:95
void setEnd(const Point &p1)
Sets the end of the line segment.

Referenced by dataLoad().

◆ setEnd()

void LineSegment::setEnd ( const Point &  p1)
inline

Sets the end of the line segment.

Definition at line 100 of file LineSegment.h.

100{ _p1 = p1; }

Referenced by set().

◆ setStart()

void LineSegment::setStart ( const Point &  p0)
inline

Sets the beginning of the line segment.

Definition at line 95 of file LineSegment.h.

95{ _p0 = p0; }

Referenced by set().

◆ start()

const Point & LineSegment::start ( ) const
inline

Beginning of the line segment.

Definition at line 85 of file LineSegment.h.

85{ return _p0; }

Referenced by dataStore(), Triangle::intersect(), Ball::intersect(), and to_json().

Member Data Documentation

◆ _p0

Point LineSegment::_p0
private

◆ _p1

Point LineSegment::_p1
private

Definition at line 122 of file LineSegment.h.

Referenced by closest_point(), computeBoundingBall(), end(), intersect(), length(), normal(), and setEnd().


The documentation for this class was generated from the following files: