33#ifndef itkBSplineDerivativeKernelFunction2_h
34#define itkBSplineDerivativeKernelFunction2_h
37#include <vnl/vnl_math.h>
57template <
unsigned int VSplineOrder = 3>
105 Evaluate(
const double & u,
double * weights)
const override
116 PrintSelf(std::ostream & os, Indent indent)
const override
118 Superclass::PrintSelf(os, indent);
119 os << indent <<
"Spline Order: " << SplineOrder << std::endl;
125 template <
unsigned int>
126 struct ITK_TEMPLATE_EXPORT Dispatch{};
135 const double absValue = std::abs(u);
139 return -vnl_math::sgn(u);
141 else if (absValue == 1.0)
143 return -vnl_math::sgn(u) / 2.0;
153 Evaluate(
const Dispatch<1> &,
const double u,
double * weights)
156 const double absValue = std::abs(u);
158 if (absValue < 1.0 && absValue > 0.0)
163 else if (absValue == 1)
180 double absValue = std::abs(u);
186 else if (absValue < 1.5)
188 return u - 1.5 * vnl_math::sgn(u);
198 Evaluate(
const Dispatch<2> &,
const double u,
double * weights)
201 weights[0] = u - 1.5;
202 weights[1] = -2.0 * u + 2.0;
203 weights[2] = u - 0.5;
211 const double absValue = std::abs(u);
212 const double sqrValue = u * u;
218 const double dummy = std::abs(u + 0.5);
219 return (6.0 * sqrValue - 2.0 * u - 6.0 * dummy + 3.0) / 4.0;
223 const double dummy = std::abs(u - 0.5);
224 return -(6.0 * sqrValue + 2.0 * u - 6.0 * dummy + 3.0) / 4.0;
227 else if (absValue < 2.0)
231 const double dummy = std::abs(u - 0.5);
232 return (u - sqrValue + 3.0 * dummy - 2.5) / 2.0;
236 const double dummy = std::abs(u + 0.5);
237 return (u + sqrValue - 3.0 * dummy + 2.5) / 2.0;
248 Evaluate(
const Dispatch<3> &,
const double u,
double * weights)
250 const double absValue = std::abs(u);
251 const double sqrValue = u * u;
253 weights[0] = 0.5 * sqrValue - 2.0 * absValue + 2.0;
254 weights[1] = -1.5 * sqrValue + 5.0 * absValue - 3.5;
255 weights[2] = 1.5 * sqrValue - 4.0 * absValue + 2.0;
256 weights[3] = -0.5 * sqrValue + absValue - 0.5;
KernelFunctionBase2< double > Superclass
void Evaluate(const double &u, double *weights) const override
static void Evaluate(const Dispatch< 2 > &, const double u, double *weights)
void PrintSelf(std::ostream &os, Indent indent) const override
BSplineDerivativeKernelFunction2 Self
static double Evaluate(const Dispatch< 3 > &, const double u)
~BSplineDerivativeKernelFunction2() override=default
static double FastEvaluate(const double u)
SmartPointer< Self > Pointer
static double Evaluate(const Dispatch< 2 > &, const double u)
static void Evaluate(const Dispatch< 1 > &, const double u, double *weights)
BSplineDerivativeKernelFunction2()=default
static double Evaluate(const Dispatch< 1 > &, const double u)
double Evaluate(const double &u) const override
static void FastEvaluate(const double u, double *const weights)
static void Evaluate(const Dispatch< 3 > &, const double u, double *weights)
itkOverrideGetNameOfClassMacro(BSplineDerivativeKernelFunction2)
ITK_DISALLOW_COPY_AND_MOVE(BSplineDerivativeKernelFunction2)
itkStaticConstMacro(SplineOrder, unsigned int, VSplineOrder)
KernelFunctionBase2()=default