00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __itkTranslationTransform_h
00019 #define __itkTranslationTransform_h
00020
00021 #include <iostream>
00022 #include "itkTransform.h"
00023 #include "itkExceptionObject.h"
00024 #include "itkMatrix.h"
00025
00026
00027
00028
00029 namespace itk
00030 {
00031
00039 template <
00040 class TScalarType=double,
00041 unsigned int NDimensions=3>
00042 class ITK_EXPORT TranslationTransform :
00043 public Transform< TScalarType, NDimensions, NDimensions >
00044 {
00045 public:
00047 typedef TranslationTransform Self;
00048 typedef Transform< TScalarType, NDimensions, NDimensions > Superclass;
00049 typedef SmartPointer<Self> Pointer;
00050 typedef SmartPointer<const Self> ConstPointer;
00051
00053 itkNewMacro( Self );
00054
00056 itkTypeMacro( TranslationTransform, Transform );
00057
00059 itkStaticConstMacro(SpaceDimension, unsigned int, NDimensions);
00060 itkStaticConstMacro(ParametersDimension, unsigned int, NDimensions);
00062
00064 typedef typename Superclass::ScalarType ScalarType;
00065
00067 typedef typename Superclass::ParametersType ParametersType;
00068
00070 typedef typename Superclass::JacobianType JacobianType;
00071
00073 typedef Vector<TScalarType, itkGetStaticConstMacro(SpaceDimension)> InputVectorType;
00074 typedef Vector<TScalarType, itkGetStaticConstMacro(SpaceDimension)> OutputVectorType;
00076
00078 typedef CovariantVector<TScalarType, itkGetStaticConstMacro(SpaceDimension)> InputCovariantVectorType;
00079 typedef CovariantVector<TScalarType, itkGetStaticConstMacro(SpaceDimension)> OutputCovariantVectorType;
00081
00083 typedef vnl_vector_fixed<TScalarType, itkGetStaticConstMacro(SpaceDimension)> InputVnlVectorType;
00084 typedef vnl_vector_fixed<TScalarType, itkGetStaticConstMacro(SpaceDimension)> OutputVnlVectorType;
00086
00088 typedef Point<TScalarType, itkGetStaticConstMacro(SpaceDimension)> InputPointType;
00089 typedef Point<TScalarType, itkGetStaticConstMacro(SpaceDimension)> OutputPointType;
00091
00094 const OutputVectorType & GetOffset(void) const
00095 { return m_Offset; }
00096
00099 void SetParameters(const ParametersType & parameters);
00100
00102 virtual const ParametersType& GetParameters(void) const;
00103
00107 void SetOffset(const OutputVectorType &offset)
00108 { m_Offset = offset; return; }
00109
00111 void Compose(const Self * other, bool pre=0);
00112
00117 void Translate(const OutputVectorType &offset, bool pre=0);
00118
00123 OutputPointType TransformPoint(const InputPointType &point ) const;
00124 OutputVectorType TransformVector(const InputVectorType &vector) const;
00125 OutputVnlVectorType TransformVector(const InputVnlVectorType &vector) const;
00126 OutputCovariantVectorType TransformCovariantVector(
00127 const InputCovariantVectorType &vector) const;
00129
00133 inline InputPointType BackTransform(const OutputPointType &point ) const;
00134 inline InputVectorType BackTransform(const OutputVectorType &vector) const;
00135 inline InputVnlVectorType BackTransform(const OutputVnlVectorType &vector) const;
00136 inline InputCovariantVectorType BackTransform(
00137 const OutputCovariantVectorType &vector) const;
00139
00144 bool GetInverse(Self* inverse) const;
00145
00147 virtual const JacobianType & GetJacobian(const InputPointType &point ) const;
00148
00150 void SetIdentity(void);
00151
00153 virtual unsigned int GetNumberOfParameters(void) const
00154 { return NDimensions; }
00155
00161 virtual bool IsLinear() const { return true; }
00162
00163 protected:
00164 TranslationTransform();
00165 ~TranslationTransform();
00167 void PrintSelf(std::ostream &os, Indent indent) const;
00168
00169 private:
00170 TranslationTransform(const Self&);
00171 void operator=(const Self&);
00172
00173 OutputVectorType m_Offset;
00174
00175
00176 };
00177
00178
00179
00180 template<class TScalarType, unsigned int NDimensions>
00181 inline
00182 typename TranslationTransform<TScalarType, NDimensions>::InputPointType
00183 TranslationTransform<TScalarType, NDimensions>::
00184 BackTransform(const OutputPointType &point) const {
00185 return point - m_Offset;
00186 }
00187
00188
00189
00190
00191
00192 template<class TScalarType, unsigned int NDimensions>
00193 inline
00194 typename TranslationTransform<TScalarType, NDimensions>::InputVectorType
00195 TranslationTransform<TScalarType, NDimensions>::
00196 BackTransform(const OutputVectorType &vect ) const
00197 {
00198 return vect;
00199 }
00200
00201
00202
00203
00204
00205 template<class TScalarType, unsigned int NDimensions>
00206 inline
00207 typename TranslationTransform<TScalarType, NDimensions>::InputVnlVectorType
00208 TranslationTransform<TScalarType, NDimensions>::
00209 BackTransform(const OutputVnlVectorType &vect ) const
00210 {
00211 return vect;
00212 }
00213
00214
00215
00216 template<class TScalarType, unsigned int NDimensions>
00217 inline
00218 typename TranslationTransform<TScalarType, NDimensions>::InputCovariantVectorType
00219 TranslationTransform<TScalarType, NDimensions>::
00220 BackTransform(const OutputCovariantVectorType &vect) const
00221 {
00222 return vect;
00223 }
00224
00225 }
00226
00227
00228 #define ITK_TEMPLATE_TranslationTransform(_, EXPORT, x, y) namespace itk { \
00229 _(2(class EXPORT TranslationTransform< ITK_TEMPLATE_2 x >)) \
00230 namespace Templates { typedef TranslationTransform< ITK_TEMPLATE_2 x > TranslationTransform##y; } \
00231 }
00232
00233 #if ITK_TEMPLATE_EXPLICIT
00234 # include "Templates/itkTranslationTransform+-.h"
00235 #endif
00236
00237 #if ITK_TEMPLATE_TXX
00238 # include "itkTranslationTransform.txx"
00239 #endif
00240
00241 #endif
00242