00001
00002
00003 #ifndef __SOURCETRANSFORMSCALE_H__
00004 #define __SOURCETRANSFORMSCALE_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 SourceTransformScaleBaseOf: public SourceTransformOf<DATA,
00013 DIMENSIONALITY, PRECISION, SOURCE>
00014 {
00015 protected:
00016 typedef PointOf<DIMENSIONALITY, Real> POINT;
00017 POINT m_ptScale;
00018
00019 public:
00020 SourceTransformScaleBaseOf() :
00021 SourceTransformOf<DATA, DIMENSIONALITY, PRECISION, SOURCE> (),
00022 m_ptScale(1.)
00023 {
00024 }
00025
00026 virtual String Describe() const
00027 {
00028 return (_LINE + SerializationId() + LINE_ + (_INDENT + "scale factors: "
00029 + m_ptScale.Describe() + LINE_) + this->DescribeCommon());
00030 }
00031
00032 virtual void RegisterParameters(RegistryOfParameters& reg)
00033 {
00034 RegisterPointAsParameter(reg, m_ptScale);
00035 }
00036
00037 void SetScale(const POINT& pt)
00038 {
00039 m_ptScale = pt;
00040 }
00041
00042 const POINT& Scale() const
00043 {
00044 return m_ptScale;
00045 }
00046
00047 void PrepareForAccessAction() const
00048 {
00049 this->m_ptSize = this->m_psource->Size() * m_ptScale;
00050 }
00051
00052 static String SerializationId()
00053 {
00054 return String("SourceTransformScale(") + DIMENSIONALITY + "D)";
00055 }
00056
00057 void SerializeSelf(Stream& st) const
00058 {
00059 ::Serialize(st, m_ptScale);
00060 }
00061
00062 void DeserializeSelf(Stream &st)
00063 {
00064 ::Deserialize(st, m_ptScale);
00065 }
00066 };
00067
00068
00069
00070 template<class DATA, int DIMENSIONALITY, class PRECISION, class SOURCE>
00071 class SourceTransformScaleOf: public SourceTransformScaleBaseOf<DATA,
00072 DIMENSIONALITY, PRECISION, SOURCE>
00073 {
00074 };
00075
00076
00077
00078 template<class DATA, class PRECISION, class SOURCE>
00079 class SourceTransformScaleOf<DATA, 2, PRECISION, SOURCE> : public SourceTransformScaleBaseOf<
00080 DATA, 2, PRECISION, SOURCE>
00081 {
00082 public:
00083
00084 SOURCE_ACTUALS_2D ;
00085
00086 void Get(DATA& dataOut, const PRECISION &rX, const PRECISION &rY) const
00087 {
00088 ::Get(
00089 *(this->m_psource),
00090 dataOut,
00091 (rX/this->m_ptScale.X()),
00092 (rY/this->m_ptScale.Y())
00093 );
00094 }
00095
00096 void Set(const PRECISION &rX, const PRECISION &rY, const DATA& data)
00097 {
00098 ::Set(
00099 *(this->m_psource),
00100 (rX/this->m_ptScale.X()),
00101 (rY/this->m_ptScale.Y()),
00102 data);
00103 }
00104
00105 };
00106
00107
00108
00109
00110
00111
00112 template<class DATA, class PRECISION, class SOURCE>
00113 class SourceTransformScaleOf<DATA, 3, PRECISION, SOURCE> : public SourceTransformScaleBaseOf<
00114 DATA, 3, PRECISION, SOURCE>
00115 {
00116 public:
00117 SOURCE_ACTUALS_3D ;
00118
00119 void Get(DATA& dataOut, const PRECISION &rX, const PRECISION &rY, const PRECISION &rZ) const
00120 {
00121 ::Get(
00122 *(this->m_psource),
00123 dataOut,
00124 (rX/this->m_ptScale.X()),
00125 (rY/this->m_ptScale.Y()),
00126 (rZ/this->m_ptScale.Z())
00127 );
00128 }
00129
00130 void Set(const PRECISION &rX, const PRECISION &rY, const PRECISION &rZ, const DATA& data)
00131 {
00132 ::Set(
00133 *(this->m_psource),
00134 (rX/this->m_ptScale.X()),
00135 (rY/this->m_ptScale.Y()),
00136 (rZ/this->m_ptScale.Z()),
00137 data);
00138 }
00139 };
00140
00141
00142
00143
00144 MAKE_ASSISTANT(
00145 ScaleBy,
00146 SourceTransformScaleOf,
00147 {psrcOut->SetScale(pt);},
00148 const PointOf<TypeOfDimensionality(SOURCE),Real>& pt,
00149 );
00150
00151 MAKE_ASSISTANT(
00152 ScaleTo,
00153 SourceTransformScaleOf,
00154 {
00155 psrcIn->PrepareForAccess();
00156 psrcOut->SetScale(pt/psrcIn->Size());
00157 },
00158 const PointOf<TypeOfDimensionality(SOURCE),TypeOfPrecision(SOURCE)>& pt,
00159 );
00160
00161 MAKE_ASSISTANT(
00162 ScaleUpto,
00163 SourceTransformScaleOf,
00164 {
00165 psrcIn->PrepareForAccess();
00166 int nDim=(pt/psrcIn->Size()).MinDimension();
00167 psrcOut->SetScale(
00168 PointOf<TypeOfDimensionality(SOURCE),TypeOfPrecision(SOURCE)>(
00169 (pt/psrcIn->Size()).Dim(nDim)
00170 )
00171 );
00172 },
00173 const PointOf<TypeOfDimensionality(SOURCE),TypeOfPrecision(SOURCE)>& pt,
00174 );
00175
00176 #endif // __SOURCETRANSFORMSCALE_H__