34 #ifndef __itkBSplineDerivativeKernelFunction2_h 35 #define __itkBSplineDerivativeKernelFunction2_h 37 #include "itkKernelFunctionBase.h" 38 #include "vnl/vnl_math.h" 58 template<
unsigned int VSplineOrder = 3 >
75 itkStaticConstMacro( SplineOrder,
unsigned int, VSplineOrder );
78 inline double Evaluate(
const double & u )
const 80 return this->Evaluate( Dispatch< VSplineOrder >(), u );
89 void PrintSelf( std::ostream & os, Indent indent )
const 91 Superclass::PrintSelf( os, indent );
92 os << indent <<
"Spline Order: " << SplineOrder << std::endl;
99 void operator=(
const Self & );
102 struct DispatchBase {};
103 template<
unsigned int >
104 struct Dispatch : DispatchBase {};
128 inline double Evaluate(
const Dispatch< 1 > &,
const double & u )
const 131 double absValue = vnl_math_abs( u );
135 return -vnl_math_sgn( u );
137 else if( absValue == 1.0 )
139 return -vnl_math_sgn( u ) / 2.0;
150 inline double Evaluate(
const Dispatch< 2 > &,
const double & u )
const 152 double absValue = vnl_math_abs( u );
158 else if( absValue < 1.5 )
160 return u - 1.5 * vnl_math_sgn( u );
171 inline double Evaluate(
const Dispatch< 3 > &,
const double & u )
const 173 const double absValue = vnl_math_abs( u );
174 const double sqrValue = vnl_math_sqr( u );
180 const double dummy = vnl_math_abs( u + 0.5 );
181 return ( 6.0 * sqrValue - 2.0 * u - 6.0 * dummy + 3.0 ) / 4.0;
185 const double dummy = vnl_math_abs( u - 0.5 );
186 return -( 6.0 * sqrValue + 2.0 * u - 6.0 * dummy + 3.0 ) / 4.0;
189 else if( absValue < 2.0 )
193 const double dummy = vnl_math_abs( u - 0.5 );
194 return ( u - sqrValue + 3.0 * dummy - 2.5 ) / 2.0;
198 const double dummy = vnl_math_abs( u + 0.5 );
199 return ( u + sqrValue - 3.0 * dummy + 2.5 ) / 2.0;
211 inline double Evaluate(
const DispatchBase &,
const double & )
const 213 itkExceptionMacro(
"Evaluate not implemented for spline\ 214 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()