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

Class implementing a uniform clamped B-Spline curve. More...

#include <BSpline.h>

Public Member Functions

 BSpline (const unsigned int degree, const libMesh::Point &start_point, const libMesh::Point &end_point, const libMesh::RealVectorValue &start_direction, const libMesh::RealVectorValue &end_direction, const unsigned int cps_per_half, const libMesh::Real sharpness, const std::string &caller_name)
 
libMesh::Point getPoint (const libMesh::Real t) const
 Evaluate the BSpline interpolation at given value of t.
 

Private Member Functions

std::vector< libMesh::Real > buildKnotVector () const
 Internal method for building the knot vector given the degree and control points.
 
std::vector< libMesh::Point > createControlPoints () const
 Creates a vector control points from the SplineUtils set of functions.
 
libMesh::Real CdBBasis (const libMesh::Real t, const unsigned int i, const unsigned int j) const
 Evaluates the the basis function for a B-Spline according to the Cox-de-Boor recursive formula.
 
libMesh::Real firstCoeff (const libMesh::Real t, const unsigned int i, const unsigned int j) const
 Submethod used in CdBBasis routine.
 
libMesh::Real secondCoeff (const libMesh::Real t, const unsigned int i, const unsigned int j) const
 Submethod used in CdBBasis routine.
 

Private Attributes

const unsigned int _degree
 The polynomial degree of the B-Spline.
 
const libMesh::Point _start_point
 starting point of spline
 
const libMesh::Point _end_point
 ending point of spline
 
const libMesh::RealVectorValue _start_dir
 starting direction of spline
 
const libMesh::RealVectorValue _end_dir
 ending direction of spline
 
const unsigned int _cps_per_half
 number of control points per half of the spline (vertex is auto-included)
 
const libMesh::Real _sharpness
 sharpness of the curve
 
const std::string _caller_name
 Name of the object working with this class, used for error reporting.
 
const std::vector< libMesh::Point > _control_points
 The control points.
 
const std::vector< libMesh::Real > _knot_vector
 The knot vector.
 

Detailed Description

Class implementing a uniform clamped B-Spline curve.

Reference used for implementation: https://mat.fsv.cvut.cz/gcg/sbornik/prochazkova.pdf The B-Spline is uniform because of the spacings in the knot vector The B-Spline is clamped because the knot vector starts (and ends) with (degree + 1) 0s (and 1s) Clamped means that it passes through the specified start and end points with specified slopes

Definition at line 25 of file BSpline.h.

Constructor & Destructor Documentation

◆ BSpline()

Moose::BSpline::BSpline ( const unsigned int  degree,
const libMesh::Point &  start_point,
const libMesh::Point &  end_point,
const libMesh::RealVectorValue &  start_direction,
const libMesh::RealVectorValue &  end_direction,
const unsigned int  cps_per_half,
const libMesh::Real  sharpness,
const std::string &  caller_name 
)

Definition at line 18 of file BSpline.C.

26 : _degree(degree),
27 _start_point(start_point),
28 _end_point(end_point),
29 _start_dir(start_direction),
30 _end_dir(end_direction),
31 _cps_per_half(cps_per_half),
32 _sharpness(sharpness),
33 _caller_name(caller_name),
36{
37}
const unsigned int _degree
The polynomial degree of the B-Spline.
Definition BSpline.h:85
const std::vector< libMesh::Real > _knot_vector
The knot vector.
Definition BSpline.h:106
const libMesh::Real _sharpness
sharpness of the curve
Definition BSpline.h:97
const std::vector< libMesh::Point > _control_points
The control points.
Definition BSpline.h:102
const libMesh::Point _start_point
starting point of spline
Definition BSpline.h:87
const std::string _caller_name
Name of the object working with this class, used for error reporting.
Definition BSpline.h:100
const libMesh::Point _end_point
ending point of spline
Definition BSpline.h:89
const libMesh::RealVectorValue _end_dir
ending direction of spline
Definition BSpline.h:93
std::vector< libMesh::Real > buildKnotVector() const
Internal method for building the knot vector given the degree and control points.
Definition BSpline.C:63
const unsigned int _cps_per_half
number of control points per half of the spline (vertex is auto-included)
Definition BSpline.h:95
const libMesh::RealVectorValue _start_dir
starting direction of spline
Definition BSpline.h:91
std::vector< libMesh::Point > createControlPoints() const
Creates a vector control points from the SplineUtils set of functions.
Definition BSpline.C:53

Member Function Documentation

◆ buildKnotVector()

std::vector< libMesh::Real > Moose::BSpline::buildKnotVector ( ) const
private

Internal method for building the knot vector given the degree and control points.

Definition at line 63 of file BSpline.C.

64{
65 std::vector<libMesh::Real> knot_vector(_degree, 0); // initialize bottom to zeros
66
67 const unsigned int num_points_left = _control_points.size() + 1 - _degree;
68 if (_control_points.size() < _degree + 1)
70 ": Number of control points must be greater than or equal to degree + 1!");
71
72 for (const auto i : make_range(num_points_left))
73 {
74 knot_vector.push_back(i); // count up
75 mooseAssert(i < _control_points.size(),
76 "i must be less than the number of control points because of 0 indexing.");
77 }
78
79 // Filling with int(degree + 1) 0s at the beginning and 1s at the end makes the B-spline go
80 // through the start and end point Note: the "+1" comes from the loop above which starts at 0 and
81 // ends at num_points_left - 1
82 for (const auto i : make_range(_degree))
83 {
85 knot_vector.push_back(num_points_left - 1);
86 }
87
88 // Normalize values s.t. the the max value is 1.
89 // This must be done to have a constant domain of t to be between 0 and 1 (inclusive).
90 // NOTE: the spacing is uniform, making this a uniform BSpline
91 for (auto & value : knot_vector)
92 {
93 value /= (num_points_left - 1);
94 mooseAssert(value <= 1.0 && value >= 0.0,
95 "knot_vector must be normalized to 1 with minimum value 0.");
96 }
97
98 return knot_vector;
99}
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
void libmesh_ignore(const Args &...)
IntRange< T > make_range(T beg, T end)

◆ CdBBasis()

libMesh::Real Moose::BSpline::CdBBasis ( const libMesh::Real  t,
const unsigned int  i,
const unsigned int  j 
) const
private

Evaluates the the basis function for a B-Spline according to the Cox-de-Boor recursive formula.

Parameters
tparameter t in [0,1]
iindex corresponding to which control point
jdegree of the basis funtion
Returns
scalar quantity for the contribution of the basis function at i in the sum.

Definition at line 102 of file BSpline.C.

103{
104 mooseAssert(i + 1 < _knot_vector.size(), "Out of bounds access in knot vector");
105 mooseAssert(_knot_vector[i] <= _knot_vector[i + 1],
106 "Knot vector is ill-formatted. Ensure values are increasing." +
108 if (j == 0)
109 return ((t < _knot_vector[i + 1]) && (_knot_vector[i] <= t)) ? 1 : 0;
110 else
111 return BSpline::firstCoeff(t, i, j) * BSpline::CdBBasis(t, i, j - 1) +
112 BSpline::secondCoeff(t, i, j) * BSpline::CdBBasis(t, i + 1, j - 1);
113}
libMesh::Real CdBBasis(const libMesh::Real t, const unsigned int i, const unsigned int j) const
Evaluates the the basis function for a B-Spline according to the Cox-de-Boor recursive formula.
Definition BSpline.C:102
libMesh::Real secondCoeff(const libMesh::Real t, const unsigned int i, const unsigned int j) const
Submethod used in CdBBasis routine.
Definition BSpline.C:128
libMesh::Real firstCoeff(const libMesh::Real t, const unsigned int i, const unsigned int j) const
Submethod used in CdBBasis routine.
Definition BSpline.C:116
std::string stringify(const T &t)
conversion to string
Definition Conversion.h:65

Referenced by CdBBasis(), and getPoint().

◆ createControlPoints()

std::vector< libMesh::Point > Moose::BSpline::createControlPoints ( ) const
private

Creates a vector control points from the SplineUtils set of functions.

call SplineUtils function

Definition at line 53 of file BSpline.C.

54{
55 std::vector<libMesh::Point> cps;
59 return cps;
60}
std::vector< Point > bSplineControlPoints(const libMesh::Point &start_point, const libMesh::Point &end_point, const libMesh::RealVectorValue &start_direction, const libMesh::RealVectorValue &end_direction, const unsigned int cps_per_half, const libMesh::Real sharpness, const std::string &caller_name)
Creates control points for an open uniform BSpline.
Definition SplineUtils.C:67

◆ firstCoeff()

libMesh::Real Moose::BSpline::firstCoeff ( const libMesh::Real  t,
const unsigned int  i,
const unsigned int  j 
) const
private

Submethod used in CdBBasis routine.

Parameters
tparameter t in [0,1]
iindex corresponding to which control point
jdegree of the basis funtion

Definition at line 116 of file BSpline.C.

117{
118 mooseAssert(i + j < _knot_vector.size(), "Out of bounds access in knot vector");
119 const auto ti = _knot_vector[i];
120 const auto tij = _knot_vector[i + j];
121 if (ti != tij)
122 return (t - ti) / (tij - ti);
123 else
124 return 0;
125}

Referenced by CdBBasis().

◆ getPoint()

libMesh::Point Moose::BSpline::getPoint ( const libMesh::Real  t) const

Evaluate the BSpline interpolation at given value of t.

Parameters
tthe parameter value, must lie in [0,1]
Returns
libMesh::Point type with format (x,y,z)

Definition at line 40 of file BSpline.C.

41{
42 mooseAssert((t >= 0) && (t <= 1), "t should be in [0, 1]. t=" + std::to_string(t));
43 libMesh::Point returnPoint(0, 0, 0);
44 if (t == 1.0)
45 return _control_points.back();
46 for (const auto i : index_range(_control_points))
47 returnPoint += BSpline::CdBBasis(t, i, _degree) * _control_points[i];
48
49 return returnPoint;
50}
BSpline(const unsigned int degree, const libMesh::Point &start_point, const libMesh::Point &end_point, const libMesh::RealVectorValue &start_direction, const libMesh::RealVectorValue &end_direction, const unsigned int cps_per_half, const libMesh::Real sharpness, const std::string &caller_name)
Definition BSpline.C:18
auto index_range(const T &sizable)

Referenced by BSplineCurveGenerator::generate().

◆ secondCoeff()

libMesh::Real Moose::BSpline::secondCoeff ( const libMesh::Real  t,
const unsigned int  i,
const unsigned int  j 
) const
private

Submethod used in CdBBasis routine.

Parameters
tparameter t in [0,1]
iindex corresponding to which control point
jdegree of the basis funtion

Definition at line 128 of file BSpline.C.

129{
130 mooseAssert(i + j + 1 < _knot_vector.size(), "Out of bounds access in knot vector");
131 libMesh::Real ti1 = _knot_vector[i + 1];
132 libMesh::Real tij1 = _knot_vector[i + j + 1];
133 if (ti1 != tij1)
134 return (tij1 - t) / (tij1 - ti1);
135 else
136 return 0;
137}
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

Referenced by CdBBasis().

Member Data Documentation

◆ _caller_name

const std::string Moose::BSpline::_caller_name
private

Name of the object working with this class, used for error reporting.

Declared before the control points and knot vector because their construction may report errors

Definition at line 100 of file BSpline.h.

Referenced by buildKnotVector(), and createControlPoints().

◆ _control_points

const std::vector<libMesh::Point> Moose::BSpline::_control_points
private

The control points.

Definition at line 102 of file BSpline.h.

Referenced by buildKnotVector(), and getPoint().

◆ _cps_per_half

const unsigned int Moose::BSpline::_cps_per_half
private

number of control points per half of the spline (vertex is auto-included)

Definition at line 95 of file BSpline.h.

Referenced by createControlPoints().

◆ _degree

const unsigned int Moose::BSpline::_degree
private

The polynomial degree of the B-Spline.

Definition at line 85 of file BSpline.h.

Referenced by buildKnotVector(), and getPoint().

◆ _end_dir

const libMesh::RealVectorValue Moose::BSpline::_end_dir
private

ending direction of spline

Definition at line 93 of file BSpline.h.

Referenced by createControlPoints().

◆ _end_point

const libMesh::Point Moose::BSpline::_end_point
private

ending point of spline

Definition at line 89 of file BSpline.h.

Referenced by createControlPoints().

◆ _knot_vector

const std::vector<libMesh::Real> Moose::BSpline::_knot_vector
private

The knot vector.

Size: degree + n_control_points + 1 The multiplicity of each knot influences the continuity of the spline

Definition at line 106 of file BSpline.h.

Referenced by CdBBasis(), firstCoeff(), and secondCoeff().

◆ _sharpness

const libMesh::Real Moose::BSpline::_sharpness
private

sharpness of the curve

Definition at line 97 of file BSpline.h.

Referenced by createControlPoints().

◆ _start_dir

const libMesh::RealVectorValue Moose::BSpline::_start_dir
private

starting direction of spline

Definition at line 91 of file BSpline.h.

Referenced by createControlPoints().

◆ _start_point

const libMesh::Point Moose::BSpline::_start_point
private

starting point of spline

Definition at line 87 of file BSpline.h.

Referenced by createControlPoints().


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