00001 #ifndef GSGL_math_VECTOR4_H
00002 #define GSGL_math_VECTOR4_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include "math/math.hpp"
00038 #include "math/matrix.hpp"
00039
00040 namespace gsgl
00041 {
00042
00043 class string;
00044
00045 namespace math
00046 {
00047
00048
00049
00050
00051
00052
00053 class MATH_API vector
00054 : public matrix<4,1,gsgl::real_t>
00055 {
00056 public:
00057 vector(gsgl::real_t x = 0, gsgl::real_t y = 0, gsgl::real_t z = 0);
00058 vector(const vector &);
00059 vector(const matrix<4,1,gsgl::real_t> &);
00060
00061 explicit vector(const gsgl::real_t *);
00062 explicit vector(const gsgl::string &);
00063
00064 vector & operator= (const vector &);
00065 vector & operator= (const matrix<4,1,gsgl::real_t> &);
00066 virtual ~vector();
00067
00068 inline const gsgl::real_t & get_x() const { return data[0]; }
00069 inline const gsgl::real_t & get_y() const { return data[1]; }
00070 inline const gsgl::real_t & get_z() const { return data[2]; }
00071 inline const gsgl::real_t & get_w() const { return data[3]; }
00072
00073 inline gsgl::real_t & get_x() { return data[0]; }
00074 inline gsgl::real_t & get_y() { return data[1]; }
00075 inline gsgl::real_t & get_z() { return data[2]; }
00076 inline gsgl::real_t & get_w() { return data[3]; }
00077
00078
00079 void normalize();
00080
00081
00082 void normalize_h();
00083
00084 gsgl::real_t mag() const;
00085 gsgl::real_t mag2() const;
00086
00087 vector & operator+ () { return *this; }
00088 vector operator- () const;
00089 vector operator+ (const vector &) const;
00090 vector operator- (const vector &) const;
00091
00092 vector & operator+= (const vector &);
00093 vector & operator-= (const vector &);
00094
00095 vector & operator*= (const gsgl::real_t);
00096 vector operator* (const gsgl::real_t);
00097
00098 gsgl::real_t dot(const vector &) const;
00099 vector cross(const vector &) const;
00100
00101 static vector interpolate(const vector & start, const vector & end, const gsgl::real_t & percent);
00102
00103 static vector parse(const gsgl::string &);
00104
00105 static const vector ZERO;
00106 static const vector X_AXIS;
00107 static const vector Y_AXIS;
00108 static const vector Z_AXIS;
00109 static const vector NEG_X_AXIS;
00110 static const vector NEG_Y_AXIS;
00111 static const vector NEG_Z_AXIS;
00112 };
00113
00114
00115
00116 inline vector operator* (gsgl::real_t n, const vector & v)
00117 {
00118 return vector(n*v.get_x(), n*v.get_y(), n*v.get_z());
00119 }
00120
00121
00122
00123 inline vector operator* (const vector & v, gsgl::real_t n)
00124 {
00125 return vector(n*v.get_x(), n*v.get_y(), n*v.get_z());
00126 }
00127
00128
00129
00130 inline vector operator/ (const vector & v, gsgl::real_t n)
00131 {
00132 return v * (static_cast<gsgl::real_t>(1) / n);
00133 }
00134
00135 }
00136
00137 }
00138
00139 #endif