typedef float real; class Matrix; class Vector { public: enum {length=4}; Vector(); Vector(real x,real y,real z); Vector(const Vector& rhs); real x() const { return data[0];} real y() const { return data[1];} real z() const { return data[2];} real& x() { return data[0];} real& y() { return data[1];} real& z() { return data[2];} Vector mul(const Vector &rhs); Vector mul(const Matrix& rhs); Vector mul(const real scale); real dot(const Vector &rhs); Vector cross(const Vector& rhs); real mag(); Vector unit(); real get(int i) const { return data[i];} private: real data[length]; }; class Matrix { public: enum {length=4}; Matrix mul(const Matrix& rhs); Matrix(); Matrix(const Matrix& rhs); real get(int i,int j) const { return data[i][j];} void set(int i,int j,real val) { data[i][j]=val;} private: real data[length][length]; }; #include #include Matrix::Matrix() { for(int i=0;iget(i, r) * rhs.get(r, j); } ret.set(i, j, cell); } } return ret; } Vector Vector::mul(const Matrix& mat) { int m = 1; int n = length; int p = n; Vector ret; for (int j = 0; j < p; ++j) { int cell = 0; for (int r = 0; r < n; ++r) { cell += this->get(r) * mat.get(r, j); } ret.data[j]= cell; } return ret; } Vector::Vector() { for(int i=0;idata[i] * scale; } return v; } Vector Vector::cross(const Vector& rhs) { return Vector(y()*rhs.z() - rhs.y()*z() , z()*rhs.x()-rhs.z()*x(), x()*rhs.y()-rhs.x()*y()); } Vector::Vector(const Vector &rhs) { for(int i=0;imag(); real s=1/l; return this->mul(s); } real Vector::dot(const Vector& rhs) { float d=0; for(int i=0;i void printMat(const Matrix& m) { int l=m.length; for(int i=0;i