Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Related Pages  

Common/vtkTransform.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    $RCSfile: vtkTransform.h,v $
00005   Language:  C++
00006 
00007   Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen 
00008   All rights reserved.
00009   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00010 
00011      This software is distributed WITHOUT ANY WARRANTY; without even 
00012      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
00013      PURPOSE.  See the above copyright notice for more information.
00014 
00015 =========================================================================*/
00016 
00069 #ifndef __vtkTransform_h
00070 #define __vtkTransform_h
00071 
00072 #include "vtkLinearTransform.h"
00073 
00074 #include "vtkMatrix4x4.h" // Needed for inline methods
00075 
00076 class VTK_COMMON_EXPORT vtkTransform : public vtkLinearTransform
00077 {
00078  public:
00079   static vtkTransform *New();
00080   vtkTypeRevisionMacro(vtkTransform,vtkLinearTransform);
00081   void PrintSelf(ostream& os, vtkIndent indent);
00082 
00086   void Identity();
00087 
00091   void Inverse();
00092 
00094 
00096   void Translate(double x, double y, double z) {
00097     this->Concatenation->Translate(x,y,z); };
00098   void Translate(const double x[3]) { this->Translate(x[0], x[1], x[2]); };
00099   void Translate(const float x[3]) { this->Translate(x[0], x[1], x[2]); };
00101 
00103 
00107   void RotateWXYZ(double angle, double x, double y, double z) {
00108     this->Concatenation->Rotate(angle,x,y,z); };
00109   void RotateWXYZ(double angle, const double axis[3]) {
00110     this->RotateWXYZ(angle, axis[0], axis[1], axis[2]); };
00111   void RotateWXYZ(double angle, const float axis[3]) {
00112     this->RotateWXYZ(angle, axis[0], axis[1], axis[2]); };
00114 
00116 
00119   void RotateX(double angle) { this->RotateWXYZ(angle, 1, 0, 0); };
00120   void RotateY(double angle) { this->RotateWXYZ(angle, 0, 1, 0); };
00121   void RotateZ(double angle) { this->RotateWXYZ(angle, 0, 0, 1); };
00123 
00125 
00128   void Scale(double x, double y, double z) {
00129     this->Concatenation->Scale(x,y,z); };
00130   void Scale(const double s[3]) { this->Scale(s[0], s[1], s[2]); };
00131   void Scale(const float s[3]) { this->Scale(s[0], s[1], s[2]); };
00133 
00135 
00137   void SetMatrix(vtkMatrix4x4 *matrix) { 
00138     this->SetMatrix(*matrix->Element); };
00139   void SetMatrix(const double elements[16]) { 
00140     this->Identity(); this->Concatenate(elements); };
00142 
00144 
00146   void Concatenate(vtkMatrix4x4 *matrix) { 
00147     this->Concatenate(*matrix->Element); };
00148   void Concatenate(const double elements[16]) {
00149     this->Concatenation->Concatenate(elements); };
00151 
00157   void Concatenate(vtkLinearTransform *transform);
00158 
00160 
00165   void PreMultiply() { 
00166     if (this->Concatenation->GetPreMultiplyFlag()) { return; }
00167     this->Concatenation->SetPreMultiplyFlag(1); this->Modified(); };
00169 
00171 
00176   void PostMultiply()  { 
00177     if (!this->Concatenation->GetPreMultiplyFlag()) { return; }
00178     this->Concatenation->SetPreMultiplyFlag(0); this->Modified(); };
00180 
00182 
00184   int GetNumberOfConcatenatedTransforms() {
00185     return this->Concatenation->GetNumberOfTransforms() + 
00186       (this->Input == NULL ? 0 : 1); };
00188 
00190 
00195   vtkLinearTransform *GetConcatenatedTransform(int i) {
00196     if (this->Input == NULL) {
00197       return (vtkLinearTransform *)this->Concatenation->GetTransform(i); }
00198     else if (i < this->Concatenation->GetNumberOfPreTransforms()) {
00199       return (vtkLinearTransform *)this->Concatenation->GetTransform(i); }
00200     else if (i > this->Concatenation->GetNumberOfPreTransforms()) {
00201       return (vtkLinearTransform *)this->Concatenation->GetTransform(i-1); } 
00202     else if (this->GetInverseFlag()) {
00203       return (vtkLinearTransform *)this->Input->GetInverse(); }
00204     else {
00205       return (vtkLinearTransform *)this->Input; } };
00207 
00209 
00211   void GetOrientation(double orient[3]);
00212   void GetOrientation(float orient[3]) {
00213     double temp[3]; this->GetOrientation(temp); 
00214     orient[0] = static_cast<float>(temp[0]); 
00215     orient[1] = static_cast<float>(temp[1]); 
00216     orient[2] = static_cast<float>(temp[2]); };
00217   float *GetOrientation() { 
00218     this->GetOrientation(this->ReturnValue); return this->ReturnValue; };
00220 
00222 
00223   void GetOrientationWXYZ(double wxyz[4]);
00224   void GetOrientationWXYZ(float wxyz[3]) {
00225     double temp[4]; this->GetOrientationWXYZ(temp); 
00226     wxyz[0]=static_cast<float>(temp[0]); 
00227     wxyz[1]=static_cast<float>(temp[1]); 
00228     wxyz[2]=static_cast<float>(temp[2]); 
00229     wxyz[3]=static_cast<float>(temp[3]);};
00230   float *GetOrientationWXYZ() { 
00231     this->GetOrientationWXYZ(this->ReturnValue); return this->ReturnValue; };
00233 
00235 
00238   void GetPosition(double pos[3]);
00239   void GetPosition(float pos[3]) {
00240     double temp[3]; this->GetPosition(temp); 
00241     pos[0] = static_cast<float>(temp[0]); 
00242     pos[1] = static_cast<float>(temp[1]); 
00243     pos[2] = static_cast<float>(temp[2]); };
00244   float *GetPosition() { 
00245     this->GetPosition(this->ReturnValue); return this->ReturnValue; };
00247 
00249 
00253   void GetScale(double scale[3]);
00254   void GetScale(float scale[3]) {
00255     double temp[3]; this->GetScale(temp); 
00256     scale[0] = static_cast<float>(temp[0]); 
00257     scale[1] = static_cast<float>(temp[1]); 
00258     scale[2] = static_cast<float>(temp[2]); };
00259   float *GetScale() { 
00260     this->GetScale(this->ReturnValue); return this->ReturnValue; };
00262 
00265   void GetInverse(vtkMatrix4x4 *inverse);
00266 
00270   void GetTranspose(vtkMatrix4x4 *transpose);
00271 
00273 
00279   void SetInput(vtkLinearTransform *input);
00280   vtkLinearTransform *GetInput() { return this->Input; };
00282 
00284 
00288   int GetInverseFlag() {
00289     return this->Concatenation->GetInverseFlag(); };
00291 
00293 
00294   void Push() { if (this->Stack == NULL) { 
00295                     this->Stack = vtkTransformConcatenationStack::New(); }
00296                 this->Stack->Push(&this->Concatenation); 
00297                 this->Modified(); };
00299 
00301 
00303   void Pop() { if (this->Stack == NULL) { return; }
00304                this->Stack->Pop(&this->Concatenation);
00305                this->Modified(); };
00307 
00314   int CircuitCheck(vtkAbstractTransform *transform);
00315 
00316   // Return an inverse transform which will always update itself
00317   // to match this transform.
00318   vtkAbstractTransform *GetInverse() { 
00319     return vtkLinearTransform::GetInverse(); }
00320 
00322   vtkAbstractTransform *MakeTransform();
00323 
00325   unsigned long GetMTime();
00326 
00328 
00331   void MultiplyPoint(const float in[4], float out[4]) {
00332     this->GetMatrix()->MultiplyPoint(in,out);};
00333   void MultiplyPoint(const double in[4], double out[4]) {      
00334     this->GetMatrix()->MultiplyPoint(in,out);};
00336 
00337 protected:
00338   vtkTransform ();
00339   ~vtkTransform ();
00340 
00341   void InternalDeepCopy(vtkAbstractTransform *t);
00342 
00343   void InternalUpdate();
00344 
00345   vtkLinearTransform *Input;
00346   vtkTransformConcatenation *Concatenation;
00347   vtkTransformConcatenationStack *Stack;
00348 
00349   // this allows us to check whether people have been fooling
00350   // around with our matrix
00351   unsigned long MatrixUpdateMTime;
00352 
00353   float Point[4];
00354   double DoublePoint[4];
00355   float ReturnValue[4];
00356 private:
00357   vtkTransform (const vtkTransform&);  // Not implemented
00358   void operator=(const vtkTransform&);  // Not implemented
00359 };
00360 
00361 #endif