00001
00002
00003 #ifndef __SOURCETRANSFORMTRANSLATE_H__
00004 #define __SOURCETRANSFORMTRANSLATE_H__
00005
00006 #include "SourceGenerics.h"
00007 #include <math.h>
00008
00009
00010
00011 template<class DATA, int DIMENSIONALITY, class PRECISION, class SOURCE>
00012 class SourceTransformTranslateBaseOf: public SourceTransformOf<DATA,
00013 DIMENSIONALITY, PRECISION, SOURCE>
00014 {
00015 protected:
00016 typedef PointOf<DIMENSIONALITY, Real> POINT;
00017 POINT m_dpt;
00018
00019 public:
00020 SourceTransformTranslateBaseOf() :
00021 SourceTransformOf<DATA, DIMENSIONALITY, PRECISION, SOURCE> (), m_dpt(0.)
00022 {
00023 }
00024
00025 virtual String Describe() const
00026 {
00027 return (_LINE + SerializationId() + LINE_ + (_INDENT + "translation by: "
00028 + m_dpt.Describe() + LINE_) + this->DescribeCommon());
00029 }
00030
00031 virtual void RegisterParameters(RegistryOfParameters& reg)
00032 {
00033 RegisterPointAsParameter(reg, m_dpt);
00034 }
00035
00036 POINT& Translate()
00037 {
00038 return m_dpt;
00039 }
00040
00041 const POINT& Translate() const
00042 {
00043 return m_dpt;
00044 }
00045
00046 static String SerializationId()
00047 {
00048 return String("SourceTransformTranslate(") + DIMENSIONALITY + "D)";
00049 }
00050
00051 void SerializeSelf(Stream &st) const
00052 {
00053 ::Serialize(st, m_dpt);
00054 }
00055
00056 void DeserializeSelf(Stream &st)
00057 {
00058 ::Deserialize(st, m_dpt);
00059 }
00060 };
00061
00062
00063
00064 template<class DATA, int DIMENSIONALITY, class PRECISION, class SOURCE>
00065 class SourceTransformTranslateOf: public SourceTransformTranslateBaseOf<DATA,
00066 DIMENSIONALITY, PRECISION, SOURCE>
00067 {
00068 SourceTransformTranslateOf() :
00069 SourceTransformTranslateBaseOf<DATA, DIMENSIONALITY, PRECISION, SOURCE> ()
00070 {
00071 }
00072 SourceTransformTranslateOf(SOURCE* psource) :
00073 SourceTransformTranslateBaseOf<DATA, DIMENSIONALITY, PRECISION, SOURCE> (
00074 psource)
00075 {
00076 }
00077
00078
00079 };
00080
00081
00082
00083 template<class DATA, class PRECISION, class SOURCE>
00084 class SourceTransformTranslateOf<DATA, 2, PRECISION, SOURCE> : public SourceTransformTranslateBaseOf<
00085 DATA, 2, PRECISION, SOURCE>
00086 {
00087 public:
00088 SOURCE_ACTUALS_2D ;
00089
00090 inline void Get(DATA& dataOut, const PRECISION &rX, const PRECISION &rY) const
00091 {
00092 ::Get(
00093 *(this->m_psource),
00094 dataOut,
00095 (rX-this->m_dpt.X()*this->m_ptSize.X()),
00096 (rY-this->m_dpt.Y()*this->m_ptSize.Y())
00097 );
00098 }
00099
00100 inline void Set(const PRECISION &rX, const PRECISION &rY, const DATA& data)
00101 {
00102 ::Set(
00103 *(this->m_psource),
00104 (rX-this->m_dpt.X()*this->m_ptSize.X()),
00105 (rY-this->m_dpt.Y()*this->m_ptSize.Y()),
00106 data
00107 );
00108 }
00109
00110 };
00111
00112
00113
00114
00115
00116
00117 template<class DATA, class PRECISION, class SOURCE>
00118 class SourceTransformTranslateOf<DATA, 3, PRECISION, SOURCE> : public SourceTransformTranslateBaseOf<
00119 DATA, 3, PRECISION, SOURCE>
00120 {
00121 public:
00122 SOURCE_ACTUALS_3D ;
00123
00124 inline void Get(DATA& dataOut, const PRECISION &rX, const PRECISION &rY, const PRECISION &rZ) const
00125 {
00126 ::Get(
00127 *(this->m_psource),
00128 dataOut,
00129 (rX-this->m_dpt.X()*this->m_ptSize.X()),
00130 (rY-this->m_dpt.Y()*this->m_ptSize.Y()),
00131 (rZ-this->m_dpt.Z()*this->m_ptSize.Z())
00132 );
00133 }
00134
00135 inline void Set(const PRECISION &rX, const PRECISION &rY, const PRECISION &rZ, const DATA& data)
00136 {
00137 ::Set(
00138 *(this->m_psource),
00139 (rX-this->m_dpt.X()*this->m_ptSize.X()),
00140 (rY-this->m_dpt.Y()*this->m_ptSize.Y()),
00141 (rZ-this->m_dpt.Z()*this->m_ptSize.Z()),
00142 data
00143 );
00144 }
00145 };
00146
00147
00148
00149
00150 MAKE_ASSISTANT(
00151 Translate,
00152 SourceTransformTranslateOf,
00153 {psrcOut->Translate()=pt;},
00154 const PointOf<TypeOfDimensionality(SOURCE) COMMA TypeOfPrecision(SOURCE)> &pt,
00155 );
00156
00157 #endif // __SOURCETRANSFORMTRANSLATE_H__