10 #ifndef EIGEN_SPLINE_H
11 #define EIGEN_SPLINE_H
36 template <
typename Scalar_,
int Dim_,
int Degree_>
80 template <
typename OtherVectorType,
typename OtherArrayType>
87 template <
int OtherDegree>
132 template <
int DerivativeOrder>
174 template <
int DerivativeOrder>
221 template <
typename DerivativeType>
228 template <
typename Scalar_,
int Dim_,
int Degree_>
233 if (u <= knots(0))
return degree;
234 const Scalar* pos = std::upper_bound(knots.data() +
degree - 1, knots.data() + knots.size() -
degree - 1, u);
235 return static_cast<DenseIndex>(std::distance(knots.data(), pos) - 1);
238 template <
typename Scalar_,
int Dim_,
int Degree_>
262 N[
r] = saved + right(
r + 1) *
tmp;
263 saved = left(
j -
r) *
tmp;
270 template <
typename Scalar_,
int Dim_,
int Degree_>
273 return m_knots.size() - m_ctrls.cols() - 1;
278 template <
typename Scalar_,
int Dim_,
int Degree_>
283 template <
typename Scalar_,
int Dim_,
int Degree_>
293 return (ctrl_weights * ctrl_pts).rowwise().sum();
298 template <
typename SplineType,
typename DerivativeType>
302 enum { DerivativeOrder = DerivativeType::ColsAtCompileTime };
306 typedef typename BasisDerivativeType::ConstRowXpr BasisDerivativeRowXpr;
313 der.resize(Dimension,
n + 1);
316 const BasisDerivativeType basis_func_ders = spline.template basisFunctionDerivatives<DerivativeOrder>(u,
n + 1);
319 for (
DenseIndex der_order = 0; der_order <
n + 1; ++der_order) {
322 der.col(der_order) = (ctrl_weights * ctrl_pts).rowwise().sum();
326 template <
typename Scalar_,
int Dim_,
int Degree_>
334 template <
typename Scalar_,
int Dim_,
int Degree_>
335 template <
int DerivativeOrder>
343 template <
typename Scalar_,
int Dim_,
int Degree_>
351 template <
typename Scalar_,
int Dim_,
int Degree_>
352 template <
typename DerivativeType>
363 N_.resize(
n + 1,
p + 1);
375 for (
j = 1;
j <=
p; ++
j) {
376 left[
j] = u -
U[span + 1 -
j];
377 right[
j] =
U[span +
j] - u;
382 ndu(
j,
r) = right[
r + 1] + left[
j -
r];
383 temp = ndu(
r,
j - 1) / ndu(
j,
r);
385 ndu(
r,
j) =
static_cast<Scalar>(saved + right[
r + 1] * temp);
386 saved = left[
j -
r] * temp;
389 ndu(
j,
j) =
static_cast<Scalar>(saved);
392 for (
j =
p;
j >= 0; --
j) N_(0,
j) = ndu(
j,
p);
395 DerivativeType
a(
n + 1,
p + 1);
397 for (;
r <=
p; ++
r) {
404 for (
DenseIndex k = 1; k <= static_cast<DenseIndex>(
n); ++
k) {
411 a(s2, 0) =
a(s1, 0) / ndu(pk + 1, rk);
412 d =
a(s2, 0) * ndu(rk, pk);
425 for (
j = j1;
j <= j2; ++
j) {
426 a(s2,
j) = (
a(s1,
j) -
a(s1,
j - 1)) / ndu(pk + 1, rk +
j);
427 d +=
a(s2,
j) * ndu(rk +
j, pk);
431 a(s2,
k) = -
a(s1,
k - 1) / ndu(pk + 1,
r);
432 d +=
a(s2,
k) * ndu(
r, pk);
445 for (
DenseIndex k = 1; k <= static_cast<DenseIndex>(
n); ++
k) {
446 for (
j =
p;
j >= 0; --
j) N_(
k,
j) *=
r;
451 template <
typename Scalar_,
int Dim_,
int Degree_>
455 BasisFunctionDerivativesImpl(u, order,
degree(), knots(), der);
459 template <
typename Scalar_,
int Dim_,
int Degree_>
460 template <
int DerivativeOrder>
464 BasisFunctionDerivativesImpl(u, order,
degree(), knots(), der);
468 template <
typename Scalar_,
int Dim_,
int Degree_>
469 typename SplineTraits<Spline<Scalar_, Dim_, Degree_> >::BasisDerivativeType
474 BasisFunctionDerivativesImpl(u, order,
degree, knots, der);
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
cout<< "Here is the matrix m:"<< endl<< m<< endl;Matrix< ptrdiff_t, 3, 1 > res
Definition: PartialRedux_count.cpp:3
float * p
Definition: Tutorial_Map_using.cpp:9
SCALAR Scalar
Definition: bench_gemm.cpp:45
General-purpose arrays with easy API for coefficient-wise operations.
Definition: Array.h:48
Expression of a fixed-size or dynamic-size block.
Definition: Block.h:110
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
Expression of the multiple replication of a matrix or vector.
Definition: Replicate.h:64
A class representing multi-dimensional spline curves.
Definition: Spline.h:37
Spline(const OtherVectorType &knots, const OtherArrayType &ctrls)
Creates a spline from a knot vector and control points.
Definition: Spline.h:81
@ Degree
Definition: Spline.h:41
DenseIndex degree() const
Returns the spline degree.
Definition: Spline.h:271
SplineTraits< Spline >::DerivativeType derivatives(Scalar u, DenseIndex order) const
Evaluation of spline derivatives of up-to given order.
Definition: Spline.h:327
PointType operator()(Scalar u) const
Returns the spline value at a given site .
Definition: Spline.h:284
SplineTraits< Spline, DerivativeOrder >::DerivativeType derivatives(Scalar u, DenseIndex order=DerivativeOrder) const
Evaluation of spline derivatives of up-to given order.
KnotVectorType m_knots
Definition: Spline.h:218
static void BasisFunctionDerivativesImpl(const typename Spline< Scalar_, Dim_, Degree_ >::Scalar u, const DenseIndex order, const DenseIndex p, const typename Spline< Scalar_, Dim_, Degree_ >::KnotVectorType &U, DerivativeType &N_)
Definition: Spline.h:353
SplineTraits< Spline >::ParameterVectorType ParameterVectorType
The data type used to store parameter vectors.
Definition: Spline.h:50
SplineTraits< Spline >::BasisDerivativeType basisFunctionDerivatives(Scalar u, DenseIndex order) const
Computes the non-zero spline basis function derivatives up to given order.
Definition: Spline.h:453
const ControlPointVectorType & ctrls() const
Returns the ctrls of the underlying spline.
Definition: Spline.h:98
Spline(const Spline< Scalar, Dimension, OtherDegree > &spline)
Copy constructor for splines.
Definition: Spline.h:88
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:229
SplineTraits< Spline >::KnotVectorType KnotVectorType
The data type used to store knot vectors.
Definition: Spline.h:47
SplineTraits< Spline >::ControlPointVectorType ControlPointVectorType
The data type representing the spline's control points.
Definition: Spline.h:59
@ Dimension
Definition: Spline.h:40
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:279
Spline()
Creates a (constant) zero spline. For Splines with dynamic degree, the resulting degree will be 0.
Definition: Spline.h:65
SplineTraits< Spline >::PointType PointType
The point type the spline is representing.
Definition: Spline.h:44
SplineTraits< Spline >::BasisVectorType BasisVectorType
The data type used to store non-zero basis functions.
Definition: Spline.h:53
SplineTraits< Spline >::BasisDerivativeType BasisDerivativeType
The data type used to store the values of the basis function derivatives.
Definition: Spline.h:56
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:470
static BasisVectorType BasisFunctions(Scalar u, DenseIndex degree, const KnotVectorType &knots)
Returns the spline's non-zero basis functions.
Definition: Spline.h:239
Scalar_ Scalar
Definition: Spline.h:39
const KnotVectorType & knots() const
Returns the knots of the underlying spline.
Definition: Spline.h:93
ControlPointVectorType m_ctrls
Definition: Spline.h:219
SplineTraits< Spline >::BasisVectorType basisFunctions(Scalar u) const
Computes the non-zero basis functions at the given site.
Definition: Spline.h:344
Expression of a fixed-size or dynamic-size sub-vector.
Definition: VectorBlock.h:58
@ N
Definition: constructor.cpp:22
#define min(a, b)
Definition: datatypes.h:22
const Scalar * a
Definition: level2_cplx_impl.h:32
char char char int int * k
Definition: level2_impl.h:374
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
EIGEN_DEFAULT_DENSE_INDEX_TYPE DenseIndex
Definition: Meta.h:75
const int Dynamic
Definition: Constants.h:25
void derivativesImpl(const SplineType &spline, typename SplineType::Scalar u, DenseIndex order, DerivativeType &der)
Definition: Spline.h:299
double U
Swimming speed.
Definition: two_d_variable_diff_adapt.cc:53
const Mdouble degree
Definition: ExtendedMath.h:32
double Zero
Definition: pseudosolid_node_update_elements.cc:35
Definition: SplineFwd.h:22
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2