SourceTransformScale.h

Go to the documentation of this file.
00001 // $Id$
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 // 3d
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 // scale assistants
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__

Generated on 6 Apr 2011 for Slicer3 by  doxygen 1.6.1