/vol/vipdata/irtk/packages/transformation/include/irtkRigidTransformation.h

00001 /*=========================================================================
00002 
00003   Library   : Image Registration Toolkit (IRTK)
00004   Module    : $Id: irtkRigidTransformation.h 2 2008-12-23 12:40:14Z dr $
00005   Copyright : Imperial College, Department of Computing
00006               Visual Information Processing (VIP), 2008 onwards
00007   Date      : $Date: 2008-12-23 12:40:14 +0000 (Tue, 23 Dec 2008) $
00008   Version   : $Revision: 2 $
00009   Changes   : $Author: dr $
00010 
00011 =========================================================================*/
00012 
00013 #ifndef _IRTKRIGIDTRANSFORMATION_H
00014 
00015 #define _IRTKRIGIDTRANSFORMATION_H
00016 
00029 class irtkRigidTransformation : public irtkHomogeneousTransformation
00030 {
00031 
00032 protected:
00033 
00035   double _tx;
00036 
00038   double _ty;
00039 
00041   double _tz;
00042 
00044   double _rx;
00045 
00047   double _ry;
00048 
00050   double _rz;
00051 
00053   virtual irtkMatrix Parameters2Matrix(double *) const;
00054 
00056   virtual void Matrix2Parameters(irtkMatrix, double*) const;
00057 
00060   virtual void SetParameters(double *params);
00061 
00062 public:
00063 
00065   irtkRigidTransformation();
00066 
00068   irtkRigidTransformation(const irtkRigidTransformation &);
00069 
00071   virtual ~irtkRigidTransformation();
00072 
00074   void   PutTranslationX(double);
00075 
00077   virtual double GetTranslationX();
00078 
00080   virtual void   PutTranslationY(double);
00081 
00083   virtual double GetTranslationY();
00084 
00086   virtual void   PutTranslationZ(double);
00087 
00089   virtual double GetTranslationZ();
00090 
00092   virtual void   PutRotationX(double);
00093 
00095   virtual double GetRotationX();
00096 
00098   virtual void   PutRotationY(double);
00099 
00101   virtual double GetRotationY();
00102 
00104   virtual void   PutRotationZ(double);
00105 
00107   virtual double GetRotationZ();
00108 
00110   virtual int NumberOfDOFs() const;
00111 
00113   virtual void   Put(int, double);
00114 
00116   virtual double Get(int) const;
00117 
00119   virtual void Rotate(double& x, double& y, double& z);
00120 
00122   virtual Bool IsIdentity();
00123 
00125   virtual void Print();
00126 
00128   static int CheckHeader(char *);
00129 
00131   virtual const char *NameOfClass();
00132 
00134   virtual irtkCifstream& Read(irtkCifstream&);
00135 
00137   virtual irtkCofstream& Write(irtkCofstream&);
00138 
00140   virtual istream& Import(istream&);
00141 
00143   virtual ostream& Export(ostream&);
00144 
00146   virtual void PutMatrix(const irtkMatrix &);
00147 
00149   virtual void UpdateMatrix();
00150 
00152   virtual void UpdateParameter();
00153 };
00154 
00155 inline int irtkRigidTransformation::NumberOfDOFs() const
00156 {
00157   return 6;
00158 }
00159 
00160 inline irtkRigidTransformation::irtkRigidTransformation()
00161 {
00162   int i;
00163 
00164   _tx = _ty = _tz = 0;
00165   _rx = _ry = _rz = 0;
00166 
00167   // Free memory allocated for DOF status by base class
00168   delete []_status;
00169 
00170   // Allocate memory for DOF status
00171   _status = new _Status[this->NumberOfDOFs()];
00172 
00173   // Initialize memory for DOF status
00174   for (i = 0; i < this->NumberOfDOFs(); i++) {
00175     _status[i] = _Active;
00176   }
00177 
00178   // Update transformation matrix
00179   this->UpdateMatrix();
00180 }
00181 
00182 inline irtkRigidTransformation::irtkRigidTransformation(const irtkRigidTransformation &t)
00183 {
00184   int i;
00185 
00186   _tx = t._tx;
00187   _ty = t._ty;
00188   _tz = t._tz;
00189   _rx = t._rx;
00190   _ry = t._ry;
00191   _rz = t._rz;
00192 
00193   // Free memory allocated for DOF status by base class
00194   delete []_status;
00195 
00196   // Allocate memory for DOF status
00197   _status = new _Status[this->NumberOfDOFs()];
00198 
00199   // Initialize memory for DOF status
00200   for (i = 0; i < this->NumberOfDOFs(); i++) {
00201     _status[i] = t._status[i];
00202   }
00203 
00204   // Update transformation matrix
00205   this->UpdateMatrix();
00206 }
00207 
00208 inline irtkRigidTransformation::~irtkRigidTransformation()
00209 {
00210 }
00211 
00212 inline void irtkRigidTransformation::PutRotationX(double rx)
00213 {
00214   _rx = rx;
00215   this->UpdateMatrix();
00216 }
00217 
00218 inline double irtkRigidTransformation::GetRotationX()
00219 {
00220   return _rx;
00221 }
00222 
00223 inline void irtkRigidTransformation::PutRotationY(double ry)
00224 {
00225   _ry = ry;
00226   this->UpdateMatrix();
00227 }
00228 
00229 inline double irtkRigidTransformation::GetRotationY()
00230 {
00231   return _ry;
00232 }
00233 
00234 inline void irtkRigidTransformation::PutRotationZ(double rz)
00235 {
00236   _rz = rz;
00237   this->UpdateMatrix();
00238 }
00239 
00240 inline double irtkRigidTransformation::GetRotationZ()
00241 {
00242   return _rz;
00243 }
00244 
00245 inline void irtkRigidTransformation::PutTranslationX(double tx)
00246 {
00247   _tx = tx;
00248   this->UpdateMatrix();
00249 }
00250 
00251 inline double irtkRigidTransformation::GetTranslationX()
00252 {
00253   return _tx;
00254 }
00255 
00256 inline void irtkRigidTransformation::PutTranslationY(double ty)
00257 {
00258   _ty = ty;
00259   this->UpdateMatrix();
00260 }
00261 
00262 inline double irtkRigidTransformation::GetTranslationY()
00263 {
00264   return _ty;
00265 }
00266 
00267 inline void irtkRigidTransformation::PutTranslationZ(double tz)
00268 {
00269   _tz = tz;
00270   this->UpdateMatrix();
00271 }
00272 
00273 inline double irtkRigidTransformation::GetTranslationZ()
00274 {
00275   return _tz;
00276 }
00277 
00278 inline void irtkRigidTransformation::PutMatrix(const irtkMatrix &matrix)
00279 {
00280   _matrix = matrix;
00281   this->UpdateParameter();
00282 }
00283 
00284 inline const char *irtkRigidTransformation::NameOfClass()
00285 {
00286   return "irtkRigidTransformation";
00287 }
00288 
00289 inline void irtkRigidTransformation::SetParameters(double *params)
00290 {
00291   _tx = params[TX];
00292   _ty = params[TY];
00293   _tz = params[TZ];
00294 
00295   _rx = params[RX];
00296   _ry = params[RY];
00297   _rz = params[RZ];
00298 
00299   this->UpdateMatrix();
00300 }
00301 
00302 #endif