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

Common/vtkMatrix4x4.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    $RCSfile: vtkMatrix4x4.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 =========================================================================*/
00047 #ifndef __vtkMatrix4x4_h
00048 #define __vtkMatrix4x4_h
00049 
00050 #include "vtkObject.h"
00051 
00052 class VTK_COMMON_EXPORT vtkMatrix4x4 : public vtkObject
00053 {
00054   // Some of the methods in here have a corresponding static (class)
00055   // method taking a pointer to 16 doubles that constitutes a user
00056   // supplied matrix. This allows C++ clients to allocate double arrays
00057   // on the stack and manipulate them using vtkMatrix4x4 methods. 
00058   // This is an alternative to allowing vtkMatrix4x4 instances to be
00059   // created on the stack (which is frowned upon) or doing lots of
00060   // temporary heap allocation within vtkTransform and vtkActor methods,
00061   // which is inefficient.
00062 
00063 public:
00064   double Element[4][4];
00065 
00067   static vtkMatrix4x4 *New();
00068 
00069   vtkTypeRevisionMacro(vtkMatrix4x4,vtkObject);
00070   void PrintSelf(ostream& os, vtkIndent indent);
00071   
00073 
00075   void DeepCopy(vtkMatrix4x4 *source) 
00076     {vtkMatrix4x4::DeepCopy(*this->Element,source); this->Modified(); }
00078 //BTX
00079   static void DeepCopy(double Elements[16], vtkMatrix4x4 *source) 
00080     {vtkMatrix4x4::DeepCopy(Elements,*source->Element); }
00081   static void DeepCopy(double Elements[16], const double newElements[16]);
00082 //ETX
00083 
00085 
00086   void DeepCopy(const double Elements[16]) 
00087     { this->DeepCopy(*this->Element,Elements); this->Modified(); }
00089 
00091 
00092   void Zero() 
00093     { vtkMatrix4x4::Zero(*this->Element); this->Modified(); }
00095 //BTX
00096   static void Zero(double Elements[16]);
00097 //ETX  
00098 
00100 
00101   void Identity() 
00102     { vtkMatrix4x4::Identity(*this->Element); this->Modified();}
00104 //BTX
00105   static void Identity(double Elements[16]);
00106 //ETX  
00107 
00109 
00111   static void Invert(vtkMatrix4x4 *in, vtkMatrix4x4 *out) 
00112     {vtkMatrix4x4::Invert(*in->Element,*out->Element); out->Modified(); }
00113   void Invert() 
00114     { vtkMatrix4x4::Invert(this,this); }
00116 //BTX
00117   static void Invert(const double inElements[16], double outElements[16]);
00118 //ETX
00119 
00120 
00122 
00123   static void Transpose(vtkMatrix4x4 *in, vtkMatrix4x4 *out) 
00124     {vtkMatrix4x4::Transpose(*in->Element,*out->Element); out->Modified(); }
00125   void Transpose() 
00126     { vtkMatrix4x4::Transpose(this,this); }
00128 //BTX
00129   static void Transpose(const double inElements[16], double outElements[16]);
00130 //ETX
00131 
00133 
00135   void MultiplyPoint(const float in[4], float out[4]) 
00136     {vtkMatrix4x4::MultiplyPoint(*this->Element,in,out); }
00137   void MultiplyPoint(const double in[4], double out[4]) 
00138     {vtkMatrix4x4::MultiplyPoint(*this->Element,in,out); }
00140 
00141 //BTX
00142   static void MultiplyPoint(const double Elements[16], 
00143                             const float in[4], float out[4]);
00144   static void MultiplyPoint(const double Elements[16], 
00145                             const double in[4], double out[4]);
00146 //ETX
00147 
00149 
00151   float *MultiplyPoint(const float in[4]) 
00152     {return this->MultiplyFloatPoint(in); }
00153   float *MultiplyFloatPoint(const float in[4]) 
00154     {this->MultiplyPoint(in,this->FloatPoint); return this->FloatPoint; } 
00155   double *MultiplyDoublePoint(const double in[4]) 
00156     {this->MultiplyPoint(in,this->DoublePoint); return this->DoublePoint; } 
00158 
00160 
00161   static void Multiply4x4(vtkMatrix4x4 *a, vtkMatrix4x4 *b, vtkMatrix4x4 *c) {
00162     vtkMatrix4x4::Multiply4x4(*a->Element,*b->Element,*c->Element); };
00164 //BTX
00165   static void Multiply4x4(const double a[16], const double b[16], 
00166                           double c[16]);
00167 //ETX
00168 
00170 
00171   void Adjoint(vtkMatrix4x4 *in, vtkMatrix4x4 *out) 
00172     {vtkMatrix4x4::Adjoint(*in->Element,*out->Element);}
00174 //BTX
00175   static void Adjoint(const double inElements[16], double outElements[16]);
00176 //ETX
00177 
00179   double Determinant() {return vtkMatrix4x4::Determinant(*this->Element);}
00180 //BTX
00181   static double Determinant(const double Elements[16]);
00182 //ETX
00183 
00185   void SetElement(int i, int j, double value);
00186 
00188 
00189   double GetElement(int i, int j) const 
00190     {return this->Element[i][j];}
00192 
00193 //BTX
00194   double *operator[](const unsigned int i) 
00195     {return &(this->Element[i][0]);}
00196   const double *operator[](unsigned int i) const
00197     { return &(this->Element[i][0]); }  
00198   void Adjoint(vtkMatrix4x4 &in,vtkMatrix4x4 &out)
00199     {this->Adjoint(&in,&out);}
00200   double Determinant(vtkMatrix4x4 &in) 
00201     {return this->Determinant(&in);}
00202   double Determinant(vtkMatrix4x4 *in) 
00203     {return vtkMatrix4x4::Determinant(*in->Element);}
00204   void Invert(vtkMatrix4x4 &in,vtkMatrix4x4 &out)
00205     {this->Invert(&in,&out);}
00206   void Transpose(vtkMatrix4x4 &in,vtkMatrix4x4 &out)
00207     {this->Transpose(&in,&out);}
00208   static void PointMultiply(const double Elements[16], 
00209                             const float in[4], float out[4]);
00210   static void PointMultiply(const double Elements[16], 
00211                             const double in[4], double out[4]);
00212 //ETX
00213 
00214 protected:
00215   vtkMatrix4x4() { vtkMatrix4x4::Identity(*this->Element); };
00216   ~vtkMatrix4x4() {};
00217   
00218   float FloatPoint[4];
00219   double DoublePoint[4];
00220 private:
00221   vtkMatrix4x4(const vtkMatrix4x4&);  // Not implemented
00222   void operator= (const vtkMatrix4x4&);  // Not implemented
00223 };
00224 
00225 inline void vtkMatrix4x4::SetElement(int i, int j, double value)
00226 {
00227   if (this->Element[i][j] != value)
00228     {
00229     this->Element[i][j] = value;
00230     this->Modified();
00231     }
00232 }
00233 
00234 #endif
00235