VTK
dox/Common/Transforms/vtkAbstractTransform.h
Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    vtkAbstractTransform.h
00005 
00006   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
00007   All rights reserved.
00008   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00009 
00010      This software is distributed WITHOUT ANY WARRANTY; without even
00011      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00012      PURPOSE.  See the above copyright notice for more information.
00013 
00014 =========================================================================*/
00038 #ifndef __vtkAbstractTransform_h
00039 #define __vtkAbstractTransform_h
00040 
00041 #include "vtkCommonTransformsModule.h" // For export macro
00042 #include "vtkObject.h"
00043 
00044 class vtkDataArray;
00045 class vtkMatrix4x4;
00046 class vtkPoints;
00047 class vtkSimpleCriticalSection;
00048 
00049 class VTKCOMMONTRANSFORMS_EXPORT vtkAbstractTransform : public vtkObject
00050 {
00051 public:
00052 
00053   vtkTypeMacro(vtkAbstractTransform,vtkObject);
00054   void PrintSelf(ostream& os, vtkIndent indent);
00055 
00057 
00059   void TransformPoint(const float in[3], float out[3]) {
00060     this->Update(); this->InternalTransformPoint(in,out); };
00062 
00064 
00066   void TransformPoint(const double in[3], double out[3]) {
00067     this->Update(); this->InternalTransformPoint(in,out); };
00069 
00071 
00073   double *TransformPoint(double x, double y, double z) {
00074     return this->TransformDoublePoint(x,y,z); }
00075   double *TransformPoint(const double point[3]) {
00076     return this->TransformPoint(point[0],point[1],point[2]); };
00078 
00080 
00082   float *TransformFloatPoint(float x, float y, float z) {
00083       this->InternalFloatPoint[0] = x;
00084       this->InternalFloatPoint[1] = y;
00085       this->InternalFloatPoint[2] = z;
00086       this->TransformPoint(this->InternalFloatPoint,this->InternalFloatPoint);
00087       return this->InternalFloatPoint; };
00088   float *TransformFloatPoint(const float point[3]) {
00089     return this->TransformFloatPoint(point[0],point[1],point[2]); };
00091 
00093 
00095   double *TransformDoublePoint(double x, double y, double z) {
00096     this->InternalDoublePoint[0] = x;
00097     this->InternalDoublePoint[1] = y;
00098     this->InternalDoublePoint[2] = z;
00099     this->TransformPoint(this->InternalDoublePoint,this->InternalDoublePoint);
00100     return this->InternalDoublePoint; };
00101   double *TransformDoublePoint(const double point[3]) {
00102     return this->TransformDoublePoint(point[0],point[1],point[2]); };
00104 
00106 
00109   void TransformNormalAtPoint(const float point[3], const float in[3],
00110                               float out[3]);
00111   void TransformNormalAtPoint(const double point[3], const double in[3],
00112                               double out[3]);
00114 
00115   double *TransformNormalAtPoint(const double point[3],
00116                                  const double normal[3]) {
00117     this->TransformNormalAtPoint(point,normal,this->InternalDoublePoint);
00118     return this->InternalDoublePoint; };
00119 
00121 
00124   double *TransformDoubleNormalAtPoint(const double point[3],
00125                                        const double normal[3]) {
00126     this->TransformNormalAtPoint(point,normal,this->InternalDoublePoint);
00127     return this->InternalDoublePoint; };
00129 
00131 
00134   float *TransformFloatNormalAtPoint(const float point[3],
00135                                      const float normal[3]) {
00136     this->TransformNormalAtPoint(point,normal,this->InternalFloatPoint);
00137     return this->InternalFloatPoint; };
00139 
00141 
00144   void TransformVectorAtPoint(const float point[3], const float in[3],
00145                               float out[3]);
00146   void TransformVectorAtPoint(const double point[3], const double in[3],
00147                               double out[3]);
00149 
00150   double *TransformVectorAtPoint(const double point[3],
00151                                  const double vector[3]) {
00152     this->TransformVectorAtPoint(point,vector,this->InternalDoublePoint);
00153     return this->InternalDoublePoint; };
00154 
00156 
00159   double *TransformDoubleVectorAtPoint(const double point[3],
00160                                        const double vector[3]) {
00161     this->TransformVectorAtPoint(point,vector,this->InternalDoublePoint);
00162     return this->InternalDoublePoint; };
00164 
00166 
00169   float *TransformFloatVectorAtPoint(const float point[3],
00170                                      const float vector[3]) {
00171     this->TransformVectorAtPoint(point,vector,this->InternalFloatPoint);
00172     return this->InternalFloatPoint; };
00174 
00177   virtual void TransformPoints(vtkPoints *inPts, vtkPoints *outPts);
00178 
00180 
00182   virtual void TransformPointsNormalsVectors(vtkPoints *inPts,
00183                                              vtkPoints *outPts,
00184                                              vtkDataArray *inNms,
00185                                              vtkDataArray *outNms,
00186                                              vtkDataArray *inVrs,
00187                                              vtkDataArray *outVrs);
00189 
00195   vtkAbstractTransform *GetInverse();
00196 
00200   void SetInverse(vtkAbstractTransform *transform);
00201 
00203   virtual void Inverse() = 0;
00204 
00206   void DeepCopy(vtkAbstractTransform *);
00207 
00211   void Update();
00212 
00214 
00216   virtual void InternalTransformPoint(const float in[3], float out[3]) = 0;
00217   virtual void InternalTransformPoint(const double in[3], double out[3]) = 0;
00219 
00221 
00225   virtual void InternalTransformDerivative(const float in[3], float out[3],
00226                                            float derivative[3][3]) = 0;
00227   virtual void InternalTransformDerivative(const double in[3], double out[3],
00228                                            double derivative[3][3]) = 0;
00230 
00232   virtual vtkAbstractTransform *MakeTransform() = 0;
00233 
00240   virtual int CircuitCheck(vtkAbstractTransform *transform);
00241 
00243   unsigned long GetMTime();
00244 
00247   virtual void UnRegister(vtkObjectBase *O);
00248 
00249 protected:
00250   vtkAbstractTransform();
00251   ~vtkAbstractTransform();
00252 
00254   virtual void InternalUpdate() {};
00255 
00257   virtual void InternalDeepCopy(vtkAbstractTransform *) {};
00258 
00259   float InternalFloatPoint[3];
00260   double InternalDoublePoint[3];
00261 
00262 private:
00263 
00264 //BTX
00265   // We need to record the time of the last update, and we also need
00266   // to do mutex locking so updates don't collide.  These are private
00267   // because Update() is not virtual.
00268   // If DependsOnInverse is set, then this transform object will
00269   // check its inverse on every update, and update itself accordingly
00270   // if necessary.
00271 //ETX
00272   vtkTimeStamp UpdateTime;
00273   vtkSimpleCriticalSection *UpdateMutex;
00274   vtkSimpleCriticalSection *InverseMutex;
00275   int DependsOnInverse;
00276 
00277 //BTX
00278   // MyInverse is a transform which is the inverse of this one.
00279 //ETX
00280   vtkAbstractTransform *MyInverse;
00281 
00282   int InUnRegister;
00283 
00284 private:
00285   vtkAbstractTransform(const vtkAbstractTransform&);  // Not implemented.
00286   void operator=(const vtkAbstractTransform&);  // Not implemented.
00287 };
00288 
00289 //BTX
00290 //-------------------------------------------------------------------------
00291 // A simple data structure to hold both a transform and its inverse.
00292 // One of ForwardTransform or InverseTransform might be NULL,
00293 // and must be acquired by calling GetInverse() on the other.
00294 class vtkTransformPair
00295 {
00296 public:
00297   vtkTransformPair() {};
00298 
00299   vtkAbstractTransform *ForwardTransform;
00300   vtkAbstractTransform *InverseTransform;
00301 
00302   void SwapForwardInverse() {
00303     vtkAbstractTransform *tmp = this->ForwardTransform;
00304     this->ForwardTransform = this->InverseTransform;
00305     this->InverseTransform = tmp; };
00306 };
00307 
00308 // .NAME vtkTransformConcatenation - store a series of transformations.
00309 // .SECTION Description
00310 // A helper class (not derived from vtkObject) to store a series of
00311 // transformations in a pipelined concatenation.
00312 class VTKCOMMONTRANSFORMS_EXPORT vtkTransformConcatenation
00313 {
00314 public:
00315   static vtkTransformConcatenation *New() {
00316     return new vtkTransformConcatenation(); };
00317   void Delete() { delete this; };
00318 
00320   void Concatenate(vtkAbstractTransform *transform);
00321 
00323   void Concatenate(const double elements[16]);
00324 
00326 
00327   void SetPreMultiplyFlag(int flag) { this->PreMultiplyFlag = flag; };
00328   int GetPreMultiplyFlag() { return this->PreMultiplyFlag; };
00330 
00332 
00333   void Translate(double x, double y, double z);
00334   void Rotate(double angle, double x, double y, double z);
00335   void Scale(double x, double y, double z);
00337 
00339   void Inverse();
00340 
00342   int GetInverseFlag() { return this->InverseFlag; };
00343 
00345   void Identity();
00346 
00347   // copy the list
00348   void DeepCopy(vtkTransformConcatenation *transform);
00349 
00351   int GetNumberOfTransforms() { return this->NumberOfTransforms; };
00352 
00356   int GetNumberOfPreTransforms() { return this->NumberOfPreTransforms; };
00357 
00359 
00360   int GetNumberOfPostTransforms() {
00361     return this->NumberOfTransforms-this->NumberOfPreTransforms; };
00363 
00365   vtkAbstractTransform *GetTransform(int i);
00366 
00368   unsigned long GetMaxMTime();
00369 
00370   void PrintSelf(ostream& os, vtkIndent indent);
00371 
00372 protected:
00373   vtkTransformConcatenation();
00374   ~vtkTransformConcatenation();
00375 
00376   int InverseFlag;
00377   int PreMultiplyFlag;
00378 
00379   vtkMatrix4x4 *PreMatrix;
00380   vtkMatrix4x4 *PostMatrix;
00381   vtkAbstractTransform *PreMatrixTransform;
00382   vtkAbstractTransform *PostMatrixTransform;
00383 
00384   int NumberOfTransforms;
00385   int NumberOfPreTransforms;
00386   int MaxNumberOfTransforms;
00387   vtkTransformPair *TransformList;
00388 };
00389 
00390 // .NAME vtkTransformConcatenationStack - Store a stack of concatenations.
00391 // .SECTION Description
00392 // A helper class (not derived from vtkObject) to store a stack of
00393 // concatenations.
00394 class VTKCOMMONTRANSFORMS_EXPORT vtkTransformConcatenationStack
00395 {
00396 public:
00397   static vtkTransformConcatenationStack *New()
00398     {
00399       return new vtkTransformConcatenationStack();
00400     }
00401   void Delete()
00402     {
00403       delete this;
00404     }
00405 
00408   void Pop(vtkTransformConcatenation **concat);
00409 
00412   void Push(vtkTransformConcatenation **concat);
00413 
00414   void DeepCopy(vtkTransformConcatenationStack *stack);
00415 
00416 protected:
00417   vtkTransformConcatenationStack();
00418   ~vtkTransformConcatenationStack();
00419 
00420   int StackSize;
00421   vtkTransformConcatenation **Stack;
00422   vtkTransformConcatenation **StackBottom;
00423 };
00424 
00425 //ETX
00426 
00427 #endif