MarSTDv2004: CVector.h Source File

MarSTDv2004

CVector.h

Go to the documentation of this file.
00001 #ifndef __cVECTOR_h__
00002 #define __cVECTOR_h__
00003 
00005 // MarSTD version 2004 - (c)2004 - Marcel Smit                      //
00006 //                                                                  //
00007 // [email protected]                                      //
00008 // [email protected]                                          //
00009 //                                                                  //
00010 // This code may not be used in a commercial product without my     //
00011 // permission. If you redistribute it, this message must remain     //
00012 // intact. If you use this code, some acknowledgement would be      //
00013 // appreciated. ;-)                                                 //
00015 
00017 
00018 
00019 
00020 #include <math.h>
00021 #include "CDebug.h"
00022 
00023 //---------------------------------------------------------------------------
00024 
00026 
00045 class CVector
00046 {
00047 
00048     public:
00049 
00053         CVector()
00054     {
00055                 v[0] = v[1] = v[2] = 0.0;
00056         }
00057         
00061         CVector(float x, float y, float z)
00062     {
00063                 v[0] = x;
00064                 v[1] = y;
00065                 v[2] = z;
00066         }
00067         ~CVector()
00068     {
00069     
00070         }
00071         
00072     public:
00073  
00074     float v[4];
00075         
00076         public:
00077         
00084         void set(float x, float y, float z)
00085     {
00086                 v[0] = x;
00087                 v[1] = y;
00088                 v[2] = z;
00089         }
00093         float size()
00094     {
00095                 return sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
00096         }  
00101         float size2()
00102     {
00103                 return v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
00104         }
00109         void normalize()
00110     {
00111                 float size = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
00112                 MASSERT(size != 0.0);           
00113                 if (size == 0.0)
00114                 {
00115                         v[0] = 1.0;
00116                         v[1] = 0.0;
00117                         v[2] = 0.0;
00118                         return;
00119                 }
00120                 float isize = 1.0f / size;
00121                 v[0] *= isize;
00122                 v[1] *= isize;
00123                 v[2] *= isize;                  
00124         }
00130         CVector MA(CVector& vector, float scale)
00131     {
00132                 CVector tmp;
00133                 tmp.v[0] = v[0] + scale * vector.v[0];
00134                 tmp.v[1] = v[1] + scale * vector.v[1];
00135                 tmp.v[2] = v[2] + scale * vector.v[2];
00136                 return tmp;
00137         }
00138 
00139     public:
00140     
00144         void operator=(CVector vector)
00145     {
00146                 v[0] = vector.v[0];
00147                 v[1] = vector.v[1];
00148                 v[2] = vector.v[2];             
00149         }
00153         CVector operator-(CVector vector)
00154     {
00155                 CVector tmp;
00156                 tmp.v[0] = v[0] - vector.v[0];
00157                 tmp.v[1] = v[1] - vector.v[1];
00158                 tmp.v[2] = v[2] - vector.v[2];                  
00159                 return tmp;
00160         } 
00164         CVector operator+(CVector vector)
00165     {
00166                 CVector tmp;
00167                 tmp.v[0] = v[0] + vector.v[0];
00168                 tmp.v[1] = v[1] + vector.v[1];
00169                 tmp.v[2] = v[2] + vector.v[2];                  
00170                 return tmp;
00171         }
00175         CVector& operator-=(CVector& vector)
00176     {
00177                 v[0] -= vector.v[0];
00178                 v[1] -= vector.v[1];
00179                 v[2] -= vector.v[2];            
00180                 return *this;
00181         }
00185         CVector& operator+=(CVector& vector)
00186     {
00187                 v[0] += vector.v[0];
00188                 v[1] += vector.v[1];
00189                 v[2] += vector.v[2];            
00190                 return *this;
00191         }
00195         CVector operator*(float scale)
00196     {
00197                 CVector tmp;
00198                 tmp.v[0] = v[0] * scale;
00199                 tmp.v[1] = v[1] * scale;
00200                 tmp.v[2] = v[2] * scale;
00201                 return tmp;             
00202         }
00206         CVector operator/(float scale)
00207     {
00208         MASSERT(scale != 0.0);
00209                 CVector tmp;
00210                 tmp.v[0] = v[0] / scale;
00211                 tmp.v[1] = v[1] / scale;
00212                 tmp.v[2] = v[2] / scale;
00213                 return tmp;             
00214         }
00218         CVector& operator*=(float scale)
00219     {
00220                 v[0] = v[0] * scale;
00221                 v[1] = v[1] * scale;
00222                 v[2] = v[2] * scale;
00223                 return *this;           
00224         }
00228         CVector& operator/=(float scale)
00229     {
00230                 MASSERT(scale != 0.0);  
00231                 float iscale = 1.0f / scale;
00232                 v[0] = v[0] * iscale;
00233                 v[1] = v[1] * iscale;
00234                 v[2] = v[2] * iscale;
00235                 return *this;           
00236         }
00240         CVector operator-()
00241     {
00242                 CVector tmp;
00243                 tmp.v[0] = -v[0];
00244                 tmp.v[1] = -v[1];
00245                 tmp.v[2] = -v[2];               
00246                 return tmp;
00247         }
00252         float operator*(CVector& vector)
00253     {
00254 
00255                 return v[0] * vector.v[0] + v[1] * vector.v[1] + v[2] * vector.v[2];
00256                 
00257         }
00262         CVector operator%(CVector& vector)
00263     {
00264                 CVector tmp;
00265                 tmp.v[0] = v[1] * vector.v[2] - v[2] * vector.v[1];
00266                 tmp.v[1] = v[2] * vector.v[0] - v[0] * vector.v[2];
00267                 tmp.v[2] = v[0] * vector.v[1] - v[1] * vector.v[0];
00268                 return tmp;
00269         }
00273         CVector operator|(CVector& vector)
00274     {
00275                 CVector tmp;
00276                 tmp.v[0] = v[0] * vector.v[0];
00277                 tmp.v[1] = v[1] * vector.v[1];
00278                 tmp.v[2] = v[2] * vector.v[2];                  
00279                 return tmp;
00280         }
00284         float& operator[](int index)
00285     {
00286         MASSERT(index >= 0 && index <= 3);
00287                 return v[index];
00288         }
00292         operator float*()
00293     {
00294                 return v;
00295         }
00299         bool operator==(CVector& vector)
00300     {
00301         #if 1
00302                 for (int i = 0; i < 3; ++i)
00303         {
00304                         if (v[i] != vector.v[i])
00305                                 return false;
00306                 }
00307                 #else
00308                 for (int i = 0; i < 3; ++i)
00309         {
00310                         if (fabs(v[i] - vector.v[i]) > 0.001)
00311                                 return false;
00312                 }               
00313                 #endif
00314                 return true;
00315         }
00319         bool operator!=(CVector& vector)
00320     {
00321                 for (int i = 0; i < 3; ++i)
00322         {
00323                         if (v[i] != vector.v[i])
00324                                 return true;
00325                 }
00326                 return false;
00327         }
00328         
00329 };
00330 
00331 //---------------------------------------------------------------------------
00332 
00333 #endif

Generated on Tue Feb 8 21:59:02 2005 for MarSTDv2004 by  doxygen 1.4.1