cryph utilities [subset]  2.0
Subset of the full cryph package of mathematical utilities for points, vectors, and matrices
Matrix3x3.h
Go to the documentation of this file.
1 
8 #ifndef MATRIX3x3_H
9 #define MATRIX3x3_H
10 
11 #include "AffPoint.h"
12 #include "AffVector.h"
13 
14 namespace cryph
15 {
16 
25 class Matrix3x3
26 {
27 public:
29  Matrix3x3();
33  Matrix3x3(const Matrix3x3& M);
37  Matrix3x3(
38  double m11, double m12, double m13,
39  double m21, double m22, double m23,
40  double m31, double m32, double m33);
42  virtual ~Matrix3x3();
43 
49  static Matrix3x3 xRotationDegrees(double angle);
50 
56  static Matrix3x3 xRotationRadians(double angle);
57 
63  static Matrix3x3 yRotationDegrees(double angle);
64 
70  static Matrix3x3 yRotationRadians(double angle);
71 
77  static Matrix3x3 zRotationDegrees(double angle);
78 
84  static Matrix3x3 zRotationRadians(double angle);
85 
93  (const AffVector& rotationAxis, double angle);
94 
102  static Matrix3x3 alignVectors
103  (const AffVector& uFrom, const AffVector& uTo);
104 
117  static Matrix3x3 alignVectors
118  (const AffVector& uFrom, const AffVector& vFrom,
119  const AffVector& uTo, const AffVector& vTo);
120 
129  static Matrix3x3 scale
130  (double sx, double sy, double sz);
131 
148  static Matrix3x3 shear
149  (const AffVector& n, const AffVector& u, double f);
150 
158  static Matrix3x3 crossProductMatrix(const AffVector& u);
159 
166  static Matrix3x3 mirrorMatrix(const AffVector& mirrorPlaneNormal);
167 
175  (const AffVector& u, const AffVector& v);
176 
181  Matrix3x3 operator=(const Matrix3x3& rhs);
182 
187  Matrix3x3 operator*=(const Matrix3x3& rhs);
188 
194  Matrix3x3 operator*=(double f);
195 
200  Matrix3x3 operator+=(const Matrix3x3& rhs);
201 
206  AffPoint operator*(const AffPoint& p) const;
207 
212  AffVector operator*(const AffVector& v) const;
213 
218  Matrix3x3 operator*(const Matrix3x3& m2) const;
219 
224  Matrix3x3 operator+(const Matrix3x3& m2) const;
225 
230  Matrix3x3 operator-(const Matrix3x3& m2) const;
231 
238  friend Matrix3x3 operator*(double f, const Matrix3x3& m);
239 
247  friend std::ostream& operator<<(std::ostream& os, const Matrix3x3& m);
248 
255  friend std::istream& operator>>(std::istream& is, Matrix3x3& m);
256 
260  double determinant() const;
261 
267  double elementAt(int i, int j) const;
268 
276  float* extractColMajor(float m[9]) const;
277 
285  double* extractColMajor(double m[9]) const;
286 
294  float* extractRowMajor(float m[9]) const;
295 
303  double* extractRowMajor(double m[9]) const;
304 
319  int extractAxisAngle(AffVector& w, double& theta) const;
320 
326  void extractRows(AffVector& row1, AffVector& row2, AffVector& row3) const;
327 
332  bool inverse(Matrix3x3& mInv) const;
333 
339  bool isOrthogonal() const;
340 
346  bool isRightHanded() const;
347 
353  double largestDiagonalElement(int& pos) const;
354 
360  void multiply(const double a[], double b[]) const;
361 
367  void setElementAt(int i, int j, double newValue);
368 
373  double trace() const;
374 
378  void transpose();
379 
380  // ---------- Global constants
381 
382  // 1. Special Matrices
383  static const Matrix3x3 IdentityMatrix;
384  static const Matrix3x3 ZeroMatrix;
386  // 2. Return codes for extraction of unit axis vector & rotation angle
387  // from 3x3 matrices that are 'supposed to be' orthogonal and
388  // right-handed.
389 
390  // 2.1: Abnormal internal errors that should never be returned:
391  static const int ImMDeterminantNotZero;
392  static const int CannotDetermineUnitAxisVector;
393  static const int CosTermsNotEqual;
394  static const int SinTermsNotEqual;
395 
396  // 2.2: "Normal" errors if user provides inappropriate matrix:
397  static const int NotOrthogonal;
398  static const int NotRightHanded;
399 
400  // 3.3: Successful extraction of unit axis vector and angle:
401  static const int Extracted_wTheta;
402 
403  friend class Matrix4x4;
404 
405 protected:
406  double mElem[3][3];
407 
408 private:
409  void copy(const Matrix3x3& rhs);
410  int computeImMRows(Matrix3x3& ImM,
411  // the rows of I-M and the indices of the
412  // two most linearly independent rows.
413  AffVector rows[], int& r1, int& r2) const;
414  int extractPrimitiveAxisAngle(int pos, AffVector& w, double& theta) const;
415 };
416 
417 }
418 
419 #endif
static Matrix3x3 zRotationRadians(double angle)
Definition: Matrix3x3.c++:730
friend std::istream & operator>>(std::istream &is, Matrix3x3 &m)
static Matrix3x3 generalRotationRadians(const AffVector &rotationAxis, double angle)
Definition: Matrix3x3.c++:401
static Matrix3x3 yRotationRadians(double angle)
Definition: Matrix3x3.c++:705
Matrix3x3 operator+(const Matrix3x3 &m2) const
Definition: Matrix3x3.c++:563
bool isRightHanded() const
Definition: Matrix3x3.c++:444
static Matrix3x3 xRotationRadians(double angle)
Definition: Matrix3x3.c++:680
Definition: AffPoint.c++:12
static Matrix3x3 zRotationDegrees(double angle)
Definition: Matrix3x3.c++:717
static Matrix3x3 yRotationDegrees(double angle)
Definition: Matrix3x3.c++:692
static Matrix3x3 tensorProductMatrix(const AffVector &u, const AffVector &v)
Definition: Matrix3x3.c++:641
static const Matrix3x3 ZeroMatrix
Definition: Matrix3x3.h:384
void multiply(const double a[], double b[]) const
Definition: Matrix3x3.c++:478
virtual ~Matrix3x3()
Definition: Matrix3x3.c++:75
Matrix3x3()
Definition: Matrix3x3.c++:55
double trace() const
Definition: Matrix3x3.c++:655
Matrix3x3 operator+=(const Matrix3x3 &rhs)
Definition: Matrix3x3.c++:509
static Matrix3x3 scale(double sx, double sy, double sz)
Definition: Matrix3x3.c++:618
Definition: Matrix4x4.h:23
AffPoint operator*(const AffPoint &p) const
Definition: Matrix3x3.c++:517
int extractAxisAngle(AffVector &w, double &theta) const
Definition: Matrix3x3.c++:272
void transpose()
Definition: Matrix3x3.c++:660
void setElementAt(int i, int j, double newValue)
Definition: Matrix3x3.c++:629
friend std::ostream & operator<<(std::ostream &os, const Matrix3x3 &m)
static Matrix3x3 shear(const AffVector &n, const AffVector &u, double f)
Definition: Matrix3x3.c++:635
Definition: AffVector.h:24
double elementAt(int i, int j) const
Definition: Matrix3x3.c++:228
Matrix3x3 operator*=(const Matrix3x3 &rhs)
Definition: Matrix3x3.c++:495
float * extractColMajor(float m[9]) const
Definition: Matrix3x3.c++:236
static Matrix3x3 alignVectors(const AffVector &uFrom, const AffVector &uTo)
Definition: Matrix3x3.c++:79
bool isOrthogonal() const
Definition: Matrix3x3.c++:428
Definition: Matrix3x3.h:25
Matrix3x3 operator-(const Matrix3x3 &m2) const
Definition: Matrix3x3.c++:573
bool inverse(Matrix3x3 &mInv) const
Definition: Matrix3x3.c++:416
double largestDiagonalElement(int &pos) const
Definition: Matrix3x3.c++:453
double determinant() const
Definition: Matrix3x3.c++:218
Matrix3x3 operator=(const Matrix3x3 &rhs)
Definition: Matrix3x3.c++:489
static Matrix3x3 mirrorMatrix(const AffVector &mirrorPlaneNormal)
Definition: Matrix3x3.c++:466
static Matrix3x3 xRotationDegrees(double angle)
Definition: Matrix3x3.c++:667
static Matrix3x3 crossProductMatrix(const AffVector &u)
Definition: Matrix3x3.c++:207
static const Matrix3x3 IdentityMatrix
Definition: Matrix3x3.h:383
void extractRows(AffVector &row1, AffVector &row2, AffVector &row3) const
Definition: Matrix3x3.c++:394
float * extractRowMajor(float m[9]) const
Definition: Matrix3x3.c++:254
Definition: AffPoint.h:25