17 #ifndef __itkOptLinearInterpolateImageFunction_h
18 #define __itkOptLinearInterpolateImageFunction_h
42 template <
class TInputImage,
class TCoordRep =
double>
43 class ITK_EXPORT LinearInterpolateImageFunction :
44 public InterpolateImageFunction<TInputImage,TCoordRep>
69 typedef typename Superclass::RealType
RealType;
72 itkStaticConstMacro(ImageDimension,
unsigned int,Superclass::ImageDimension);
89 virtual inline OutputType EvaluateAtContinuousIndex(
const
99 void PrintSelf(std::ostream& os,
Indent indent)
const;
103 void operator=(
const Self& );
106 static const unsigned long m_Neighbors;
122 basei[0] = Math::Floor<IndexValueType>(index[0]);
123 if( basei[0] < this->m_StartIndex[0] )
125 basei[0] = this->m_StartIndex[0];
128 const double distance = index[0] -
static_cast<double>(basei[0]);
130 const RealType val0 = this->GetInputImage()->GetPixel( basei );
134 return( static_cast<OutputType>( val0 ) );
138 if(basei[0]>this->m_EndIndex[0])
140 return( static_cast<OutputType>( val0 ) );
142 const RealType val1 = this->GetInputImage()->GetPixel( basei );
144 return( static_cast<OutputType>( val0 + ( val1 - val0 ) * distance ) );
152 basei[0] = Math::Floor<IndexValueType>(index[0]);
153 if( basei[0] < this->m_StartIndex[0] )
155 basei[0] = this->m_StartIndex[0];
157 const double distance0 = index[0] -
static_cast<double>(basei[0]);
159 basei[1] = Math::Floor<IndexValueType>(index[1]);
160 if( basei[1] < this->m_StartIndex[1] )
162 basei[1] = this->m_StartIndex[1];
164 const double distance1 = index[1] -
static_cast<double>(basei[1]);
167 const RealType val00 = this->GetInputImage()->GetPixel( basei );
168 if(distance0 <= 0. && distance1 <= 0.)
170 return( static_cast<OutputType>( val00 ) );
172 else if(distance1 <= 0.)
175 if(basei[0]>this->m_EndIndex[0])
177 return( static_cast<OutputType>( val00 ) );
179 const RealType val10 = this->GetInputImage()->GetPixel( basei );
180 return( static_cast<OutputType>(val00 + (val10 - val00) * distance0) );
182 else if(distance0 <= 0.)
185 if(basei[1]>this->m_EndIndex[1])
187 return( static_cast<OutputType>( val00 ) );
189 const RealType val01 = this->GetInputImage()->GetPixel( basei );
190 return( static_cast<OutputType>(val00 + (val01 - val00) * distance1) );
195 if(basei[0]>this->m_EndIndex[0])
199 if(basei[1]>this->m_EndIndex[1])
201 return( static_cast<OutputType>( val00 ) );
203 const RealType val01 = this->GetInputImage()->GetPixel( basei );
204 return( static_cast<OutputType>(val00 + (val01 - val00) * distance1) );
206 const RealType val10 = this->GetInputImage()->GetPixel( basei );
208 const RealType valx0 = val00 + (val10 - val00) * distance0;
211 if(basei[1]>this->m_EndIndex[1])
213 return( static_cast<OutputType>( valx0 ) );
215 const RealType val11 = this->GetInputImage()->GetPixel( basei );
217 const RealType val01 = this->GetInputImage()->GetPixel( basei );
219 const RealType valx1 = val01 + (val11 - val01) * distance0;
221 return( static_cast<OutputType>( valx0 + (valx1-valx0) * distance1 ) );
230 basei[0] = Math::Floor<IndexValueType>(index[0]);
231 if( basei[0] < this->m_StartIndex[0] )
233 basei[0] = this->m_StartIndex[0];
235 const double distance0 = index[0] -
static_cast<double>(basei[0]);
237 basei[1] = Math::Floor<IndexValueType>(index[1]);
238 if( basei[1] < this->m_StartIndex[1] )
240 basei[1] = this->m_StartIndex[1];
242 const double distance1 = index[1] -
static_cast<double>(basei[1]);
244 basei[2] = Math::Floor<IndexValueType>(index[2]);
245 if( basei[2] < this->m_StartIndex[2] )
247 basei[2] = this->m_StartIndex[2];
249 const double distance2 = index[2] -
static_cast<double>(basei[2]);
251 if(distance0<=0. && distance1<=0. && distance2<=0.)
253 return( static_cast<OutputType>( this->GetInputImage()->GetPixel( basei ) ) );
257 const RealType val000 = this->GetInputImage()->GetPixel( basei );
264 if(basei[0]>this->m_EndIndex[0])
266 return( static_cast<OutputType>( val000 ) );
268 const RealType val100 = this->GetInputImage()->GetPixel( basei );
270 return static_cast<OutputType>( val000 + (val100-val000) * distance0 );
272 else if(distance0 <= 0.)
275 if(basei[1]>this->m_EndIndex[1])
277 return( static_cast<OutputType>( val000 ) );
279 const RealType val010 = this->GetInputImage()->GetPixel( basei );
281 return static_cast<OutputType>( val000 + (val010-val000) * distance1 );
286 if(basei[0]>this->m_EndIndex[0])
290 if(basei[1]>this->m_EndIndex[1])
292 return( static_cast<OutputType>( val000 ) );
294 const RealType val010 = this->GetInputImage()->GetPixel( basei );
296 return static_cast<OutputType>( val000 + (val010-val000) * distance1 );
298 const RealType val100 = this->GetInputImage()->GetPixel( basei );
300 const RealType valx00 = val000 + (val100-val000) * distance0;
303 if(basei[1]>this->m_EndIndex[1])
305 return( static_cast<OutputType>( valx00 ) );
307 const RealType val110 = this->GetInputImage()->GetPixel( basei );
310 const RealType val010 = this->GetInputImage()->GetPixel( basei );
312 const RealType valx10 = val010 + (val110-val010) * distance0;
314 return static_cast<OutputType>( valx00 + (valx10-valx00) * distance1 );
324 if(basei[2]>this->m_EndIndex[2])
326 return( static_cast<OutputType>( val000 ) );
328 const RealType val001 = this->GetInputImage()->GetPixel( basei );
330 return static_cast<OutputType>( val000 + (val001-val000) * distance2 );
335 if(basei[0]>this->m_EndIndex[0])
339 if(basei[2]>this->m_EndIndex[2])
341 return( static_cast<OutputType>( val000 ) );
343 const RealType val001 = this->GetInputImage()->GetPixel( basei );
345 return static_cast<OutputType>( val000 + (val001-val000) * distance2 );
347 const RealType val100 = this->GetInputImage()->GetPixel( basei );
349 const RealType valx00 = val000 + (val100-val000) * distance0;
352 if(basei[2]>this->m_EndIndex[2])
354 return( static_cast<OutputType>( valx00 ) );
356 const RealType val101 = this->GetInputImage()->GetPixel( basei );
359 const RealType val001 = this->GetInputImage()->GetPixel( basei );
361 const RealType valx01 = val001 + (val101-val001) * distance0;
363 return static_cast<OutputType>( valx00 + (valx01-valx00) * distance2 );
366 else if(distance0 <= 0.)
369 if(basei[1]>this->m_EndIndex[1])
373 if(basei[2]>this->m_EndIndex[2])
375 return( static_cast<OutputType>( val000 ) );
377 const RealType val001 = this->GetInputImage()->GetPixel( basei );
379 return static_cast<OutputType>( val000 + (val001-val000) * distance2 );
381 const RealType val010 = this->GetInputImage()->GetPixel( basei );
383 const RealType val0x0 = val000 + (val010-val000) * distance1;
386 if(basei[2]>this->m_EndIndex[2])
388 return( static_cast<OutputType>( val0x0 ) );
390 const RealType val011 = this->GetInputImage()->GetPixel( basei );
393 const RealType val001 = this->GetInputImage()->GetPixel( basei );
395 const RealType val0x1 = val001 + (val011-val001) * distance1;
397 return static_cast<OutputType>( val0x0 + (val0x1-val0x0) * distance2 );
402 if(basei[0]>this->m_EndIndex[0])
406 if(basei[1]>this->m_EndIndex[1])
410 if(basei[2]>this->m_EndIndex[2])
412 return( static_cast<OutputType>( val000 ) );
414 const RealType val001 = this->GetInputImage()->GetPixel( basei );
416 return static_cast<OutputType>( val000 + (val001-val000) * distance2 );
418 const RealType val010 = this->GetInputImage()->GetPixel( basei );
420 const RealType val0x0 = val000 + (val010-val000) * distance1;
423 if(basei[2]>this->m_EndIndex[2])
425 return( static_cast<OutputType>( val0x0 ) );
427 const RealType val011 = this->GetInputImage()->GetPixel( basei );
430 const RealType val001 = this->GetInputImage()->GetPixel( basei );
432 const RealType val0x1 = val001 + (val011-val001) * distance1;
434 return static_cast<OutputType>( val0x0 + (val0x1-val0x0) * distance2 );
436 const RealType val100 = this->GetInputImage()->GetPixel( basei );
438 const RealType valx00 = val000 + (val100-val000) * distance0;
441 if(basei[1]>this->m_EndIndex[1])
445 if(basei[2]>this->m_EndIndex[2])
447 return( static_cast<OutputType>( valx00 ) );
449 const RealType val101 = this->GetInputImage()->GetPixel( basei );
452 const RealType val001 = this->GetInputImage()->GetPixel( basei );
454 const RealType valx01 = val001 + (val101-val001) * distance0;
456 return static_cast<OutputType>( valx00 + (valx01-valx00) * distance2 );
458 const RealType val110 = this->GetInputImage()->GetPixel( basei );
461 const RealType val010 = this->GetInputImage()->GetPixel( basei );
463 const RealType valx10 = val010 + (val110-val010) * distance0;
465 const RealType valxx0 = valx00 + (valx10-valx00) * distance1;
469 if(basei[2]>this->m_EndIndex[2])
471 return( static_cast<OutputType>( valxx0 ) );
473 const RealType val011 = this->GetInputImage()->GetPixel( basei );
476 const RealType val111 = this->GetInputImage()->GetPixel( basei );
479 const RealType val101 = this->GetInputImage()->GetPixel( basei );
482 const RealType val001 = this->GetInputImage()->GetPixel( basei );
484 const RealType valx01 = val001 + (val101-val001) * distance0;
485 const RealType valx11 = val011 + (val111-val011) * distance0;
486 const RealType valxx1 = valx01 + (valx11-valx01) * distance1;
488 return( static_cast<OutputType>( valxx0 + (valxx1-valxx0) * distance2 ) );
496 return this->EvaluateUnoptimized( index );
499 virtual inline OutputType EvaluateUnoptimized(
500 const ContinuousIndexType & index)
const;
506 #define ITK_TEMPLATE_LinearInterpolateImageFunction(_, EXPORT, x, y) namespace itk { \
507 _(2(class EXPORT LinearInterpolateImageFunction< ITK_TEMPLATE_2 x >)) \
508 namespace Templates { typedef LinearInterpolateImageFunction< ITK_TEMPLATE_2 x > \
509 LinearInterpolateImageFunction##y; } \
512 #if ITK_TEMPLATE_EXPLICIT
513 # include "Templates/itkLinearInterpolateImageFunction+-.h"