Vector.h

Go to the documentation of this file.
00001 // vim:set noet ts=8 sw=8:
00002 #ifndef VECTOR_H_
00003 #define VECTOR_H_
00004 
00005 #include <string.h>
00006 #define _USE_MATH_DEFINES
00007 #include <math.h>
00008 #include "FloatUtils.h"
00009 
00014 template<class T = float>
00015 class Vector {
00016         public:
00017                 Vector (T x = 0, T y = 0, T z = 0) {
00018                         mCoords[0] = x;
00019                         mCoords[1] = y;
00020                         mCoords[2] = z;
00021                 }
00022 
00023                 // standard copy-ctor, assignment op. and dtor suffice
00024 
00025                 T x() const { return mCoords[0]; }
00026                 T y() const { return mCoords[1]; }
00027                 T z() const { return mCoords[2]; }
00028 
00029                 void setX(T x) { mCoords[0] = x; }
00030                 void setY(T y) { mCoords[1] = y; }
00031                 void setZ(T z) { mCoords[2] = z; }
00032 
00033                 T* vector() { return mCoords; }
00034                 const T* vector() const { return mCoords; }
00035 
00036                 operator T*() { return vector(); }
00037 
00038                 Vector<T> operator +=(const Vector<T>& v) {
00039                         mCoords[0] += v.x();
00040                         mCoords[1] += v.y();
00041                         mCoords[2] += v.z();
00042                         return *this;
00043                 }
00044                 Vector<T> operator+(const Vector<T>& v) const {
00045                         Vector<T> r(*this);
00046                         return r += v;
00047                 }
00048 
00049                 Vector<T> operator -=(const Vector<T>& v) {
00050                         mCoords[0] -= v.x();
00051                         mCoords[1] -= v.y();
00052                         mCoords[2] -= v.z();
00053                         return *this;
00054                 }
00055                 Vector<T> operator-(const Vector<T>& v) const {
00056                         Vector<T> r(*this);
00057                         return r -= v;
00058                 }
00059 
00060                 Vector<T> operator-() const {
00061                         return Vector<T>(-x(), -y(), -z());
00062                 }
00063 
00064                 // cross product
00065                 Vector<T> operator*=(const Vector<T>& b) {
00066                         T xval = y() * b.z() - b.y() * z();
00067                         T yval = b.x() * z() - x() * b.z();
00068                         T zval = x() * b.y() - b.x() * y();
00069                         setX(xval);
00070                         setY(yval);
00071                         setZ(zval);
00072                         return *this;
00073                 }
00074                 // cross product
00075                 Vector<T> operator*(const Vector<T>& b) const {
00076                         Vector<T> r(*this);
00077                         return r *= b;
00078                 }
00079 
00080                 //Tdot product (scalar product)
00081                 T dotProduct(const Vector<T>& b) const {
00082                         return x() * b.x() + y() * b.y() + z() * b.z();
00083                 }
00084 
00085                 Vector<T>& operator*=(T scalar) {
00086                         mCoords[0] *= scalar;
00087                         mCoords[1] *= scalar;
00088                         mCoords[2] *= scalar;
00089                         return *this;
00090                 }
00091                 
00092                 Vector<T>& operator+=(T scalar) {
00093                         mCoords[0] += scalar;
00094                         mCoords[1] += scalar;
00095                         mCoords[2] += scalar;
00096                         return *this;
00097                 }
00098                 
00099                 Vector<T> operator*(T scalar) const {
00100                         return Vector<T>(x() * scalar, y() * scalar, z() * scalar);
00101                 }
00102                 Vector<T>& operator/=(float scalar) {
00103                         mCoords[0] /= scalar;
00104                         mCoords[1] /= scalar;
00105                         mCoords[2] /= scalar;
00106                         return *this;
00107                 }
00108                 Vector<T> operator/(float scalar) const {
00109                         return Vector<T>(x() / scalar, y() / scalar, z() / scalar);
00110                 }
00111 
00112                 bool operator==(const Vector<T>& v2) const {
00113                         
00114                         return ((x()==v2.x())&&(y()==v2.y())&&(z()==v2.z()));
00115                 //      if (!floatEq(x(),v2.x())) return false;
00116                 //      if (!floatEq(y(),v2.y())) return false;
00117                 //      if (!floatEq(z(),v2.z())) return false;
00118                 //      return true;
00119                 }
00120                 
00121                 float len() const {
00122                         return sqrt(x()*x() + y()*y() + z()*z());
00123                 }
00124 
00125                 Vector<T> normalized() const {
00126                         return Vector<T>(*this).normalize();
00127                 }
00128 
00129                 Vector<T>& normalize() {
00130                         float l = len();
00131                         if (l > 1e-6)
00132                                 return operator/=(len());
00133                         return *this;
00134                 }
00135 
00143                 float angle(const Vector<T>& with) const {
00144                         float dotprod = dotProduct(with);
00145                         float frac = dotprod / (len() * with.len());
00146                         return acos(frac);
00147                 }
00148 
00154                 double polarAngle() const {
00155                         return atan2(y(), x());
00156                 }
00157 
00158                 bool operator>=(const Vector<T>& b) const {
00159                         return x() >= b.x() &&
00160                                    y() >= b.y() &&
00161                                    z() >= b.z();
00162                 }
00163 
00164                 bool operator<=(const Vector<T>& b) const {
00165                         return x() <= b.x() &&
00166                                    y() <= b.y() &&
00167                                    z() <= b.z();
00168                 }
00169 
00170                 bool operator<(const Vector<T>& b) const {
00171                         return x() < b.x() &&
00172                                    y() < b.y() &&
00173                                    z() < b.z();
00174                 }
00175 
00176                 bool operator>(const Vector<T>& b) const {
00177                         return x() > b.x() &&
00178                                    y() > b.y() &&
00179                                    z() > b.z();
00180                 }
00181 
00182         private:
00183                 T mCoords[3];
00184 };
00185 
00186 /*
00187 inline bool vector_eq(const Vector<T>& a, const Vector<T>& b, float eps = 0.0005) {
00188         return floatEq(a.x(), b.x(), eps) &&
00189                         floatEq(a.y(), b.y(), eps) &&
00190                         floatEq(a.z(), b.z(), eps);
00191 }*/
00192         
00193 #endif

Generated on Mon Jan 23 19:44:28 2006 for Visualization by  doxygen 1.4.6