inlib  1.2.0
/Users/barrand/private/dev/softinex/old/inexlib-1.2/inlib/inlib/vec3d
Go to the documentation of this file.
00001 // Copyright (C) 2010, Guy Barrand. All rights reserved.
00002 // See the file inlib.license for terms.
00003 
00004 #ifndef inlib_vec3d
00005 #define inlib_vec3d
00006 
00007 #include "a3"
00008 
00009 #include <cmath> //::sqrt
00010 
00011 namespace inlib {
00012 
00013 class vec3d : public inlib::a3::vec<double> {
00014 public:
00015   vec3d(): inlib::a3::vec<double>() {}
00016   vec3d(const double a_vec[3]): inlib::a3::vec<double>(a_vec) {}
00017   vec3d(double a0,double a1,double a2)
00018   : inlib::a3::vec<double>(a0,a1,a2){}
00019   virtual ~vec3d() {}
00020 public:
00021   vec3d(const vec3d& a_from): inlib::a3::vec<double>(a_from){}
00022   vec3d& operator=(const vec3d& a_from){
00023     inlib::a3::vec<double>::operator=(a_from);
00024     return *this;
00025   }
00026 
00027   vec3d(const inlib::a3::vec<double>& a_from)
00028   : inlib::a3::vec<double>(a_from){}
00029 
00030 public: //operators
00031   double& operator[](unsigned int a_index) {
00032     //WARNING : no check on a_index.
00033     return m_vector[a_index];
00034   }
00035   const double& operator[](unsigned int a_index) const {
00036     //WARNING : no check on a_index.
00037     return m_vector[a_index];
00038   }
00039   vec3d operator*(double a_v) const {
00040     return vec3d(m_vector[0]*a_v,
00041                  m_vector[1]*a_v,
00042                  m_vector[2]*a_v);
00043   }    
00044   vec3d operator+(const vec3d& a_v) const {
00045     return vec3d(m_vector[0]+a_v[0],
00046                  m_vector[1]+a_v[1],
00047                  m_vector[2]+a_v[2]);
00048   }    
00049   vec3d operator-(const vec3d& a_v) const {
00050     return vec3d(m_vector[0]-a_v[0],
00051                  m_vector[1]-a_v[1],
00052                  m_vector[2]-a_v[2]);
00053   }    
00054   vec3d& operator+=(const vec3d& a_v) {   
00055     m_vector[0] += a_v[0];
00056     m_vector[1] += a_v[1];
00057     m_vector[2] += a_v[2];
00058     return *this;
00059   }    
00060   vec3d& operator*=(double a_v) {   
00061     m_vector[0] *= a_v;
00062     m_vector[1] *= a_v;
00063     m_vector[2] *= a_v;
00064     return *this;
00065   }    
00066   vec3d operator-() const {
00067     return vec3d(-m_vector[0],-m_vector[1],-m_vector[2]);
00068   }
00069   bool operator==(const vec3d& a_v) const {return equal(a_v);}
00070   bool operator!=(const vec3d& a_v) const {return !operator==(a_v);}
00071 public:
00072   double x() const {return m_vector[0];}
00073   double y() const {return m_vector[1];}
00074   double z() const {return m_vector[2];}
00075   double length() const {
00076     return ::sqrt(m_vector[0] * m_vector[0] + 
00077                   m_vector[1] * m_vector[1] + 
00078                   m_vector[2] * m_vector[2]); 
00079   }
00080   double normalize() {
00081     double norme = length();
00082     if(norme==0) return 0;
00083     divide(norme);
00084     return norme;
00085   }
00086   vec3d cross(const vec3d& aV) const {
00087     return vec3d(m_vector[1] * aV.m_vector[2] - m_vector[2] * aV.m_vector[1],
00088                  m_vector[2] * aV.m_vector[0] - m_vector[0] * aV.m_vector[2],
00089                  m_vector[0] * aV.m_vector[1] - m_vector[1] * aV.m_vector[0]);
00090   }    
00091   /*double dot(const vec3d& aV) const {
00092     return (m_vector[0] * aV.m_vector[0] + 
00093             m_vector[1] * aV.m_vector[1] + 
00094             m_vector[2] * aV.m_vector[2]);
00095   }*/   
00096 public:
00097   //NOTE : don't handle a static object because of mem balance.
00098   //static const vec3d& x_axis() {
00099   //  static const vec3d s_v(1,0,0);
00100   //  return s_v;
00101   //}
00102   //static const vec3d& y_axis() {
00103   //  static const vec3d s_v(0,1,0);
00104   //  return s_v;
00105   //}
00106   //static const vec3d& z_axis() {
00107   //  static const vec3d s_v(0,0,1);
00108   //  return s_v;
00109   //}
00110 private:
00111   static void check_instantiation() {
00112     vec3d dummy(0,0,0);
00113     dummy.set_value(1,1,1);
00114   }
00115 };
00116 
00117 inline vec3d operator*(double a_f,const vec3d& a_v) {
00118   vec3d res(a_v);
00119   res *= a_f;
00120   return res;
00121 }
00122 
00123 }
00124 
00125 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines