00001
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
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
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
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
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
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
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__