15#include "./InternalHeaderCheck.h"
43template <
typename Scalar_,
int Dim_,
int Degree_>
51 typedef typename SplineTraits<Spline>::PointType
PointType;
87 template <
typename OtherVectorType,
typename OtherArrayType>
94 template <
int OtherDegree>
139 template <
int DerivativeOrder>
141 DenseIndex order = DerivativeOrder)
const;
181 template <
int DerivativeOrder>
183 Scalar u, DenseIndex order = DerivativeOrder)
const;
199 static DenseIndex
Span(
typename SplineTraits<Spline>::Scalar u, DenseIndex
degree,
200 const typename SplineTraits<Spline>::KnotVectorType&
knots);
228 template <
typename DerivativeType>
230 const DenseIndex order,
const DenseIndex p,
235template <
typename Scalar_,
int Dim_,
int Degree_>
242 return static_cast<DenseIndex
>(std::distance(
knots.data(), pos) - 1);
245template <
typename Scalar_,
int Dim_,
int Degree_>
249 const DenseIndex p =
degree;
265 for (DenseIndex j = 1; j <= p; ++j) {
267 for (DenseIndex r = 0; r < j; r++) {
268 const Scalar tmp = N(r) / (right(r + 1) + left(j - r));
269 N[r] = saved + right(r + 1) * tmp;
270 saved = left(j - r) * tmp;
277template <
typename Scalar_,
int Dim_,
int Degree_>
279 EIGEN_IF_CONSTEXPR (Degree_ == Dynamic)
280 return m_knots.size() - m_ctrls.cols() - 1;
285template <
typename Scalar_,
int Dim_,
int Degree_>
290template <
typename Scalar_,
int Dim_,
int Degree_>
292 enum { Order = SplineTraits<Spline>::OrderAtCompileTime };
294 const DenseIndex
span = this->span(u);
295 const DenseIndex p =
degree();
300 return (ctrl_weights * ctrl_pts).rowwise().sum();
305template <
typename SplineType,
typename DerivativeType>
306void derivativesImpl(
const SplineType& spline,
typename SplineType::Scalar u, DenseIndex order, DerivativeType& der) {
307 enum { Dimension = SplineTraits<SplineType>::Dimension };
308 enum { Order = SplineTraits<SplineType>::OrderAtCompileTime };
309 enum { DerivativeOrder = DerivativeType::ColsAtCompileTime };
311 typedef typename SplineTraits<SplineType>::ControlPointVectorType ControlPointVectorType;
312 typedef typename SplineTraits<SplineType, DerivativeOrder>::BasisDerivativeType BasisDerivativeType;
313 typedef typename BasisDerivativeType::ConstRowXpr BasisDerivativeRowXpr;
315 const DenseIndex p = spline.degree();
316 const DenseIndex span = spline.span(u);
318 const DenseIndex n = (std::min)(p, order);
320 der.resize(Dimension, n + 1);
323 const BasisDerivativeType basis_func_ders = spline.template basisFunctionDerivatives<DerivativeOrder>(u, n + 1);
326 for (DenseIndex der_order = 0; der_order < n + 1; ++der_order) {
329 der.col(der_order) = (ctrl_weights * ctrl_pts).rowwise().sum();
333template <
typename Scalar_,
int Dim_,
int Degree_>
335 Scalar u, DenseIndex order)
const {
336 typename SplineTraits<Spline>::DerivativeType res;
337 derivativesImpl(*
this, u, order, res);
341template <
typename Scalar_,
int Dim_,
int Degree_>
342template <
int DerivativeOrder>
343typename SplineTraits<Spline<Scalar_, Dim_, Degree_>, DerivativeOrder>::DerivativeType
345 typename SplineTraits<Spline, DerivativeOrder>::DerivativeType res;
346 derivativesImpl(*
this, u, order, res);
350template <
typename Scalar_,
int Dim_,
int Degree_>
358template <
typename Scalar_,
int Dim_,
int Degree_>
359template <
typename DerivativeType>
360void Spline<Scalar_, Dim_, Degree_>::BasisFunctionDerivativesImpl(
364 enum { Order = SplineTraits<SplineType>::OrderAtCompileTime };
366 const DenseIndex span = SplineType::Span(u, p, U);
368 const DenseIndex n = (std::min)(p, order);
370 N_.resize(n + 1, p + 1);
372 BasisVectorType left = BasisVectorType::Zero(p + 1);
373 BasisVectorType right = BasisVectorType::Zero(p + 1);
375 Matrix<Scalar, Order, Order> ndu(p + 1, p + 1);
382 for (j = 1; j <= p; ++j) {
383 left[j] = u - U[span + 1 - j];
384 right[j] = U[span + j] - u;
387 for (DenseIndex r = 0; r < j; ++r) {
389 ndu(j, r) = right[r + 1] + left[j - r];
390 temp = ndu(r, j - 1) / ndu(j, r);
392 ndu(r, j) =
static_cast<Scalar
>(saved + right[r + 1] * temp);
393 saved = left[j - r] * temp;
396 ndu(j, j) =
static_cast<Scalar
>(saved);
399 for (j = p; j >= 0; --j) N_(0, j) = ndu(j, p);
402 DerivativeType a(n + 1, p + 1);
404 for (; r <= p; ++r) {
411 for (DenseIndex k = 1; k <= static_cast<DenseIndex>(n); ++k) {
413 DenseIndex rk, pk, j1, j2;
418 a(s2, 0) = a(s1, 0) / ndu(pk + 1, rk);
419 d = a(s2, 0) * ndu(rk, pk);
432 for (j = j1; j <= j2; ++j) {
433 a(s2, j) = (a(s1, j) - a(s1, j - 1)) / ndu(pk + 1, rk + j);
434 d += a(s2, j) * ndu(rk + j, pk);
438 a(s2, k) = -a(s1, k - 1) / ndu(pk + 1, r);
439 d += a(s2, k) * ndu(r, pk);
442 N_(k, r) =
static_cast<Scalar
>(d);
452 for (DenseIndex k = 1; k <= static_cast<DenseIndex>(n); ++k) {
453 for (j = p; j >= 0; --j) N_(k, j) *= r;
458template <
typename Scalar_,
int Dim_,
int Degree_>
459typename SplineTraits<Spline<Scalar_, Dim_, Degree_> >::BasisDerivativeType
462 BasisFunctionDerivativesImpl(u, order,
degree(),
knots(), der);
466template <
typename Scalar_,
int Dim_,
int Degree_>
467template <
int DerivativeOrder>
468typename SplineTraits<Spline<Scalar_, Dim_, Degree_>, DerivativeOrder>::BasisDerivativeType
471 BasisFunctionDerivativesImpl(u, order,
degree(),
knots(), der);
475template <
typename Scalar_,
int Dim_,
int Degree_>
476typename SplineTraits<Spline<Scalar_, Dim_, Degree_> >::BasisDerivativeType
480 typename SplineTraits<Spline>::BasisDerivativeType der;
481 BasisFunctionDerivativesImpl(u, order,
degree,
knots, der);
A class representing multi-dimensional spline curves.
Definition Spline.h:44
Spline(const OtherVectorType &knots, const OtherArrayType &ctrls)
Creates a spline from a knot vector and control points.
Definition Spline.h:88
DenseIndex degree() const
Returns the spline degree.
Definition Spline.h:278
PointType operator()(Scalar u) const
Returns the spline value at a given site .
Definition Spline.h:291
@ Degree
Definition Spline.h:48
const KnotVectorType & knots() const
Definition Spline.h:100
SplineTraits< Spline >::ParameterVectorType ParameterVectorType
The data type used to store parameter vectors.
Definition Spline.h:57
SplineTraits< Spline >::BasisDerivativeType basisFunctionDerivatives(Scalar u, DenseIndex order) const
Computes the non-zero spline basis function derivatives up to given order.
Definition Spline.h:460
Spline(const Spline< Scalar, Dimension, OtherDegree > &spline)
Copy constructor for splines.
Definition Spline.h:95
SplineTraits< Spline, DerivativeOrder >::DerivativeType derivatives(Scalar u, DenseIndex order=DerivativeOrder) const
Evaluation of spline derivatives of up-to given order.
Definition Spline.h:344
SplineTraits< Spline, DerivativeOrder >::BasisDerivativeType basisFunctionDerivatives(Scalar u, DenseIndex order=DerivativeOrder) const
Computes the non-zero spline basis function derivatives up to given order.
Definition Spline.h:469
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
SplineTraits< Spline >::KnotVectorType KnotVectorType
The data type used to store knot vectors.
Definition Spline.h:54
SplineTraits< Spline >::ControlPointVectorType ControlPointVectorType
The data type representing the spline's control points.
Definition Spline.h:66
@ Dimension
Definition Spline.h:47
DenseIndex span(Scalar u) const
Returns the span within the knot vector in which u is falling.
Definition Spline.h:286
Spline()
Creates a (constant) zero spline. For Splines with dynamic degree, the resulting degree will be 0.
Definition Spline.h:72
SplineTraits< Spline >::PointType PointType
The point type the spline is representing.
Definition Spline.h:51
SplineTraits< Spline >::BasisVectorType BasisVectorType
The data type used to store non-zero basis functions.
Definition Spline.h:60
SplineTraits< Spline >::BasisDerivativeType BasisDerivativeType
The data type used to store the values of the basis function derivatives.
Definition Spline.h:63
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:477
static BasisVectorType BasisFunctions(Scalar u, DenseIndex degree, const KnotVectorType &knots)
Returns the spline's non-zero basis functions.
Definition Spline.h:246
Scalar_ Scalar
Definition Spline.h:46
SplineTraits< Spline >::DerivativeType derivatives(Scalar u, DenseIndex order) const
Evaluation of spline derivatives of up-to given order.
Definition Spline.h:334
SplineTraits< Spline >::BasisVectorType basisFunctions(Scalar u) const
Computes the non-zero basis functions at the given site.
Definition Spline.h:351
const ControlPointVectorType & ctrls() const
Definition Spline.h:105
Namespace containing all symbols from the Eigen library.