17 #ifndef __itkBSplineKernelFunction2_h
18 #define __itkBSplineKernelFunction2_h
20 #include "itkKernelFunctionBase.h"
21 #include "vnl/vnl_math.h"
41 template<
unsigned int VSplineOrder = 3 >
58 itkStaticConstMacro( SplineOrder,
unsigned int, VSplineOrder );
61 typedef FixedArray<
double,
65 inline double Evaluate(
const double & u )
const
67 return this->Evaluate( Dispatch< VSplineOrder >(), u );
76 this->Evaluate( Dispatch< VSplineOrder >(), u, weights );
85 void PrintSelf( std::ostream & os, Indent indent )
const
87 Superclass::PrintSelf( os, indent );
88 os << indent <<
"Spline Order: " << SplineOrder << std::endl;
95 void operator=(
const Self & );
98 struct DispatchBase {};
99 template<
unsigned int >
100 struct Dispatch : DispatchBase {};
107 inline double Evaluate(
const Dispatch< 0 > &,
const double & u )
const
109 double absValue = vnl_math_abs( u );
111 if( absValue < 0.5 ) {
return 1.0; }
112 else if( absValue == 0.5 ) {
return 0.5; }
118 inline double Evaluate(
const Dispatch< 1 > &,
const double & u )
const
120 double absValue = vnl_math_abs( u );
122 if( absValue < 1.0 ) {
return 1.0 - absValue; }
128 inline double Evaluate(
const Dispatch< 2 > &,
const double & u )
const
130 double absValue = vnl_math_abs( u );
134 return 0.75 - vnl_math_sqr( absValue );
136 else if( absValue < 1.5 )
138 return ( 9.0 - 12.0 * absValue + 4.0 * vnl_math_sqr( absValue ) ) / 8.0;
145 inline double Evaluate(
const Dispatch< 3 > &,
const double & u )
const
147 double absValue = vnl_math_abs( u );
148 double sqrValue = vnl_math_sqr( u );
152 return ( 4.0 - 6.0 * sqrValue + 3.0 * sqrValue * absValue ) / 6.0;
154 else if( absValue < 2.0 )
156 return ( 8.0 - 12.0 * absValue + 6.0 * sqrValue - sqrValue * absValue ) / 6.0;
163 inline double Evaluate(
const DispatchBase &,
const double & )
const
165 itkExceptionMacro( <<
"Evaluate not implemented for spline order "
176 inline void Evaluate(
const Dispatch< 0 > &,
const double & u,
179 if( u < 0.5 ) { weights[ 0 ] = 1.0; }
180 else { weights[ 0 ] = 0.5; }
185 inline void Evaluate(
const Dispatch< 1 > &,
const double & u,
188 weights[ 0 ] = 1.0 - u;
194 inline void Evaluate(
const Dispatch< 2 > &,
const double & u,
197 const double uu = vnl_math_sqr( u );
199 weights[ 0 ] = ( 9.0 - 12.0 * u + 4.0 * uu ) / 8.0;
200 weights[ 1 ] = -0.25 + 2.0 * u - uu;
201 weights[ 2 ] = ( 1.0 - 4.0 * u + 4.0 * uu ) / 8.0;
206 inline void Evaluate(
const Dispatch< 3 > &,
const double & u,
209 const double uu = vnl_math_sqr( u );
210 const double uuu = uu * u;
212 weights[ 0 ] = ( 8.0 - 12 * u + 6.0 * uu - uuu ) / 6.0;
213 weights[ 1 ] = ( -5.0 + 21.0 * u - 15.0 * uu + 3.0 * uuu ) / 6.0;
214 weights[ 2 ] = ( 4.0 - 12.0 * u + 12.0 * uu - 3.0 * uuu ) / 6.0;
215 weights[ 3 ] = ( -1.0 + 3.0 * u - 3.0 * uu + uuu ) / 6.0;
220 inline double Evaluate(
const DispatchBase &,
const double &,
223 itkExceptionMacro( <<
"Evaluate not implemented for spline order "
void Evaluate(const double &u, WeightArrayType &weights) const
void Evaluate(const Dispatch< 3 > &, const double &u, WeightArrayType &weights) const
double Evaluate(const Dispatch< 1 > &, const double &u) const
KernelFunctionBase< double > Superclass
void Evaluate(const Dispatch< 0 > &, const double &u, WeightArrayType &weights) const
double Evaluate(const DispatchBase &, const double &, WeightArrayType &) const
BSplineKernelFunction2 Self
void Evaluate(const Dispatch< 2 > &, const double &u, WeightArrayType &weights) const
~BSplineKernelFunction2()
void PrintSelf(std::ostream &os, Indent indent) const
FixedArray< double, itkGetStaticConstMacro(SplineOrder)+1 > WeightArrayType
B-spline kernel used for density estimation and nonparameteric regression.
void Evaluate(const Dispatch< 1 > &, const double &u, WeightArrayType &weights) const
double Evaluate(const Dispatch< 0 > &, const double &u) const
double Evaluate(const double &u) const
double Evaluate(const Dispatch< 3 > &, const double &u) const
double Evaluate(const Dispatch< 2 > &, const double &u) const
double Evaluate(const DispatchBase &, const double &) const
SmartPointer< Self > Pointer