10 #ifndef EIGEN_SPLINE_H 11 #define EIGEN_SPLINE_H 34 template <
typename _Scalar,
int _Dim,
int _Degree>
74 template <
typename OtherVectorType,
typename OtherArrayType>
81 template <
int OtherDegree>
128 template <
int DerivativeOrder>
172 template <
int DerivativeOrder>
212 template <
typename _Scalar,
int _Dim,
int _Degree>
220 const Scalar* pos = std::upper_bound(knots.data()+degree-1, knots.data()+knots.size()-degree-1, u);
221 return static_cast<DenseIndex>( std::distance(knots.data(), pos) - 1 );
224 template <
typename _Scalar,
int _Dim,
int _Degree>
238 BasisVectorType left(p+1); left(0) =
Scalar(0);
239 BasisVectorType right(p+1); right(0) =
Scalar(0);
244 BasisVectorType
N(1,p+1);
251 const Scalar tmp =
N(r)/(right(r+1)+left(j-r));
252 N[r] = saved + right(r+1)*tmp;
253 saved = left(j-r)*tmp;
260 template <
typename _Scalar,
int _Dim,
int _Degree>
269 template <
typename _Scalar,
int _Dim,
int _Degree>
275 template <
typename _Scalar,
int _Dim,
int _Degree>
286 return (ctrl_weights * ctrl_pts).rowwise().sum();
291 template <
typename SplineType,
typename DerivativeType>
296 enum { DerivativeOrder = DerivativeType::ColsAtCompileTime };
310 const BasisDerivativeType basis_func_ders = spline.template basisFunctionDerivatives<DerivativeOrder>(u, n+1);
313 for (
DenseIndex der_order=0; der_order<n+1; ++der_order)
317 der.col(der_order) = (ctrl_weights * ctrl_pts).rowwise().sum();
321 template <
typename _Scalar,
int _Dim,
int _Degree>
330 template <
typename _Scalar,
int _Dim,
int _Degree>
331 template <
int DerivativeOrder>
340 template <
typename _Scalar,
int _Dim,
int _Degree>
349 template <
typename SplineType,
typename DerivativeType>
358 const KnotVectorType&
U = spline.knots();
367 BasisVectorType left = BasisVectorType::Zero(p+1);
368 BasisVectorType right = BasisVectorType::Zero(p+1);
379 left[j] = u-U[span+1-j];
380 right[j] = U[span+j]-u;
386 ndu(j,r) = right[r+1]+left[j-r];
387 temp = ndu(r,j-1)/ndu(j,r);
389 ndu(r,j) =
static_cast<Scalar
>(saved+right[r+1] * temp);
390 saved = left[j-r] * temp;
393 ndu(j,j) =
static_cast<Scalar
>(saved);
396 for (j = p; j>=0; --j)
400 DerivativeType a(n+1,p+1);
409 for (
DenseIndex k=1; k<=static_cast<DenseIndex>(n); ++k)
417 a(s2,0) = a(s1,0)/ndu(pk+1,rk);
418 d = a(s2,0)*ndu(rk,pk);
424 if (r-1 <= pk) j2 = k-1;
427 for (j=j1; j<=j2; ++j)
429 a(s2,j) = (a(s1,j)-a(s1,j-1))/ndu(pk+1,rk+j);
430 d += a(s2,j)*ndu(rk+j,pk);
435 a(s2,k) = -a(s1,k-1)/ndu(pk+1,r);
436 d += a(s2,k)*ndu(r,pk);
439 N_(k,r) =
static_cast<Scalar
>(d);
440 j = s1; s1 = s2; s2 = j;
447 for (
DenseIndex k=1; k<=static_cast<DenseIndex>(n); ++k)
454 template <
typename _Scalar,
int _Dim,
int _Degree>
455 typename SplineTraits< Spline<_Scalar, _Dim, _Degree> >::BasisDerivativeType
463 template <
typename _Scalar,
int _Dim,
int _Degree>
464 template <
int DerivativeOrder>
465 typename SplineTraits< Spline<_Scalar, _Dim, _Degree>, DerivativeOrder >::BasisDerivativeType
474 #endif // EIGEN_SPLINE_H
A class representing multi-dimensional spline curves.
void derivativesImpl(const SplineType &spline, typename SplineType::Scalar u, DenseIndex order, DerivativeType &der)
static BasisVectorType BasisFunctions(Scalar u, DenseIndex degree, const KnotVectorType &knots)
Returns the spline's non-zero basis functions.
SplineTraits< Spline >::PointType PointType
The point type the spline is representing.
DenseIndex degree() const
Returns the spline degree.
SplineTraits< Spline >::BasisVectorType basisFunctions(Scalar u) const
Computes the non-zero basis functions at the given site.
iterative scaling algorithm to equilibrate rows and column norms in matrices
DenseIndex span(Scalar u) const
Returns the span within the knot vector in which u is falling.
Expression of a fixed-size or dynamic-size sub-vector.
const ControlPointVectorType & ctrls() const
Returns the knots of the underlying spline.
ControlPointVectorType m_ctrls
Spline()
Creates a (constant) zero spline. For Splines with dynamic degree, the resulting degree will be 0...
Expression of the multiple replication of a matrix or vector.
PointType operator()(Scalar u) const
Returns the spline value at a given site .
const Block< const Derived, 1, internal::traits< Derived >::ColsAtCompileTime, IsRowMajor > ConstRowXpr
static DenseIndex Span(typename SplineTraits< Spline >::Scalar u, DenseIndex degree, const typename SplineTraits< Spline >::KnotVectorType &knots)
Computes the spang within the provided knot vector in which u is falling.
SplineTraits< Spline >::BasisDerivativeType basisFunctionDerivatives(Scalar u, DenseIndex order) const
Computes the non-zero spline basis function derivatives up to given order.
const KnotVectorType & knots() const
Returns the knots of the underlying spline.
EIGEN_DEFAULT_DENSE_INDEX_TYPE DenseIndex
SplineTraits< Spline >::ControlPointVectorType ControlPointVectorType
The data type representing the spline's control points.
SplineTraits< Spline >::DerivativeType derivatives(Scalar u, DenseIndex order) const
Evaluation of spline derivatives of up-to given order.
Spline(const Spline< Scalar, Dimension, OtherDegree > &spline)
Copy constructor for splines.
Expression of a fixed-size or dynamic-size block.
void basisFunctionDerivativesImpl(const SplineType &spline, typename SplineType::Scalar u, DenseIndex order, DerivativeType &N_)
Spline(const OtherVectorType &knots, const OtherArrayType &ctrls)
Creates a spline from a knot vector and control points.
General-purpose arrays with easy API for coefficient-wise operations.
SplineTraits< Spline >::BasisVectorType BasisVectorType
The data type used to store non-zero basis functions.
SplineTraits< Spline >::KnotVectorType KnotVectorType
The data type used to store knot vectors.
The matrix class, also used for vectors and row-vectors.