00001
00002
00003 #ifndef vectorH
00004 #define vectorH
00005
00006 #include <fastmath.h>
00007
00011 template <class t>
00012 class vector
00013 {
00014 private:
00015 t _x, _y, _z;
00016
00017
00021 t _length() {
00022 return _fm_sqrt(_x*_x + _y*_y + _z*_z);
00023 }
00024
00025
00026 public:
00027 vector()
00028 : _x(0.0),
00029 _y(0.0),
00030 _z(0.0)
00031 {}
00032
00033 vector(t x, t y, t z)
00034 : _x(x),
00035 _y(y),
00036 _z(z)
00037 {}
00038
00039 vector(const vector &v)
00040 : _x(v._x),
00041 _y(v._y),
00042 _z(v._z)
00043 {}
00044
00045 const vector &operator=(const vector &v)
00046 {
00047 if (&v != this) {
00048 _x = v._x;
00049 _y = v._y;
00050 _z = v._z;
00051 }
00052 return *this;
00053 }
00054
00059 const vector operator*(const t s) const
00060 {
00061 return vector<t>(_x*s, _y*s, _z*s);
00062 }
00063
00067 const vector operator*(const vector &v) const
00068 {
00069 return vector<t>(_y*v._z-v._y*_z,
00070 _z*v._x-v._z*_x,
00071 _x*v._y-v._x*_y);
00072 }
00073
00077 const t operator^(const vector &v) const
00078 {
00079 return (_x*v._x + _y*v._y + _z*v._z);
00080 }
00081
00085 const vector operator+(const vector &v) const
00086 {
00087 return vector<t>(_x+v._x, _y+v._y, _z+v._z);
00088 }
00089
00090 const vector operator+() const
00091 {
00092 return *this;
00093 }
00094
00095 const vector &operator+=(const vector v)
00096 {
00097 _x += v._x;
00098 _y += v._y;
00099 _z += v._z;
00100 return *this;
00101 }
00102
00103 const vector operator-(const vector &v) const
00104 {
00105 return vector<t>(_x-v._x, _y-v._y, _z-v._z);
00106 }
00107
00108 const vector operator-() const
00109 {
00110 vector tmp(-_x, -_y, -_z);
00111 return tmp;
00112 }
00113
00114 const vector &operator-=(const vector v)
00115 {
00116 _x -= v._x;
00117 _y -= v._y;
00118 _z -= v._z;
00119 return *this;
00120 }
00121
00122
00126 void rotx(t val)
00127 {
00128 t _yold = _y, _zold = _z;
00129 _y = _yold*_fm_cos(val) - _zold*_fm_sin(val);
00130 _z = _yold*_fm_sin(val) + _zold*_fm_cos(val);
00131 }
00132
00133 void roty(t val)
00134 {
00135 t _xold = _x, _zold = _z;
00136 _x = _xold*_fm_cos(val) + _zold*_fm_sin(val);
00137 _z = - _xold*_fm_sin(val) + _zold*_fm_cos(val);
00138 }
00139
00140 void rotz(t val)
00141 {
00142 t _xold = _x, _yold = _y;
00143 _x = _xold*_fm_cos(val) - _yold*_fm_sin(val);
00144 _y = _xold*_fm_sin(val) + _yold*_fm_cos(val);
00145 }
00146
00147 void normal(void)
00148 {
00149 t l = _length();
00150 _x = _x / l;
00151 _y = _y / l;
00152 _z = _z / l;
00153 }
00154
00155
00156 __property t X = { read=_x, write=_x };
00157 __property t Y = { read=_y, write=_y };
00158 __property t Z = { read=_z, write=_z };
00159 __property t L = { read=_length };
00160 };
00161
00162 typedef vector<float> vectorf;
00163 typedef vector<double> vectord;
00164
00165 #endif