33#ifndef itkBSplineKernelFunction2_h
34#define itkBSplineKernelFunction2_h
37#include <vnl/vnl_math.h>
57template <
unsigned int VSplineOrder = 3>
111 Evaluate(
const double & u,
double * weights)
const override
122 PrintSelf(std::ostream & os, Indent indent)
const override
124 Superclass::PrintSelf(os, indent);
125 os << indent <<
"Spline Order: " << SplineOrder << std::endl;
131 template <
unsigned int>
132 struct ITK_TEMPLATE_EXPORT Dispatch{};
142 const double absValue = std::abs(u);
148 else if (absValue == 0.5)
163 const double absValue = std::abs(u);
167 return 1.0 - absValue;
180 const double absValue = std::abs(u);
184 return 0.75 - absValue * absValue;
186 else if (absValue < 1.5)
188 return (9.0 - 12.0 * absValue + 4.0 * absValue * absValue) / 8.0;
201 const double absValue = std::abs(u);
202 const double sqrValue = u * u;
206 return (4.0 - 6.0 * sqrValue + 3.0 * sqrValue * absValue) / 6.0;
208 else if (absValue < 2.0)
210 return (8.0 - 12.0 * absValue + 6.0 * sqrValue - sqrValue * absValue) / 6.0;
225 Evaluate(
const Dispatch<0> &,
const double u,
double * weights)
227 const double absValue = std::abs(u);
233 else if (absValue == 0.5)
246 Evaluate(
const Dispatch<1> &,
const double u,
double * weights)
248 const double absValue = std::abs(u);
250 weights[0] = 1.0 - absValue;
251 weights[1] = absValue;
257 Evaluate(
const Dispatch<2> &,
const double u,
double * weights)
259 const double absValue = std::abs(u);
260 const double sqrValue = u * u;
262 weights[0] = (9.0 - 12.0 * absValue + 4.0 * sqrValue) / 8.0;
263 weights[1] = -0.25 + 2.0 * absValue - sqrValue;
264 weights[2] = (1.0 - 4.0 * absValue + 4.0 * sqrValue) / 8.0;
270 Evaluate(
const Dispatch<3> &,
const double u,
double * weights)
272 const double absValue = std::abs(u);
273 const double sqrValue = u * u;
274 const double uuu = sqrValue * absValue;
278 static const double onesixth = 1.0 / 6.0;
279 weights[0] = (8.0 - 12.0 * absValue + 6.0 * sqrValue - uuu) * onesixth;
280 weights[1] = (-5.0 + 21.0 * absValue - 15.0 * sqrValue + 3.0 * uuu) * onesixth;
281 weights[2] = (4.0 - 12.0 * absValue + 12.0 * sqrValue - 3.0 * uuu) * onesixth;
282 weights[3] = (-1.0 + 3.0 * absValue - 3.0 * sqrValue + uuu) * onesixth;
FixedArray< double, VSplineOrder+1 > WeightArrayType
~BSplineKernelFunction2() override=default
static void Evaluate(const Dispatch< 2 > &, const double u, double *weights)
void Evaluate(const double &u, double *weights) const override
static void Evaluate(const Dispatch< 1 > &, const double u, double *weights)
void PrintSelf(std::ostream &os, Indent indent) const override
static double Evaluate(const Dispatch< 1 > &, const double u)
static void FastEvaluate(const double u, double *const weights)
static double Evaluate(const Dispatch< 0 > &, const double u)
static void Evaluate(const Dispatch< 3 > &, const double u, double *weights)
static void Evaluate(const Dispatch< 0 > &, const double u, double *weights)
BSplineKernelFunction2 Self
static double Evaluate(const Dispatch< 3 > &, const double u)
BSplineKernelFunction2()=default
ITK_DISALLOW_COPY_AND_MOVE(BSplineKernelFunction2)
KernelFunctionBase2< double > Superclass
static double Evaluate(const Dispatch< 2 > &, const double u)
itkStaticConstMacro(SplineOrder, unsigned int, VSplineOrder)
static double FastEvaluate(const double u)
double Evaluate(const double &u) const override
SmartPointer< Self > Pointer
itkOverrideGetNameOfClassMacro(BSplineKernelFunction2)
KernelFunctionBase2()=default