Visual Servoing Platform version 3.7.0
Loading...
Searching...
No Matches
vpBSpline Class Reference

#include <vpBSpline.h>

Inheritance diagram for vpBSpline:

Public Member Functions

 vpBSpline ()
unsigned int get_p () const
void get_controlPoints (std::list< vpImagePoint > &list) const
void get_knots (std::list< double > &list) const
void get_crossingPoints (std::list< vpImagePoint > &list) const
void set_p (unsigned int degree)
void set_controlPoints (const std::list< vpImagePoint > &list)
void set_knots (const std::list< double > &list)
void set_crossingPoints (const std::list< vpImagePoint > &list)
unsigned int findSpan (double u) const
vpBasisFunction * computeBasisFuns (double u) const
vpBasisFunction ** computeDersBasisFuns (double u, unsigned int der) const
vpImagePoint computeCurvePoint (double u) const
vpImagePointcomputeCurveDers (double u, unsigned int der) const

Static Public Member Functions

static unsigned int findSpan (double l_u, unsigned int l_p, const std::vector< double > &l_knots)
static vpBasisFunction * computeBasisFuns (double l_u, unsigned int l_i, unsigned int l_p, const std::vector< double > &l_knots)
static vpBasisFunction ** computeDersBasisFuns (double l_u, unsigned int l_i, unsigned int l_p, unsigned int l_der, const std::vector< double > &l_knots)
static vpImagePoint computeCurvePoint (double l_u, unsigned int l_i, unsigned int l_p, const std::vector< double > &l_knots, const std::vector< vpImagePoint > &l_controlPoints)
static vpImagePointcomputeCurveDers (double l_u, unsigned int l_i, unsigned int l_p, unsigned int l_der, const std::vector< double > &l_knots, const std::vector< vpImagePoint > &l_controlPoints)

Public Attributes

 : std::vector<vpImagePoint> controlPoints
std::vector< double > knots
unsigned int p
std::vector< vpImagePointcrossingPoints

Detailed Description

Class that provides tools to compute and manipulate a B-Spline curve.

The different parameters are :

  • The knot vector $ U = {u_0, ... , u_m} $ where the knots $ u_i, i =
0, ...,m $ are real number such as $ u_i < u_{i+1}, i = 0, ...,m $. To define a curve, the knot vector is such as : $ U = {a , ... , a, u_{p+1} ,
... , u_{m-p-1} , b , ... , b} $ where $ a $ and $ b $ are real numbers and p is the degree of the B-Spline basis functions.
  • The B-Spline basis functions $ N_{i,p} $ defined as :

    \‍[ N_{i,0}(u) = \left\{\begin{array}{cc}
1 & \mbox{if } u_i \leq u \leq u_{i+1} \\ 0 & else
\end{array}\right.\‍]

    \‍[ N_{i,p}(u) =
\frac{u-u_i}{u_{i+p}-u_i}N_{i,p-1}(u)+\frac{u_{i+p+1}-u}{u_{i+p+1}-u_{i+1}}N_{i+1,p-1}(u)\‍]

where $ i = 0 , ... , m-1 $ and p is the degree of the B-Spline basis functions.

  • The control points $ {P_i} $ which are defined by the coordinates $(i,j) $ of a point in an image.

It is possible to compute the coordinates of a point corresponding to the knots $ u $ ( $ u \in [u_0,u_m]$) thanks to the formula :

\‍[ C(u) =
\sum_{i=0}^n (N_{i,p}(u)P_i)\‍]

You can find much more information about the B-Splines and the implementation of all the methods in the Nurbs Book.

Examples
BSpline.cpp.

Definition at line 107 of file vpBSpline.h.

Constructor & Destructor Documentation

◆ vpBSpline()

BEGIN_VISP_NAMESPACE vpBSpline::vpBSpline ( )

Basic constructor.

The degree $ p $ of the B-Spline basis functions is set to 3 to compute cubic B-Spline.

Definition at line 43 of file vpBSpline.cpp.

References crossingPoints, knots, and p.

Referenced by vpNurbs::vpNurbs().

Member Function Documentation

◆ computeBasisFuns() [1/2]

vpBasisFunction * vpBSpline::computeBasisFuns ( double l_u,
unsigned int l_i,
unsigned int l_p,
const std::vector< double > & l_knots )
static

Compute the nonvanishing basis functions at $ l_u $ which is in the $ l_i $ th knot interval. All the basis functions are stored in an array such as :

N = $ N_{l_i,0}(l_u) $, $ N_{l_i-1,1}(l_u) $, $ N_{l_i,1}(l_u)
$, ... , $ N_{l_i-k,k}(l_u) $, ..., $ N_{l_i,k}(l_u) $, ... , $N_{l_i-p,p}(l_u) $, ... , $ N_{l_i,p}(l_u) $

Parameters
l_u: A real number which is between the extremities of the knot vector.
l_i: The number of the knot interval in which $ l_u $ lies.
l_p: Degree of the B-Spline basis functions.
l_knots: The knot vector.
Returns
An array containing the nonvanishing basis functions at $ l_u $. The size of the array is $ l_p +1 $.
Examples
BSpline.cpp, and testNurbs.cpp.

Definition at line 124 of file vpBSpline.cpp.

Referenced by computeBasisFuns(), computeCurvePoint(), computeCurvePoint(), vpNurbs::computeCurvePoint(), vpNurbs::computeCurvePoint(), vpNurbs::globalCurveApprox(), and vpNurbs::globalCurveInterp().

◆ computeBasisFuns() [2/2]

vpBasisFunction * vpBSpline::computeBasisFuns ( double u) const

Compute the nonvanishing basis functions at $ u $. All the basis functions are stored in an array such as :

N = $ N_{i,0}(u) $, $ N_{i-1,1}(u) $, $ N_{i,1}(u) $, ... , $N_{i-k,k}(u) $, ..., $ N_{i,k}(u) $, ... , $ N_{i-p,p}(u) $, ... , $ N_{i,p}(u) $

where i the number of the knot interval in which $ u $ lies.

Parameters
u: A real number which is between the extremities of the knot vector
Returns
An array containing the nonvanishing basis functions at $ u $. The size of the array is $ p +1 $.

Definition at line 175 of file vpBSpline.cpp.

References computeBasisFuns(), findSpan(), knots, and p.

◆ computeCurveDers() [1/2]

vpImagePoint * vpBSpline::computeCurveDers ( double l_u,
unsigned int l_i,
unsigned int l_p,
unsigned int l_der,
const std::vector< double > & l_knots,
const std::vector< vpImagePoint > & l_controlPoints )
static

Compute the kth derivatives of $ C(u) $ for $ k = 0, ... , l_{der} $.

The formula used is the following :

\‍[ C^{(k)}(u) = \sum_{i=0}^n (N_{i,p}^{(k)}(u)P_i) \‍]

where $ i $ is the knot interval number in which $ u $ lies and $p $ is the degree of the B-Spline basis function.

Parameters
l_u: A real number which is between the extremities of the knot vector.
l_i: The number of the knot interval in which $ l_u $ lies
l_p: Degree of the B-Spline basis functions.
l_der: The last derivative to be computed.
l_knots: The knot vector.
l_controlPoints: The list of control points.
Returns
An array of size l_der+1 containing the coordinates $ C^{(k)}(u)
$ for $ k = 0, ... , l_der $. The kth derivative is in the kth cell of the array.

Definition at line 428 of file vpBSpline.cpp.

References computeDersBasisFuns(), vpImagePoint::set_i(), vpImagePoint::set_ij(), vpImagePoint::set_j(), and vpTRACE.

◆ computeCurveDers() [2/2]

vpImagePoint * vpBSpline::computeCurveDers ( double u,
unsigned int der ) const

Compute the kth derivatives of $ C(u) $ for $ k = 0, ... , der $.

The formula used is the following :

\‍[ C^{(k)}(u) = \sum_{i=0}^n (N_{i,p}^{(k)}(u)P_i) \‍]

where $ i $ is the knot interval number in which $ u $ lies and $p $ is the degree of the B-Spline basis function.

Parameters
u: A real number which is between the extremities of the knot vector
der: The last derivative to be computed.
Returns
An array of size der+1 containing the coordinates $ C^{(k)}(u) $ for $ k = 0, ... , der $. The kth derivative is in the kth cell of the array.

Definition at line 474 of file vpBSpline.cpp.

References computeDersBasisFuns(), p, vpImagePoint::set_i(), vpImagePoint::set_ij(), vpImagePoint::set_j(), and vpTRACE.

◆ computeCurvePoint() [1/2]

vpImagePoint vpBSpline::computeCurvePoint ( double l_u,
unsigned int l_i,
unsigned int l_p,
const std::vector< double > & l_knots,
const std::vector< vpImagePoint > & l_controlPoints )
static

Compute the coordinates of a point $ C(u) = \sum_{i=0}^n (N_{i,p}(u)P_i)
$ corresponding to the knot $ u $.

Parameters
l_u: A real number which is between the extremities of the knot vector.
l_i: The number of the knot interval in which $ l_u $ lies.
l_p: Degree of the B-Spline basis functions.
l_knots: The knot vector.
l_controlPoints: the list of control points.
Returns
The coordinates of a point corresponding to the knot $ u $.
Examples
BSpline.cpp.

Definition at line 359 of file vpBSpline.cpp.

References computeBasisFuns(), vpImagePoint::set_i(), and vpImagePoint::set_j().

◆ computeCurvePoint() [2/2]

vpImagePoint vpBSpline::computeCurvePoint ( double u) const

Compute the coordinates of a point $ C(u) = \sum_{i=0}^n (N_{i,p}(u)P_i)
$ corresponding to the knot $ u $.

Parameters
u: A real number which is between the extremities of the knot vector.
Returns
The coordinates of a point corresponding to the knot $ u $.

Definition at line 388 of file vpBSpline.cpp.

References computeBasisFuns(), p, vpImagePoint::set_i(), and vpImagePoint::set_j().

◆ computeDersBasisFuns() [1/2]

vpBasisFunction ** vpBSpline::computeDersBasisFuns ( double l_u,
unsigned int l_i,
unsigned int l_p,
unsigned int l_der,
const std::vector< double > & l_knots )
static

Compute the nonzero basis functions and their derivatives until the $l_der $ th derivative. All the functions are computed at l_u.

Warning
The value of $ l_der $ must be under or equal $ l_p $.

The result is given as an array of size l_der+1 x l_p+1. The kth line corresponds to the kth basis functions derivatives.

The formula to compute the kth derivative at $ u $ is :

\‍[ N_{i,p}^{(k)}(u) =p \left( \frac{N_{i,p-1}^{(k-1)}}{u_{i+p}-u_i} -
\frac{N_{i+1,p-1}^{(k-1)}}{u_{i+p+1}-u_{i+1}} \right) \‍]

where $ i $ is the knot interval number in which $ u $ lies and $p $ is the degree of the B-Spline basis function.

Parameters
l_u: A real number which is between the extremities of the knot vector.
l_i: The number of the knot interval in which $ l_u $ lies.
l_p: Degree of the B-Spline basis functions.
l_der: The last derivative to be computed.
l_knots: The knot vector.
Returns
the basis functions and their derivatives as an array of size l_der+1 x l_p+1. The kth line corresponds to the kth basis functions derivatives.

Example : return[0] is the list of the 0th derivatives ie the basis functions. return[k] is the list of the kth derivatives.

Examples
BSpline.cpp, and testNurbs.cpp.

Definition at line 211 of file vpBSpline.cpp.

References vpTRACE.

Referenced by computeCurveDers(), computeCurveDers(), vpNurbs::computeCurveDers(), vpNurbs::computeCurveDers(), and computeDersBasisFuns().

◆ computeDersBasisFuns() [2/2]

vpBasisFunction ** vpBSpline::computeDersBasisFuns ( double u,
unsigned int der ) const

Compute the nonzero basis functions and their derivatives until the $ der
$ th derivative. All the functions are computed at u.

Warning
The value of $ der $ must be under or equal $ p $.

The result is given as an array of size der+1 x p+1. The kth line corresponds to the kth basis functions derivatives.

The formula to compute the kth derivative at $ u $ is :

\‍[ N_{i,p}^{(k)}(u) =p \left( \frac{N_{i,p-1}^{(k-1)}}{u_{i+p}-u_i} -
\frac{N_{i+1,p-1}^{(k-1)}}{u_{i+p+1}-u_{i+1}} \right) \‍]

where $ i $ is the knot interval number in which $ u $ lies and $p $ is the degree of the B-Spline basis function.

Parameters
u: A real number which is between the extremities of the knot vector
der: The last derivative to be computed.
Returns
The basis functions and their derivatives as an array of size der+1 x p+1. The kth line corresponds to the kth basis functions derivatives.

Example : return[0] is the list of the 0th derivatives ie the basis functions. return[k] is the list of the kth derivatives.

Definition at line 341 of file vpBSpline.cpp.

References computeDersBasisFuns(), findSpan(), knots, and p.

◆ findSpan() [1/2]

unsigned int vpBSpline::findSpan ( double l_u,
unsigned int l_p,
const std::vector< double > & l_knots )
static

Find the knot interval in which the parameter $ l_u $ lies. Indeed $ l_u \in [u_i, u_{i+1}[ $.

Example : The knot vector is the following $ U = \{0,  0 , 1 , 2 ,3 , 3\}
$ with $ p $ is equal to 1.

  • For $ l_u $ equal to 0.5 the method will return 1.
  • For $ l_u $ equal to 2.5 the method will return 3.
  • For $ l_u $ equal to 3 the method will return 3.
Parameters
l_u: The knot whose knot interval is seeked.
l_p: Degree of the B-Spline basis functions.
l_knots: The knot vector.
Returns
the number of the knot interval in which $ l_u $ lies.
Examples
BSpline.cpp, and testNurbs.cpp.

Definition at line 63 of file vpBSpline.cpp.

References vpMath::maximum(), and vpMath::round().

Referenced by computeBasisFuns(), vpNurbs::computeCurveDersPoint(), computeDersBasisFuns(), vpNurbs::curveKnotIns(), findSpan(), vpNurbs::globalCurveApprox(), vpNurbs::globalCurveInterp(), and vpNurbs::refineKnotVectCurve().

◆ findSpan() [2/2]

unsigned int vpBSpline::findSpan ( double u) const

Find the knot interval in which the parameter $ u $ lies. Indeed $ u \in [u_i, u_{i+1}[ $.

Example : The knot vector is the following $ U = \{0,  0 , 1 , 2 ,3 , 3\}
$ with $ p $ is equal to 1.

  • For $ u $ equal to 0.5 the method will return 1.
  • For $ u $ equal to 2.5 the method will return 3.
  • For $ u $ equal to 3 the method will return 3.
Parameters
u: The knot whose knot interval is seeked.
Returns
the number of the knot interval in which $ u $ lies.

Definition at line 106 of file vpBSpline.cpp.

References findSpan(), knots, and p.

◆ get_controlPoints()

void vpBSpline::get_controlPoints ( std::list< vpImagePoint > & list) const
inline

Gets all the control points.

Parameters
list: A std::list containing the coordinates of the control points.
Examples
BSpline.cpp, and testNurbs.cpp.

Definition at line 135 of file vpBSpline.h.

◆ get_crossingPoints()

void vpBSpline::get_crossingPoints ( std::list< vpImagePoint > & list) const
inline

Gets all the crossing points (used in the interpolation method)

Parameters
list: A std::list containing the coordinates of the crossing points.

Definition at line 162 of file vpBSpline.h.

References crossingPoints.

◆ get_knots()

void vpBSpline::get_knots ( std::list< double > & list) const
inline

Gets all the knots.

Parameters
list: A std::list containing the value of the knots.
Examples
BSpline.cpp, and testNurbs.cpp.

Definition at line 148 of file vpBSpline.h.

References knots.

◆ get_p()

unsigned int vpBSpline::get_p ( ) const
inline

Gets the degree of the B-Spline.

Returns
the degree of the B-Spline.
Examples
BSpline.cpp, and testNurbs.cpp.

Definition at line 127 of file vpBSpline.h.

References p.

◆ set_controlPoints()

void vpBSpline::set_controlPoints ( const std::list< vpImagePoint > & list)
inline

Sets all the control points.

Parameters
list: A std::list containing the coordinates of the control points
Examples
BSpline.cpp, and testNurbs.cpp.

Definition at line 182 of file vpBSpline.h.

◆ set_crossingPoints()

void vpBSpline::set_crossingPoints ( const std::list< vpImagePoint > & list)
inline

Sets all the crossing points (used in the interpolation method)

Parameters
list: A std::list containing the coordinates of the crossing points

Definition at line 209 of file vpBSpline.h.

References crossingPoints.

◆ set_knots()

void vpBSpline::set_knots ( const std::list< double > & list)
inline

Sets all the knots.

Parameters
list: A std::list containing the value of the knots.
Examples
BSpline.cpp, and testNurbs.cpp.

Definition at line 195 of file vpBSpline.h.

References knots.

◆ set_p()

void vpBSpline::set_p ( unsigned int degree)
inline

Sets the degree of the B-Spline.

Parameters
degree: the degree of the B-Spline.
Examples
BSpline.cpp, and testNurbs.cpp.

Definition at line 175 of file vpBSpline.h.

Member Data Documentation

◆ __pad0__

vpBSpline::__pad0__

Definition at line 236 of file vpBSpline.h.

◆ crossingPoints

std::vector<vpImagePoint> vpBSpline::crossingPoints

Vector which contains the points used during the interpolation method.

Definition at line 117 of file vpBSpline.h.

Referenced by get_crossingPoints(), vpNurbs::globalCurveApprox(), vpNurbs::globalCurveInterp(), set_crossingPoints(), and vpBSpline().

◆ knots

◆ p