1 #ifndef _SplineFunction_Spline_h_
2 #define _SplineFunction_Spline_h_
9 #include <utl/AugerException.h>
13 typedef unsigned char dim_t;
15 template <dim_t ADimension,
typename AKnotVector,
typename ABasisFunction>
23 for (
dim_t idim = 0; idim < ADimension; ++idim)
24 fCacheX[idim] = std::numeric_limits<double>::quiet_NaN();
34 for (
size_t k = 0; k < size+2; ++k)
48 for (
dim_t idim = 0; idim < ADimension-1; ++idim)
53 for (
size_t idim = 0; idim < ADimension; ++idim)
57 for (
size_t j = 0; j < (1 << 2*ADimension); ++j)
61 for (
dim_t idim = 0; idim < ADimension; ++idim)
63 const size_t kk = j % (1 << 2*(idim+1)) / (1 << 2*idim);
69 result += coefs[k]*basis;
72 for (
size_t idim = 0; idim < ADimension; ++idim)
80 GetKnotVector(
const dim_t idim)
88 GetBasisVector(
const dim_t idim)
96 GetSize(
const dim_t idim)
104 GetStart(
const dim_t idim)
112 GetStop(
const dim_t idim)
128 template<
typename AKnotVector,
typename ABasisFunction>
147 const size_t size = fKnotVector.GetSize();
148 fBasisVector.resize(size+2);
149 for (
size_t k = 0; k < size+2; ++k)
150 fBasisVector[k] = ABasisFunction(&fKnotVector, k);
155 operator()(
const double* coefs,
const double x,
const char derivative=0)
158 const size_t i = fKnotVector.Locate(x);
159 const size_t kBegin = derivative >= 0 ? i : 0;
160 const size_t kEnd = derivative >= 0 ? i+4 : GetSize();
162 for (
size_t k = kBegin; k < kEnd; ++k)
163 result += coefs[k]*fBasisVector[k].Internal(i,x,derivative);
168 const ABasisFunction&
172 return fBasisVector[k];
185 GetKnotVector(
const dim_t)
201 GetBasisVector(
const dim_t)
212 return fBasisVector.size();
220 return fBasisVector.size();
228 return fKnotVector.GetStart();
233 GetStart(
const dim_t)
236 return fKnotVector.GetStart();
244 return fKnotVector.GetStop();
252 return fKnotVector.GetStop();
void Configure(const dim_t, const AKnotVector &knots)
BasisVector fBasisVectors[ADimension]
double fCacheX[ADimension]
const ABasisFunction & operator[](const size_t k) const
AKnotVector fKnotVectors[ADimension]
Function(const AKnotVector &knots)
std::vector< ABasisFunction > BasisVector
void Configure(const dim_t idim, const AKnotVector &knots)
double operator()(const double *coefs, const double x, const char derivative=0) const
size_t fStrides[ADimension]
double fCacheBasis[ADimension][4]
double operator()(const double *coefs, const double *x) const
std::vector< ABasisFunction > BasisVector