/* * matrix calculations for non-homogenous space.. */ #ifndef MATRIX_H #define MATRIX_H #include #include "util.h" using namespace std; class vec { double data[3]; public: vec() t_no {}; vec(double a, double b, double c) t_no { data[0] = a; data[1] = b; data[2] = c; }; double &operator [](int idx) t_no { return data[idx]; }; const double &operator [](int idx) const t_no { return data[idx]; }; }; inline bool operator ==(const vec &a, const vec &b) t_no { return a[0] == b[0] && a[1] == b[1] && a[2] == b[2]; } inline vec operator +(const vec &a, const vec &b) t_no { return vec(a[0] + b[0], a[1] + b[1], a[2] + b[2]); } inline vec operator -(const vec &a, const vec &b) t_no { return vec(a[0] - b[0], a[1] - b[1], a[2] - b[2]); } inline double operator *(const vec &a, const vec &b) t_no { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; } inline vec operator *(double s, const vec &a) t_no { return vec(s * a[0], s * a[1], s * a[2]); } double abs(const vec &a) t_no; vec normalize(const vec &a) t_no; vec cross(const vec &a, const vec &b) t_no; class mat { vec data[3]; public: mat() t_no {}; mat(vec a, vec b, vec c) t_no { data[0] = a; data[1] = b; data[2] = c; }; vec &row(int y) t_no { return data[y]; }; const vec &row(int y) const t_no { return data[y]; }; vec &operator [](int y) t_no { return row(y); }; const vec &operator [](int y) const t_no { return row(y); }; vec col(int x) t_no { return vec(data[0][x], data[1][x], data[2][x]); }; const vec col(int x) const t_no { return vec(data[0][x], data[1][x], data[2][x]); }; vec operator ()(int x) t_no { return col(x); }; const vec operator ()(int x) const t_no { return col(x); }; }; mat operator +(const mat &a, const mat &b) t_no; mat operator -(const mat &a, const mat &b) t_no; vec operator *(const mat &a, const vec &b) t_no; vec operator *(const vec &a, const mat &b) t_no; mat operator *(const mat &a, const mat &b) t_no; ostream &operator <<(ostream &o, const vec &v) t_no; ostream &operator <<(ostream &o, const mat &m) t_no; #endif