17 #ifndef __itkBSplineDerivativeKernelFunction2_h
18 #define __itkBSplineDerivativeKernelFunction2_h
20 #include "itkKernelFunctionBase.h"
21 #include "vnl/vnl_math.h"
41 template<
unsigned int VSplineOrder = 3 >
58 itkStaticConstMacro( SplineOrder,
unsigned int, VSplineOrder );
67 inline double Evaluate(
const double & u )
const
69 return this->Evaluate( Dispatch< VSplineOrder >(), u );
78 void PrintSelf( std::ostream & os, Indent indent )
const
80 Superclass::PrintSelf( os, indent );
81 os << indent <<
"Spline Order: " << SplineOrder << std::endl;
88 void operator=(
const Self & );
91 struct DispatchBase {};
92 template<
unsigned int >
93 struct Dispatch : DispatchBase {};
117 inline double Evaluate(
const Dispatch< 1 > &,
const double & u )
const
120 double absValue = vnl_math_abs( u );
124 return -vnl_math_sgn( u );
126 else if( absValue == 1.0 )
128 return -vnl_math_sgn( u ) / 2.0;
139 inline double Evaluate(
const Dispatch< 2 > &,
const double & u )
const
141 double absValue = vnl_math_abs( u );
147 else if( absValue < 1.5 )
149 return u - 1.5 * vnl_math_sgn( u );
160 inline double Evaluate(
const Dispatch< 3 > &,
const double & u )
const
162 const double absValue = vnl_math_abs( u );
163 const double sqrValue = vnl_math_sqr( u );
169 const double dummy = vnl_math_abs( u + 0.5 );
170 return ( 6.0 * sqrValue - 2.0 * u - 6.0 * dummy + 3.0 ) / 4.0;
174 const double dummy = vnl_math_abs( u - 0.5 );
175 return -( 6.0 * sqrValue + 2.0 * u - 6.0 * dummy + 3.0 ) / 4.0;
178 else if( absValue < 2.0 )
182 const double dummy = vnl_math_abs( u - 0.5 );
183 return ( u - sqrValue + 3.0 * dummy - 2.5 ) / 2.0;
187 const double dummy = vnl_math_abs( u + 0.5 );
188 return ( u + sqrValue - 3.0 * dummy + 2.5 ) / 2.0;
200 inline double Evaluate(
const DispatchBase &,
const double & )
const
202 itkExceptionMacro(
"Evaluate not implemented for spline\
203 order " << SplineOrder );
double Evaluate(const double &u) const
double Evaluate(const Dispatch< 2 > &, const double &u) const
double Evaluate(const Dispatch< 1 > &, const double &u) const
BSplineDerivativeKernelFunction2 Self
void PrintSelf(std::ostream &os, Indent indent) const
KernelFunctionBase< double > Superclass
double Evaluate(const DispatchBase &, const double &) const
~BSplineDerivativeKernelFunction2()
SmartPointer< Self > Pointer
double Evaluate(const Dispatch< 3 > &, const double &u) const
Derivative of a B-spline kernel used for density estimation and nonparametric regression.
BSplineDerivativeKernelFunction2()