Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members
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
