home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / PASM.LZH / MATRIX.H < prev    next >
C/C++ Source or Header  |  1996-06-04  |  4KB  |  155 lines

  1. #ifndef _MATRIX
  2. #define _MATRIX
  3. #include <math.h>
  4. #include <iostream.h>
  5.  
  6. #define minimumdouble (double)(1.0/65536.0)
  7.  
  8. class Matrix;
  9.  
  10. class Vector {
  11. public:
  12.     double x, y, z;
  13.     Vector(){}
  14.     Vector(const Vector& v) {x = v.x; y = v.y; z = v.z;}
  15.     Vector(double ix, double iy, double iz) {x=ix; y=iy; z=iz;}
  16.     Vector(int ix, int iy, int iz) {x=double(ix); y=double(iy); z=double(iz);}
  17. //    ~Vector(){}
  18.     const double length(void) const {return sqrt(x*x+y*y+z*z);}
  19.     const Vector unit(void) const {
  20.         double l=length();
  21.         if (l <= minimumdouble) {
  22.             return Vector(0,0,0);
  23.         }
  24.         return Vector(x/l, y/l, z/l);
  25.     }
  26.  
  27.     const int operator ==(const Vector& v) const {return x==v.x && y==v.y && z==v.z;}
  28.     const int operator !=(const Vector& v) const {return ! (*this == v);}
  29.  
  30.     Vector& operator +=(const Vector& v) {
  31.         x += v.x;y += v.y;z += v.z;
  32.         return *this;
  33.     }
  34.     Vector& operator -=(const Vector& v) {
  35.         x -= v.x;y -= v.y;z -= v.z;
  36.         return *this;
  37.     }
  38.     Vector&    operator *=(double r) {
  39.         x *= r; y *= r; z *= r;
  40.         return *this;
  41.     }
  42. #if 0
  43.     friend Vector operator *(double r, const Vector &v) {
  44.         Vector temp;
  45.         temp.x = v.x * r;
  46.         temp.y = v.y * r;
  47.         temp.z = v.z * r;
  48.         return temp;
  49.     }
  50. #else
  51.     friend Vector operator *(double r, const Vector &v) {
  52.         return Vector(v.x * r, v.y * r, v.z * r);
  53.     }
  54. #endif
  55.     const Vector operator *(const Vector& v2) const {
  56.         Vector temp;
  57.         temp.x = y * v2.z - v2.y * z;
  58.         temp.y = z * v2.x - v2.z * x;
  59.         temp.z = x * v2.y - v2.x * y;
  60.         return temp;
  61.     }
  62.     const double    operator &(const Vector& v2) const {
  63.         return x * v2.x + y * v2.y + z * v2.z;
  64.     }
  65.     double& operator [](int n) {
  66.         if (n == 0) {
  67.             return x;
  68.         } else if (n == 1) {
  69.             return y;
  70.         } else {
  71.             return z;
  72.         }
  73.     }
  74.     const Vector  operator +(const Vector& v2) const {
  75.         Vector temp(*this);
  76.         temp += v2;
  77.         return temp;
  78.     }
  79.     const Vector  operator -(const Vector& v2) const {
  80.         Vector temp(*this);
  81.         temp -= v2;
  82.         return temp;
  83.     }
  84.     const Vector  operator *(double r) const { return Vector(r*x, r*y, r*z); }
  85.     const Vector  operator -() const {return Vector(-x, -y, -z);}
  86.     const Matrix  operator ^(const Vector& v2) const;
  87. };
  88.  
  89. class Matrix {
  90. public:
  91.     Vector v[4];
  92.  
  93.     Matrix(void) {}
  94.     Matrix(int n);
  95.     Matrix(const Matrix& m);
  96.  
  97.     Matrix(const Vector& v0, const Vector& v1, const Vector& v2, const Vector& v3 = Vector(0,0,0));
  98.     Matrix(const Vector& vx, const Vector& vz = Vector(0,0,1));
  99.  
  100. //    ~Matrix(){}
  101.  
  102.     Matrix& operator +=(const Matrix& m);
  103.     Matrix& operator -=(const Matrix& m);
  104.  
  105.     const int operator ==(const Matrix& m2) const;
  106.     const int operator !=(const Matrix& m2) const;
  107.  
  108.     const Matrix operator +(const Matrix& m2) const;
  109.     const Matrix operator -(const Matrix& m2) const;
  110.     const Vector operator *(const Vector& v1) const;
  111.     const Matrix operator *(const Matrix& m2) const;
  112. private:
  113.     const Vector mul_notmove(const Vector &v1) const;
  114. public:
  115.     const double value(void) const;
  116.     static const Matrix m_move(const Vector &v1);
  117.     static const Matrix m_scale(const Vector& v1);
  118.     static const Matrix m_scale(double s) {return m_scale(Vector(s, s, s));
  119.     }
  120.     static const Matrix m_rotx(double t);
  121.     static const Matrix m_roty(double t);
  122.     static const Matrix m_rotz(double t);
  123.     static const Matrix m_rot(Vector& v) {return m_rotz(v.z) * m_roty(v.y) * m_rotx(v.x);}
  124.  
  125.     const Matrix inv(void) const;
  126.     const Matrix tra(void) const;
  127.  
  128.     const Matrix move(double sx, double sy, double sz) const {
  129.         return *this * m_move(Vector(sx, sy, sz));
  130.     }
  131.     const Matrix move(const Vector& v1) const {return *this * m_move(v1);}
  132.     const Matrix scale(double sx, double sy, double sz) const {
  133.         return *this * m_scale(Vector(sx, sy, sz));
  134.     }
  135.     const Matrix scale(double s) const {
  136.         return *this * m_scale(Vector(s, s, s));
  137.     }
  138.     const Matrix scale(const Vector& v1) const {return *this * m_scale(v1);}
  139.     const Matrix rotx(double t) const {return *this * m_rotx(t);}
  140.     const Matrix roty(double t) const {return *this * m_roty(t);}
  141.     const Matrix rotz(double t) const {return *this * m_rotz(t);}
  142.     const Matrix rot(Vector& v) const {return *this * m_rot(v);}
  143.  
  144.     const Vector GetRotation(void) const;
  145. };
  146.  
  147. static inline double deg(double t) {
  148.     return t * M_PI / 180.0;
  149. }
  150. static inline double rad(double t) {
  151.     return t / M_PI * 180.0;
  152. }
  153.  
  154. #endif
  155.