SourceAccessorLinearInterpolate.h

Go to the documentation of this file.
00001 // $Id$
00002 
00003 #ifndef __SOURCEACCESSORLINEARINTERPOLATE_H__
00004 #define __SOURCEACCESSORLINEARINTERPOLATE_H__
00005 
00006 #include "SourceGenerics.h"
00007 
00008 #include "Promotion.h"
00009 #include <math.h>
00010 
00011 //============================================================================
00012 // forward declarations of interpolation functions
00013 //============================================================================
00014 template <class DATA>
00015 inline PROMOTION(Real,DATA) LinearInterpolate (
00016     const Real& x,
00017     const DATA& data0, const DATA& data1
00018 );
00019 
00020 //============================================================================
00021 // base class
00022 //============================================================================
00023 template<class DATA, int DIMENSIONALITY, class PRECISION, class SOURCE>
00024 class SourceAccessorLinearInterpolateOf: public SourceAccessorOf<DATA,
00025     DIMENSIONALITY, PRECISION, SOURCE>
00026 {
00027 };
00028 
00029 //============================================================================
00030 // 2D
00031 //============================================================================
00032 template<class DATA, class PRECISION, class SOURCE>
00033 class SourceAccessorLinearInterpolateOf<DATA, 2, PRECISION, SOURCE> : public SourceAccessorOf<
00034     DATA, 2, PRECISION, SOURCE>
00035 {
00036 public:
00037   virtual String Describe() const
00038   {
00039     return (_LINE + "SourceAccessorLinearInterpolateOf(2D)" + LINE_
00040         + this->DescribeCommon());
00041   }
00042 
00043 private:
00044 PROMOTION(DATA,PRECISION) InterpolateOnY(
00045     const PRECISION &rX, const PRECISION &rY
00046 ) const
00047   {
00048   // note center is at pxl11, not pxl00
00049   DATA data0; ::Get(*(this->m_psource),data0,(PRECISION)((int)(rX)),(PRECISION)((int)(rY)));
00050   DATA data1; ::Get(*(this->m_psource),data1,(PRECISION)((int)(rX+1)),(PRECISION)((int)(rY)));
00051   return LinearInterpolate(rX-int(rX), data0,data1);
00052   }
00053 
00054 public:
00055 SOURCE_ACTUALS_2D  ;
00056 
00057   void Get(DATA& dataOut, const PRECISION &rX, const PRECISION &rY) const
00058     {
00059     PROMOTION(DATA,PRECISION) data0 = InterpolateOnY(rX,rY );
00060     PROMOTION(DATA,PRECISION) data1 = InterpolateOnY(rX,rY+1);
00061 
00062     dataOut=LinearInterpolate(rY-int(rY), data0,data1);
00063     }
00064 
00065   void Set(const PRECISION &rX, const PRECISION &rY, const DATA& data)
00066     {
00067     ERROR("NOT IMPLEMENTED");
00068     }
00069 
00070   };
00071 
00072 //============================================================================
00073 // 3d
00074 //============================================================================
00075 template<class DATA, class PRECISION, class SOURCE>
00076 class SourceAccessorLinearInterpolateOf<DATA, 3, PRECISION, SOURCE> : public SourceAccessorOf<
00077     DATA, 3, PRECISION, SOURCE>
00078 {
00079 public:
00080   virtual String Describe() const
00081   {
00082     return (_LINE + "SourceAccessorLinearInterpolateOf(3D)" + LINE_
00083         + this->DescribeCommon());
00084   }
00085 
00086 private:
00087 PROMOTION(DATA,Real) InterpolateOnYZ(
00088     const PRECISION &rX, const PRECISION &rY, const PRECISION &rZ
00089 ) const
00090   {
00091   // note center is at pxl11, not pxl00
00092   DATA data0; ::Get(*(this->m_psource), data0, (PRECISION)((int)(rX)),(PRECISION)((int)(rY)),(PRECISION)((int)(rZ)));
00093   DATA data1; ::Get(*(this->m_psource), data1, (PRECISION)((int)(rX+1)),(PRECISION)((int)(rY)),(PRECISION)((int)(rZ)));
00094 
00095   return LinearInterpolate(rX-int(rX), data0,data1);
00096   }
00097 
00098 PROMOTION(DATA,Real) InterpolateOnZ(
00099     const PRECISION &rX, const PRECISION &rY, const PRECISION &rZ
00100 ) const
00101   {
00102   PROMOTION(DATA,Real) data0 = InterpolateOnYZ(rX,rY ,rZ);
00103   PROMOTION(DATA,Real) data1 = InterpolateOnYZ(rX,rY+1,rZ);
00104 
00105   return LinearInterpolate(rY-int(rY), data0,data1);
00106   }
00107 
00108 public:
00109 SOURCE_ACTUALS_3D  ;
00110 
00111   void Get(DATA& dataOut, const PRECISION &rX, const PRECISION &rY, const PRECISION &rZ) const
00112     {
00113     PROMOTION(DATA,Real) data0 = InterpolateOnZ(rX,rY,rZ );
00114     PROMOTION(DATA,Real) data1 = InterpolateOnZ(rX,rY,rZ+1);
00115 
00116     dataOut = LinearInterpolate(rZ-int(rZ), data0, data1);
00117     }
00118 
00119   void Set(const PRECISION &rX, const PRECISION &rY, const PRECISION &rZ, const DATA& data)
00120     {
00121     ERROR("NOT IMPLEMENTED");
00122     }
00123   };
00124 
00125 template <class DATA>
00126 inline PROMOTION(Real,DATA) LinearInterpolate (
00127     const Real& x,
00128     const DATA& data0, const DATA& data1
00129 )
00130   {
00131   return (Real(1.0)-x)*data0 + x * data1;
00132   }
00133 
00134 MAKE_INTERPOLANT_ASSISTANT( LinearInterpolation, SourceAccessorLinearInterpolateOf );
00135 
00136 #endif // __SOURCEACCESSORLINEARINTERPOLATE_H__

Generated on 6 Apr 2011 for Slicer3 by  doxygen 1.6.1