00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00051 #ifndef __vtkTransform_h
00052 #define __vtkTransform_h
00053
00054 #include "vtkLinearTransform.h"
00055
00056 #include "vtkMatrix4x4.h"
00057
00058 class VTK_COMMON_EXPORT vtkTransform : public vtkLinearTransform
00059 {
00060 public:
00061 static vtkTransform *New();
00062 vtkTypeMacro(vtkTransform,vtkLinearTransform);
00063 void PrintSelf(ostream& os, vtkIndent indent);
00064
00068 void Identity();
00069
00073 void Inverse();
00074
00076
00078 void Translate(double x, double y, double z) {
00079 this->Concatenation->Translate(x,y,z); };
00080 void Translate(const double x[3]) { this->Translate(x[0], x[1], x[2]); };
00081 void Translate(const float x[3]) { this->Translate(x[0], x[1], x[2]); };
00083
00085
00089 void RotateWXYZ(double angle, double x, double y, double z) {
00090 this->Concatenation->Rotate(angle,x,y,z); };
00091 void RotateWXYZ(double angle, const double axis[3]) {
00092 this->RotateWXYZ(angle, axis[0], axis[1], axis[2]); };
00093 void RotateWXYZ(double angle, const float axis[3]) {
00094 this->RotateWXYZ(angle, axis[0], axis[1], axis[2]); };
00096
00098
00101 void RotateX(double angle) { this->RotateWXYZ(angle, 1, 0, 0); };
00102 void RotateY(double angle) { this->RotateWXYZ(angle, 0, 1, 0); };
00103 void RotateZ(double angle) { this->RotateWXYZ(angle, 0, 0, 1); };
00105
00107
00110 void Scale(double x, double y, double z) {
00111 this->Concatenation->Scale(x,y,z); };
00112 void Scale(const double s[3]) { this->Scale(s[0], s[1], s[2]); };
00113 void Scale(const float s[3]) { this->Scale(s[0], s[1], s[2]); };
00115
00117
00119 void SetMatrix(vtkMatrix4x4 *matrix) {
00120 this->SetMatrix(*matrix->Element); };
00121 void SetMatrix(const double elements[16]) {
00122 this->Identity(); this->Concatenate(elements); };
00124
00126
00128 void Concatenate(vtkMatrix4x4 *matrix) {
00129 this->Concatenate(*matrix->Element); };
00130 void Concatenate(const double elements[16]) {
00131 this->Concatenation->Concatenate(elements); };
00133
00139 void Concatenate(vtkLinearTransform *transform);
00140
00142
00147 void PreMultiply() {
00148 if (this->Concatenation->GetPreMultiplyFlag()) { return; }
00149 this->Concatenation->SetPreMultiplyFlag(1); this->Modified(); };
00151
00153
00158 void PostMultiply() {
00159 if (!this->Concatenation->GetPreMultiplyFlag()) { return; }
00160 this->Concatenation->SetPreMultiplyFlag(0); this->Modified(); };
00162
00164
00166 int GetNumberOfConcatenatedTransforms() {
00167 return this->Concatenation->GetNumberOfTransforms() +
00168 (this->Input == NULL ? 0 : 1); };
00170
00172
00177 vtkLinearTransform *GetConcatenatedTransform(int i)
00178 {
00179 vtkAbstractTransform *t;
00180 if (this->Input == NULL)
00181 {
00182 t=this->Concatenation->GetTransform(i);
00183 }
00184 else if (i < this->Concatenation->GetNumberOfPreTransforms())
00185 {
00186 t=this->Concatenation->GetTransform(i);
00187 }
00188 else if (i > this->Concatenation->GetNumberOfPreTransforms())
00189 {
00190 t=this->Concatenation->GetTransform(i-1);
00191 }
00192 else if (this->GetInverseFlag())
00193 {
00194 t=this->Input->GetInverse();
00195 }
00196 else
00197 {
00198 t=this->Input;
00199 }
00200 return static_cast<vtkLinearTransform *>(t);
00201 }
00203
00205
00207 void GetOrientation(double orient[3]);
00208 void GetOrientation(float orient[3]) {
00209 double temp[3]; this->GetOrientation(temp);
00210 orient[0] = static_cast<float>(temp[0]);
00211 orient[1] = static_cast<float>(temp[1]);
00212 orient[2] = static_cast<float>(temp[2]); };
00213 double *GetOrientation() {
00214 this->GetOrientation(this->ReturnValue); return this->ReturnValue; };
00216
00219 static void GetOrientation(double orient[3], vtkMatrix4x4 *matrix);
00220
00222
00224 void GetOrientationWXYZ(double wxyz[4]);
00225 void GetOrientationWXYZ(float wxyz[4]) {
00226 double temp[4]; this->GetOrientationWXYZ(temp);
00227 wxyz[0]=static_cast<float>(temp[0]);
00228 wxyz[1]=static_cast<float>(temp[1]);
00229 wxyz[2]=static_cast<float>(temp[2]);
00230 wxyz[3]=static_cast<float>(temp[3]);};
00231 double *GetOrientationWXYZ() {
00232 this->GetOrientationWXYZ(this->ReturnValue); return this->ReturnValue; };
00234
00236
00239 void GetPosition(double pos[3]);
00240 void GetPosition(float pos[3]) {
00241 double temp[3]; this->GetPosition(temp);
00242 pos[0] = static_cast<float>(temp[0]);
00243 pos[1] = static_cast<float>(temp[1]);
00244 pos[2] = static_cast<float>(temp[2]); };
00245 double *GetPosition() {
00246 this->GetPosition(this->ReturnValue); return this->ReturnValue; };
00248
00250
00254 void GetScale(double scale[3]);
00255 void GetScale(float scale[3]) {
00256 double temp[3]; this->GetScale(temp);
00257 scale[0] = static_cast<float>(temp[0]);
00258 scale[1] = static_cast<float>(temp[1]);
00259 scale[2] = static_cast<float>(temp[2]); };
00260 double *GetScale() {
00261 this->GetScale(this->ReturnValue); return this->ReturnValue; };
00263
00266 void GetInverse(vtkMatrix4x4 *inverse);
00267
00271 void GetTranspose(vtkMatrix4x4 *transpose);
00272
00274
00280 void SetInput(vtkLinearTransform *input);
00281 vtkLinearTransform *GetInput() { return this->Input; };
00283
00285
00289 int GetInverseFlag() {
00290 return this->Concatenation->GetInverseFlag(); };
00292
00294
00295 void Push() { if (this->Stack == NULL) {
00296 this->Stack = vtkTransformConcatenationStack::New(); }
00297 this->Stack->Push(&this->Concatenation);
00298 this->Modified(); };
00300
00302
00304 void Pop() { if (this->Stack == NULL) { return; }
00305 this->Stack->Pop(&this->Concatenation);
00306 this->Modified(); };
00308
00315 int CircuitCheck(vtkAbstractTransform *transform);
00316
00317
00318
00319 vtkAbstractTransform *GetInverse() {
00320 return vtkLinearTransform::GetInverse(); }
00321
00323 vtkAbstractTransform *MakeTransform();
00324
00326 unsigned long GetMTime();
00327
00329
00332 void MultiplyPoint(const float in[4], float out[4]) {
00333 this->GetMatrix()->MultiplyPoint(in,out);};
00334 void MultiplyPoint(const double in[4], double out[4]) {
00335 this->GetMatrix()->MultiplyPoint(in,out);};
00337
00338 protected:
00339 vtkTransform ();
00340 ~vtkTransform ();
00341
00342 void InternalDeepCopy(vtkAbstractTransform *t);
00343
00344 void InternalUpdate();
00345
00346 vtkLinearTransform *Input;
00347 vtkTransformConcatenation *Concatenation;
00348 vtkTransformConcatenationStack *Stack;
00349
00350
00351
00352 unsigned long MatrixUpdateMTime;
00353
00354 float Point[4];
00355 double DoublePoint[4];
00356 double ReturnValue[4];
00357 private:
00358 vtkTransform (const vtkTransform&);
00359 void operator=(const vtkTransform&);
00360 };
00361
00362 #endif