00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00029 #ifndef __vtkMatrix3x3_h
00030 #define __vtkMatrix3x3_h
00031
00032 #include "vtkObject.h"
00033
00034 class VTK_COMMON_EXPORT vtkMatrix3x3 : public vtkObject
00035 {
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 public:
00047 static vtkMatrix3x3 *New();
00048
00049 vtkTypeMacro(vtkMatrix3x3,vtkObject);
00050 void PrintSelf(ostream& os, vtkIndent indent);
00051
00053
00055 void DeepCopy(vtkMatrix3x3 *source)
00056 {vtkMatrix3x3::DeepCopy(*this->Element,source); this->Modified(); }
00057
00058 static void DeepCopy(double Elements[9], vtkMatrix3x3 *source)
00059 {vtkMatrix3x3::DeepCopy(Elements,*source->Element); }
00060 static void DeepCopy(double Elements[9], const double newElements[9]);
00061
00063
00065
00066 void DeepCopy(const double Elements[9])
00067 { this->DeepCopy(*this->Element,Elements); this->Modified(); }
00069
00071
00072 void Zero()
00073 { vtkMatrix3x3::Zero(*this->Element); this->Modified(); }
00074
00075 static void Zero(double Elements[9]);
00076
00078
00080
00081 void Identity()
00082 { vtkMatrix3x3::Identity(*this->Element); this->Modified();}
00083
00084 static void Identity(double Elements[9]);
00085
00087
00089
00091 static void Invert(vtkMatrix3x3 *in, vtkMatrix3x3 *out)
00092 {vtkMatrix3x3::Invert(*in->Element,*out->Element); out->Modified(); }
00093 void Invert()
00094 { vtkMatrix3x3::Invert(this,this); }
00095
00096 static void Invert(const double inElements[9], double outElements[9]);
00097
00099
00100
00102
00103 static void Transpose(vtkMatrix3x3 *in, vtkMatrix3x3 *out)
00104 {vtkMatrix3x3::Transpose(*in->Element,*out->Element); out->Modified(); }
00105 void Transpose()
00106 { vtkMatrix3x3::Transpose(this,this); }
00107
00108 static void Transpose(const double inElements[9], double outElements[9]);
00109
00111
00113
00115 void MultiplyPoint(const float in[3], float out[3])
00116 {vtkMatrix3x3::MultiplyPoint(*this->Element,in,out); }
00117 void MultiplyPoint(const double in[3], double out[3])
00118 {vtkMatrix3x3::MultiplyPoint(*this->Element,in,out); }
00120
00121
00122 static void MultiplyPoint(const double Elements[9],
00123 const float in[3], float out[3]);
00124 static void MultiplyPoint(const double Elements[9],
00125 const double in[3], double out[3]);
00126
00127
00129
00130 static void Multiply3x3(vtkMatrix3x3 *a, vtkMatrix3x3 *b, vtkMatrix3x3 *c) {
00131 vtkMatrix3x3::Multiply3x3(*a->Element,*b->Element,*c->Element); }
00132
00133 static void Multiply3x3(const double a[9], const double b[9],
00134 double c[9]);
00135
00137
00139
00140 void Adjoint(vtkMatrix3x3 *in, vtkMatrix3x3 *out)
00141 {vtkMatrix3x3::Adjoint(*in->Element,*out->Element);}
00142
00143 static void Adjoint(const double inElements[9], double outElements[9]);
00144
00146
00148
00149 double Determinant() {return vtkMatrix3x3::Determinant(*this->Element);}
00150
00151 static double Determinant(const double Elements[9]);
00152
00154
00156 void SetElement(int i, int j, double value);
00157
00159
00160 double GetElement(int i, int j) const
00161 {return this->Element[i][j];}
00163
00164
00165 double *operator[](const unsigned int i)
00166 {return &(this->Element[i][0]);}
00167 const double *operator[](unsigned int i) const
00168 { return &(this->Element[i][0]); }
00169 bool operator==(const vtkMatrix3x3&);
00170 bool operator!=(const vtkMatrix3x3&);
00171 void Adjoint(vtkMatrix3x3 &in,vtkMatrix3x3 &out)
00172 {this->Adjoint(&in,&out);}
00173 double Determinant(vtkMatrix3x3 &in)
00174 {return this->Determinant(&in);}
00175 double Determinant(vtkMatrix3x3 *in)
00176 {return vtkMatrix3x3::Determinant(*in->Element);}
00177 void Invert(vtkMatrix3x3 &in,vtkMatrix3x3 &out)
00178 {this->Invert(&in,&out);}
00179 void Transpose(vtkMatrix3x3 &in,vtkMatrix3x3 &out)
00180 {this->Transpose(&in,&out);}
00181 static void PointMultiply(const double Elements[9],
00182 const float in[3], float out[3]);
00183 static void PointMultiply(const double Elements[9],
00184 const double in[3], double out[3]);
00185
00186
00187
00188
00189 bool IsIdentity();
00190
00192 double * GetData() { return *this->Element; }
00193
00194
00195 protected:
00196 vtkMatrix3x3();
00197 ~vtkMatrix3x3();
00198
00199 double Element[3][3];
00200
00201 private:
00202 vtkMatrix3x3(const vtkMatrix3x3&);
00203 void operator=(const vtkMatrix3x3&);
00204
00205 };
00206
00207 inline void vtkMatrix3x3::SetElement(int i, int j, double value)
00208 {
00209 if (this->Element[i][j] != value)
00210 {
00211 this->Element[i][j] = value;
00212 this->Modified();
00213 }
00214 }
00215
00216 inline bool vtkMatrix3x3::IsIdentity()
00217 {
00218 double *M = *this->Element;
00219 if (M[0] == 1.0 && M[4] == 1.0 && M[8] == 1.0 &&
00220 M[1] == 0.0 && M[2] == 0.0 && M[3] == 0.0 && M[5] == 0.0 &&
00221 M[6] == 0.0 && M[7] == 0.0)
00222 {
00223 return true;
00224 }
00225 else
00226 {
00227 return false;
00228 }
00229 }
00230
00231 inline bool vtkMatrix3x3::operator==(const vtkMatrix3x3 &other)
00232 {
00233 for (int i = 0; i < 3; ++i)
00234 {
00235 for (int j = 0; j < 3; ++j)
00236 {
00237 if (Element[i][j] != other.Element[i][j])
00238 {
00239 return false;
00240 }
00241 }
00242 }
00243 return true;
00244 }
00245
00246 inline bool vtkMatrix3x3::operator!=(const vtkMatrix3x3 &other)
00247 {
00248 for (int i = 0; i < 3; ++i)
00249 {
00250 for (int j = 0; j < 3; ++j)
00251 {
00252 if (Element[i][j] != other.Element[i][j])
00253 {
00254 return true;
00255 }
00256 }
00257 }
00258 return false;
00259 }
00260
00261 #endif