13#include "./InternalHeaderCheck.h"
36 template <
typename Scalar_,
int Dim_,
int _Degree>
45 typedef typename SplineTraits<Spline>::PointType
PointType;
82 template <
typename OtherVectorType,
typename OtherArrayType>
89 template <
int OtherDegree>
91 m_knots(spline.
knots()), m_ctrls(spline.
ctrls()) {}
128 typename SplineTraits<Spline>::DerivativeType
136 template <
int DerivativeOrder>
137 typename SplineTraits<Spline,DerivativeOrder>::DerivativeType
156 typename SplineTraits<Spline>::BasisVectorType
172 typename SplineTraits<Spline>::BasisDerivativeType
180 template <
int DerivativeOrder>
181 typename SplineTraits<Spline,DerivativeOrder>::BasisDerivativeType
187 DenseIndex
degree()
const;
198 static DenseIndex
Span(
typename SplineTraits<Spline>::Scalar u, DenseIndex
degree,
const typename SplineTraits<Spline>::KnotVectorType&
knots);
226 template <
typename DerivativeType>
227 static void BasisFunctionDerivativesImpl(
229 const DenseIndex order,
235 template <
typename Scalar_,
int Dim_,
int _Degree>
242 if (u <= knots(0))
return degree;
243 const Scalar* pos = std::upper_bound(knots.data()+degree-1, knots.data()+knots.size()-degree-1, u);
244 return static_cast<DenseIndex
>( std::distance(knots.data(), pos) - 1 );
247 template <
typename Scalar_,
int Dim_,
int _Degree>
254 const DenseIndex p = degree;
267 for (DenseIndex j=1; j<=p; ++j)
270 for (DenseIndex r=0; r<j; r++)
272 const Scalar tmp = N(r)/(right(r+1)+left(j-r));
273 N[r] = saved + right(r+1)*tmp;
274 saved = left(j-r)*tmp;
281 template <
typename Scalar_,
int Dim_,
int _Degree>
285 return m_knots.size() - m_ctrls.cols() - 1;
290 template <
typename Scalar_,
int Dim_,
int _Degree>
296 template <
typename Scalar_,
int Dim_,
int _Degree>
299 enum { Order = SplineTraits<Spline>::OrderAtCompileTime };
301 const DenseIndex span = this->span(u);
302 const DenseIndex p = degree();
307 return (ctrl_weights * ctrl_pts).rowwise().sum();
312 template <
typename SplineType,
typename DerivativeType>
313 void derivativesImpl(
const SplineType& spline,
typename SplineType::Scalar u, DenseIndex order, DerivativeType& der)
315 enum { Dimension = SplineTraits<SplineType>::Dimension };
316 enum { Order = SplineTraits<SplineType>::OrderAtCompileTime };
317 enum { DerivativeOrder = DerivativeType::ColsAtCompileTime };
319 typedef typename SplineTraits<SplineType>::ControlPointVectorType ControlPointVectorType;
320 typedef typename SplineTraits<SplineType,DerivativeOrder>::BasisDerivativeType BasisDerivativeType;
321 typedef typename BasisDerivativeType::ConstRowXpr BasisDerivativeRowXpr;
323 const DenseIndex p = spline.degree();
324 const DenseIndex span = spline.span(u);
326 const DenseIndex n = (std::min)(p, order);
328 der.resize(Dimension,n+1);
331 const BasisDerivativeType basis_func_ders = spline.template basisFunctionDerivatives<DerivativeOrder>(u, n+1);
334 for (DenseIndex der_order=0; der_order<n+1; ++der_order)
336 const Replicate<BasisDerivativeRowXpr,Dimension,1> ctrl_weights( basis_func_ders.row(der_order) );
337 const Block<const ControlPointVectorType,Dimension,Order> ctrl_pts(spline.ctrls(),0,span-p,Dimension,p+1);
338 der.col(der_order) = (ctrl_weights * ctrl_pts).rowwise().sum();
342 template <
typename Scalar_,
int Dim_,
int _Degree>
343 typename SplineTraits< Spline<Scalar_, Dim_, _Degree> >::DerivativeType
346 typename SplineTraits< Spline >::DerivativeType res;
347 derivativesImpl(*
this, u, order, res);
351 template <
typename Scalar_,
int Dim_,
int _Degree>
352 template <
int DerivativeOrder>
353 typename SplineTraits< Spline<Scalar_, Dim_, _Degree>, DerivativeOrder >::DerivativeType
356 typename SplineTraits< Spline, DerivativeOrder >::DerivativeType res;
357 derivativesImpl(*
this, u, order, res);
361 template <
typename Scalar_,
int Dim_,
int _Degree>
362 typename SplineTraits< Spline<Scalar_, Dim_, _Degree> >::BasisVectorType
371 template <
typename Scalar_,
int Dim_,
int _Degree>
372 template <
typename DerivativeType>
375 const DenseIndex order,
381 enum { Order = SplineTraits<SplineType>::OrderAtCompileTime };
383 const DenseIndex span = SplineType::Span(u, p, U);
385 const DenseIndex n = (std::min)(p, order);
389 BasisVectorType left = BasisVectorType::Zero(p+1);
390 BasisVectorType right = BasisVectorType::Zero(p+1);
392 Matrix<Scalar,Order,Order> ndu(p+1,p+1);
401 left[j] = u-U[span+1-j];
402 right[j] = U[span+j]-u;
405 for (DenseIndex r=0; r<j; ++r)
408 ndu(j,r) = right[r+1]+left[j-r];
409 temp = ndu(r,j-1)/ndu(j,r);
411 ndu(r,j) =
static_cast<Scalar
>(saved+right[r+1] * temp);
412 saved = left[j-r] * temp;
415 ndu(j,j) =
static_cast<Scalar
>(saved);
418 for (j = p; j>=0; --j)
422 DerivativeType a(n+1,p+1);
431 for (DenseIndex k=1; k<=static_cast<DenseIndex>(n); ++k)
434 DenseIndex rk,pk,j1,j2;
439 a(s2,0) = a(s1,0)/ndu(pk+1,rk);
440 d = a(s2,0)*ndu(rk,pk);
446 if (r-1 <= pk) j2 = k-1;
449 for (j=j1; j<=j2; ++j)
451 a(s2,j) = (a(s1,j)-a(s1,j-1))/ndu(pk+1,rk+j);
452 d += a(s2,j)*ndu(rk+j,pk);
457 a(s2,k) = -a(s1,k-1)/ndu(pk+1,r);
458 d += a(s2,k)*ndu(r,pk);
461 N_(k,r) =
static_cast<Scalar
>(d);
462 j = s1; s1 = s2; s2 = j;
469 for (DenseIndex k=1; k<=static_cast<DenseIndex>(n); ++k)
471 for (j=p; j>=0; --j) N_(k,j) *= r;
476 template <
typename Scalar_,
int Dim_,
int _Degree>
477 typename SplineTraits< Spline<Scalar_, Dim_, _Degree> >::BasisDerivativeType
481 BasisFunctionDerivativesImpl(u, order, degree(), knots(), der);
485 template <
typename Scalar_,
int Dim_,
int _Degree>
486 template <
int DerivativeOrder>
487 typename SplineTraits< Spline<Scalar_, Dim_, _Degree>, DerivativeOrder >::BasisDerivativeType
490 typename SplineTraits< Spline<Scalar_, Dim_, _Degree>, DerivativeOrder >::BasisDerivativeType der;
491 BasisFunctionDerivativesImpl(u, order, degree(), knots(), der);
495 template <
typename Scalar_,
int Dim_,
int _Degree>
496 typename SplineTraits<Spline<Scalar_, Dim_, _Degree> >::BasisDerivativeType
499 const DenseIndex order,
500 const DenseIndex degree,
503 typename SplineTraits<Spline>::BasisDerivativeType der;
504 BasisFunctionDerivativesImpl(u, order, degree, knots, der);
A class representing multi-dimensional spline curves.
Definition: Spline.h:38
SplineTraits< Spline >::BasisDerivativeType basisFunctionDerivatives(Scalar u, DenseIndex order) const
Computes the non-zero spline basis function derivatives up to given order.
Definition: Spline.h:478
SplineTraits< Spline >::BasisDerivativeType BasisDerivativeType
The data type used to store the values of the basis function derivatives.
Definition: Spline.h:57
const KnotVectorType & knots() const
Returns the knots of the underlying spline.
Definition: Spline.h:96
Scalar_ Scalar
Definition: Spline.h:40
static DenseIndex Span(typename SplineTraits< Spline >::Scalar u, DenseIndex degree, const typename SplineTraits< Spline >::KnotVectorType &knots)
Computes the span within the provided knot vector in which u is falling.
Definition: Spline.h:236
Spline(const Spline< Scalar, Dimension, OtherDegree > &spline)
Copy constructor for splines.
Definition: Spline.h:90
static BasisDerivativeType BasisFunctionDerivatives(const Scalar u, const DenseIndex order, const DenseIndex degree, const KnotVectorType &knots)
Computes the non-zero spline basis function derivatives up to given order.
Definition: Spline.h:497
SplineTraits< Spline >::ControlPointVectorType ControlPointVectorType
The data type representing the spline's control points.
Definition: Spline.h:60
SplineTraits< Spline >::DerivativeType derivatives(Scalar u, DenseIndex order) const
Evaluation of spline derivatives of up-to given order.
Definition: Spline.h:344
static BasisVectorType BasisFunctions(Scalar u, DenseIndex degree, const KnotVectorType &knots)
Returns the spline's non-zero basis functions.
Definition: Spline.h:249
SplineTraits< Spline >::KnotVectorType KnotVectorType
The data type used to store knot vectors.
Definition: Spline.h:48
Spline()
Creates a (constant) zero spline. For Splines with dynamic degree, the resulting degree will be 0.
Definition: Spline.h:66
PointType operator()(Scalar u) const
Returns the spline value at a given site .
Definition: Spline.h:297
SplineTraits< Spline >::BasisVectorType basisFunctions(Scalar u) const
Computes the non-zero basis functions at the given site.
Definition: Spline.h:363
DenseIndex degree() const
Returns the spline degree.
Definition: Spline.h:282
SplineTraits< Spline >::PointType PointType
The point type the spline is representing.
Definition: Spline.h:45
const ControlPointVectorType & ctrls() const
Returns the ctrls of the underlying spline.
Definition: Spline.h:101
@ Degree
Definition: Spline.h:42
SplineTraits< Spline, DerivativeOrder >::DerivativeType derivatives(Scalar u, DenseIndex order=DerivativeOrder) const
Evaluation of spline derivatives of up-to given order.
SplineTraits< Spline >::ParameterVectorType ParameterVectorType
The data type used to store parameter vectors.
Definition: Spline.h:51
SplineTraits< Spline, DerivativeOrder >::BasisDerivativeType basisFunctionDerivatives(Scalar u, DenseIndex order=DerivativeOrder) const
Computes the non-zero spline basis function derivatives up to given order.
DenseIndex span(Scalar u) const
Returns the span within the knot vector in which u is falling.
Definition: Spline.h:291
SplineTraits< Spline >::BasisVectorType BasisVectorType
The data type used to store non-zero basis functions.
Definition: Spline.h:54
Spline(const OtherVectorType &knots, const OtherArrayType &ctrls)
Creates a spline from a knot vector and control points.
Definition: Spline.h:83
@ Dimension
Definition: Spline.h:41
Namespace containing all symbols from the Eigen library.