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