Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members

starlab_vector.h

Go to the documentation of this file.
00001 
00002        //=======================================================//    _\|/_
00003       //  __  _____           ___                    ___       //      /|\ ~
00004      //  /      |      ^     |   \  |         ^     |   \     //          _\|/_
00005     //   \__    |     / \    |___/  |        / \    |___/    //            /|\ ~
00006    //       \   |    /___\   |  \   |       /___\   |   \   // _\|/_
00007   //     ___/   |   /     \  |   \  |____  /     \  |___/  //   /|\ ~
00008  //                                                       //            _\|/_
00009 //=======================================================//              /|\ ~
00010 
00012 //
00013 //  This file includes:
00014 //  1) definition of class vec
00015 
00016 #ifndef  STARLAB_vector_H
00017 #  define  STARLAB_vector_H
00018 
00019 #include "stdinc.h"
00020 
00022 
00026 
00027 class vec
00028 {
00029     private:
00030 
00032 
00033         real element[3];
00034 
00035     public:
00036 
00038 
00039         vec(real c = 0)
00040             {element[0] = element[1] = element[2] = c;}
00041 
00043 
00044         vec(real x, real y, real z)
00045             {element[0] = x; element[1] = y; element[2] = z;}
00046 
00048 
00053 
00054         real & operator [] (int i)       {return element[i];}
00055 
00057 
00058         inline void print() {cout << element[0] << " " << element[1] << " "
00059                                   << element[2] << "\n";}
00060 
00062 
00063         vec operator - ()
00064             {return vec(-element[0], -element[1], -element[2]);}
00065 
00067 
00068         real operator * (const vec& b)
00069             {return element[0]*b.element[0]
00070                   + element[1]*b.element[1]
00071                   + element[2]*b.element[2];}
00072 
00074 
00075         vec operator ^ (const vec &b)
00076             {return vec(element[1]*b.element[2] - element[2]*b.element[1],
00077                         element[2]*b.element[0] - element[0]*b.element[2],
00078                         element[0]*b.element[1] - element[1]*b.element[0]);}
00079 
00081 
00082         vec operator + (const vec &b)
00083             {return vec(element[0]+b.element[0],
00084                         element[1]+b.element[1],
00085                         element[2]+b.element[2]);}
00087 
00088         vec operator - (const vec &b)
00089             {return vec(element[0]-b.element[0],
00090                         element[1]-b.element[1],
00091                         element[2]-b.element[2]);}
00092 
00093         friend vec operator + (real, const vec & );
00094         friend vec operator + (const vec &, real);
00095 
00097 
00098         friend vec operator * (real, const vec & );
00099 
00101 
00102         friend vec operator * (const vec &, real);
00103 
00105 
00106         friend vec operator / (const vec &, real);
00107 
00108 //      Bool ==, !=: apparently can't do bit-by-bit compare because the
00109 //      member data are private.  Hence these need to be friends in order
00110 //      to apply these operators.  Almost never used, however...
00111 
00113 
00114         friend bool operator == (const vec &, const vec &);
00115 
00117 
00118         friend bool operator != (const vec &, const vec &);
00119 
00120 //      Post operations (again...) -- the GCC3 december 2002 sage:
00121 //      this is a some interesting way to resolve the ambiguity of
00122 //      resolving  v*s vs. s*v and the confusion of having a v*v with
00123 //      a non-explicit vec constructor from a scalar.....
00124 
00126 
00127         vec operator * (const real b)
00128           {return vec(element[0]*b, element[1]*b, element[2]*b); }
00129 
00131 
00132         vec operator + (const real b)
00133           {return vec(element[0]+b, element[1]+b, element[2]+b); }
00134 
00136 
00137         vec& operator += (const vec& b)
00138             {element[0] += b.element[0];       
00139              element[1] += b.element[1];
00140              element[2] += b.element[2];
00141              return *this;}
00142 
00144 
00145         vec& operator -= (const vec& b)
00146             {element[0] -= b.element[0];
00147              element[1] -= b.element[1];
00148              element[2] -= b.element[2];
00149              return *this;}
00150 
00152 
00153         vec& operator *= (const real b)
00154             {element[0] *= b;
00155              element[1] *= b;
00156              element[2] *= b;
00157              return *this;}
00158 
00160 
00161         vec& operator /= (const real b)
00162             {element[0] /= b;
00163              element[1] /= b;
00164              element[2] /= b;
00165              return *this;}
00166 
00168 
00169         friend ostream & operator << (ostream & , const vec & );
00170 
00172 
00173         friend istream & operator >> (istream & , vec & );
00174 };
00175 
00176 inline  ostream & operator << (ostream & s, const vec & v)
00177             {return s << v.element[0] << "  " << v.element[1]
00178                       << "  " << v.element[2];}
00179 
00180 inline  istream & operator >> (istream & s, vec & v)
00181             {s >> v.element[0] >> v.element[1] >> v.element[2];
00182              return s;}
00183 
00184 inline  real square(vec v) {return v*v;}
00185 inline  real abs(vec v)    {return sqrt(v*v);}
00186 
00187 // Another measure of vector magnitude; less work than abs():
00188 
00189 inline  real abs1(vec v)   {return abs(v[0]) + abs(v[1]) + abs(v[2]);}
00190 
00191 inline  vec operator + (real b, const vec & v)
00192             {return vec(b+v.element[0],
00193                         b+v.element[1],
00194                         b+v.element[2]);}
00195 
00196 inline  vec operator + (const vec & v, real b)
00197             {return vec(b+v.element[0],
00198                         b+v.element[1],
00199                         b+v.element[2]);}
00200 
00201 inline  vec operator * (real b, const vec & v)
00202             {return vec(b*v.element[0],
00203                         b*v.element[1],
00204                         b*v.element[2]);}
00205 
00206 inline  vec operator * (const vec & v, real b)
00207             {return vec(b*v.element[0],
00208                         b*v.element[1],
00209                         b*v.element[2]);}
00210 
00211 inline  vec operator / (const vec & v, real b)
00212             {return vec(v.element[0]/b,
00213                         v.element[1]/b,
00214                         v.element[2]/b);}
00215 
00216 inline  bool operator == (const vec& u, const vec& v)
00217             {return (u.element[0] == v.element[0]
00218                      && u.element[1] == v.element[1]
00219                      && u.element[2] == v.element[2]);}
00220 
00221 inline  bool operator != (const vec& u, const vec& v)
00222             {return !(u==v);}
00223 
00224 #endif
00225 
00226 //=======================================================================//
00227 //  +---------------+        _\|/_        +------------------------------\\ ~
00228 //  |  the end of:  |         /|\         |  inc/starlab_vector.h
00229 //  +---------------+                     +------------------------------//
00230 //========================= STARLAB =====================================\\ ~
00231  

Generated on Wed Jul 20 12:43:37 2005 for Starlab by  doxygen 1.4.3