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 >
Wrap
C/C++ Source or Header
|
1996-06-04
|
4KB
|
155 lines
#ifndef _MATRIX
#define _MATRIX
#include <math.h>
#include <iostream.h>
#define minimumdouble (double)(1.0/65536.0)
class Matrix;
class Vector {
public:
double x, y, z;
Vector(){}
Vector(const Vector& v) {x = v.x; y = v.y; z = v.z;}
Vector(double ix, double iy, double iz) {x=ix; y=iy; z=iz;}
Vector(int ix, int iy, int iz) {x=double(ix); y=double(iy); z=double(iz);}
// ~Vector(){}
const double length(void) const {return sqrt(x*x+y*y+z*z);}
const Vector unit(void) const {
double l=length();
if (l <= minimumdouble) {
return Vector(0,0,0);
}
return Vector(x/l, y/l, z/l);
}
const int operator ==(const Vector& v) const {return x==v.x && y==v.y && z==v.z;}
const int operator !=(const Vector& v) const {return ! (*this == v);}
Vector& operator +=(const Vector& v) {
x += v.x;y += v.y;z += v.z;
return *this;
}
Vector& operator -=(const Vector& v) {
x -= v.x;y -= v.y;z -= v.z;
return *this;
}
Vector& operator *=(double r) {
x *= r; y *= r; z *= r;
return *this;
}
#if 0
friend Vector operator *(double r, const Vector &v) {
Vector temp;
temp.x = v.x * r;
temp.y = v.y * r;
temp.z = v.z * r;
return temp;
}
#else
friend Vector operator *(double r, const Vector &v) {
return Vector(v.x * r, v.y * r, v.z * r);
}
#endif
const Vector operator *(const Vector& v2) const {
Vector temp;
temp.x = y * v2.z - v2.y * z;
temp.y = z * v2.x - v2.z * x;
temp.z = x * v2.y - v2.x * y;
return temp;
}
const double operator &(const Vector& v2) const {
return x * v2.x + y * v2.y + z * v2.z;
}
double& operator [](int n) {
if (n == 0) {
return x;
} else if (n == 1) {
return y;
} else {
return z;
}
}
const Vector operator +(const Vector& v2) const {
Vector temp(*this);
temp += v2;
return temp;
}
const Vector operator -(const Vector& v2) const {
Vector temp(*this);
temp -= v2;
return temp;
}
const Vector operator *(double r) const { return Vector(r*x, r*y, r*z); }
const Vector operator -() const {return Vector(-x, -y, -z);}
const Matrix operator ^(const Vector& v2) const;
};
class Matrix {
public:
Vector v[4];
Matrix(void) {}
Matrix(int n);
Matrix(const Matrix& m);
Matrix(const Vector& v0, const Vector& v1, const Vector& v2, const Vector& v3 = Vector(0,0,0));
Matrix(const Vector& vx, const Vector& vz = Vector(0,0,1));
// ~Matrix(){}
Matrix& operator +=(const Matrix& m);
Matrix& operator -=(const Matrix& m);
const int operator ==(const Matrix& m2) const;
const int operator !=(const Matrix& m2) const;
const Matrix operator +(const Matrix& m2) const;
const Matrix operator -(const Matrix& m2) const;
const Vector operator *(const Vector& v1) const;
const Matrix operator *(const Matrix& m2) const;
private:
const Vector mul_notmove(const Vector &v1) const;
public:
const double value(void) const;
static const Matrix m_move(const Vector &v1);
static const Matrix m_scale(const Vector& v1);
static const Matrix m_scale(double s) {return m_scale(Vector(s, s, s));
}
static const Matrix m_rotx(double t);
static const Matrix m_roty(double t);
static const Matrix m_rotz(double t);
static const Matrix m_rot(Vector& v) {return m_rotz(v.z) * m_roty(v.y) * m_rotx(v.x);}
const Matrix inv(void) const;
const Matrix tra(void) const;
const Matrix move(double sx, double sy, double sz) const {
return *this * m_move(Vector(sx, sy, sz));
}
const Matrix move(const Vector& v1) const {return *this * m_move(v1);}
const Matrix scale(double sx, double sy, double sz) const {
return *this * m_scale(Vector(sx, sy, sz));
}
const Matrix scale(double s) const {
return *this * m_scale(Vector(s, s, s));
}
const Matrix scale(const Vector& v1) const {return *this * m_scale(v1);}
const Matrix rotx(double t) const {return *this * m_rotx(t);}
const Matrix roty(double t) const {return *this * m_roty(t);}
const Matrix rotz(double t) const {return *this * m_rotz(t);}
const Matrix rot(Vector& v) const {return *this * m_rot(v);}
const Vector GetRotation(void) const;
};
static inline double deg(double t) {
return t * M_PI / 180.0;
}
static inline double rad(double t) {
return t / M_PI * 180.0;
}
#endif