34 #ifndef __itkBSplineKernelFunction2_h 35 #define __itkBSplineKernelFunction2_h 37 #include "itkKernelFunctionBase.h" 38 #include "vnl/vnl_math.h" 58 template<
unsigned int VSplineOrder = 3 >
75 itkStaticConstMacro( SplineOrder,
unsigned int, VSplineOrder );
78 typedef FixedArray<
double,
82 inline double Evaluate(
const double & u )
const 84 return this->Evaluate( Dispatch< VSplineOrder >(), u );
93 this->Evaluate( Dispatch< VSplineOrder >(), u, weights );
102 void PrintSelf( std::ostream & os, Indent indent )
const 104 Superclass::PrintSelf( os, indent );
105 os << indent <<
"Spline Order: " << SplineOrder << std::endl;
112 void operator=(
const Self & );
115 struct DispatchBase {};
116 template<
unsigned int >
117 struct Dispatch : DispatchBase {};
124 inline double Evaluate(
const Dispatch< 0 > &,
const double & u )
const 126 double absValue = vnl_math_abs( u );
128 if( absValue < 0.5 ) {
return 1.0; }
129 else if( absValue == 0.5 ) {
return 0.5; }
135 inline double Evaluate(
const Dispatch< 1 > &,
const double & u )
const 137 double absValue = vnl_math_abs( u );
139 if( absValue < 1.0 ) {
return 1.0 - absValue; }
145 inline double Evaluate(
const Dispatch< 2 > &,
const double & u )
const 147 double absValue = vnl_math_abs( u );
151 return 0.75 - vnl_math_sqr( absValue );
153 else if( absValue < 1.5 )
155 return ( 9.0 - 12.0 * absValue + 4.0 * vnl_math_sqr( absValue ) ) / 8.0;
162 inline double Evaluate(
const Dispatch< 3 > &,
const double & u )
const 164 double absValue = vnl_math_abs( u );
165 double sqrValue = vnl_math_sqr( u );
169 return ( 4.0 - 6.0 * sqrValue + 3.0 * sqrValue * absValue ) / 6.0;
171 else if( absValue < 2.0 )
173 return ( 8.0 - 12.0 * absValue + 6.0 * sqrValue - sqrValue * absValue ) / 6.0;
180 inline double Evaluate(
const DispatchBase &,
const double & )
const 182 itkExceptionMacro( <<
"Evaluate not implemented for spline order " 193 inline void Evaluate(
const Dispatch< 0 > &,
const double & u,
196 if( u < 0.5 ) { weights[ 0 ] = 1.0; }
197 else { weights[ 0 ] = 0.5; }
202 inline void Evaluate(
const Dispatch< 1 > &,
const double & u,
205 weights[ 0 ] = 1.0 - u;
211 inline void Evaluate(
const Dispatch< 2 > &,
const double & u,
214 const double uu = vnl_math_sqr( u );
216 weights[ 0 ] = ( 9.0 - 12.0 * u + 4.0 * uu ) / 8.0;
217 weights[ 1 ] = -0.25 + 2.0 * u - uu;
218 weights[ 2 ] = ( 1.0 - 4.0 * u + 4.0 * uu ) / 8.0;
223 inline void Evaluate(
const Dispatch< 3 > &,
const double & u,
226 const double uu = vnl_math_sqr( u );
227 const double uuu = uu * u;
229 weights[ 0 ] = ( 8.0 - 12 * u + 6.0 * uu - uuu ) / 6.0;
230 weights[ 1 ] = ( -5.0 + 21.0 * u - 15.0 * uu + 3.0 * uuu ) / 6.0;
231 weights[ 2 ] = ( 4.0 - 12.0 * u + 12.0 * uu - 3.0 * uuu ) / 6.0;
232 weights[ 3 ] = ( -1.0 + 3.0 * u - 3.0 * uu + uuu ) / 6.0;
237 inline double Evaluate(
const DispatchBase &,
const double &,
240 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