![]()
|
algebra3.h00001 /**************************************************************** 00002 * * 00003 * C++ Vector and Matrix Algebra routines * 00004 * Author: Jean-Francois DOUE * 00005 * Version 3.1 --- October 1993 * 00006 * * 00007 ****************************************************************/ 00008 00009 #ifndef _util_misc_algebra_h 00010 #define _util_misc_algebra_h 00011 00012 #include <iostream> 00013 #include <stdlib.h> 00014 00015 namespace sc { 00016 00017 // this line defines a new type: pointer to a function which returns a 00018 // double and takes as argument a double 00019 typedef double (*V_FCT_PTR)(double); 00020 00021 class vec2; 00022 class vec3; 00023 class vec4; 00024 class mat3; 00025 class mat4; 00026 00027 enum {VX, VY, VZ, VW}; // axes 00028 enum {PA, PB, PC, PD}; // planes 00029 enum {RED, GREEN, BLUE}; // colors 00030 00031 /**************************************************************** 00032 * * 00033 * 2D Vector * 00034 * * 00035 ****************************************************************/ 00036 00037 class vec2 00038 { 00039 protected: 00040 00041 double n[2]; 00042 00043 public: 00044 00045 // Constructors 00046 00047 vec2(); 00048 vec2(const double x, const double y); 00049 vec2(const double d); 00050 vec2(const vec2& v); // copy constructor 00051 vec2(const vec3& v); // cast v3 to v2 00052 vec2(const vec3& v, int dropAxis); // cast v3 to v2 00053 00054 // Assignment operators 00055 00056 vec2& operator = ( const vec2& v ); // assignment of a vec2 00057 vec2& operator += ( const vec2& v ); // incrementation by a vec2 00058 vec2& operator -= ( const vec2& v ); // decrementation by a vec2 00059 vec2& operator *= ( const double d ); // multiplication by a constant 00060 vec2& operator /= ( const double d ); // division by a constant 00061 double& operator [] ( int i); // indexing 00062 const double& operator[](int i) const; // indexing 00063 00064 // special functions 00065 00066 double length(); // length of a vec2 00067 double length2(); // squared length of a vec2 00068 vec2& normalize(); // normalize a vec2 00069 vec2& apply(V_FCT_PTR fct); // apply a func. to each component 00070 00071 // friends 00072 00073 friend vec2 operator - (const vec2& v); // -v1 00074 friend vec2 operator + (const vec2& a, const vec2& b); // v1 + v2 00075 friend vec2 operator - (const vec2& a, const vec2& b); // v1 - v2 00076 friend vec2 operator * (const vec2& a, const double d); // v1 * 3.0 00077 friend vec2 operator * (const double d, const vec2& a); // 3.0 * v1 00078 friend vec2 operator * (const mat3& a, const vec2& v); // M . v 00079 friend vec2 operator * (const vec2& v, mat3& a); // v . M 00080 friend double operator * (const vec2& a, const vec2& b); // dot product 00081 friend vec2 operator / (const vec2& a, const double d); // v1 / 3.0 00082 friend vec3 operator ^ (const vec2& a, const vec2& b); // cross product 00083 friend int operator == (const vec2& a, const vec2& b); // v1 == v2 ? 00084 friend int operator != (const vec2& a, const vec2& b); // v1 != v2 ? 00085 friend std::ostream& operator << (std::ostream& s, vec2& v);// output to stream 00086 friend std::istream& operator >> (std::istream& s, vec2& v);// input from strm. 00087 friend void swap(vec2& a, vec2& b); // swap v1 & v2 00088 friend vec2 min(const vec2& a, const vec2& b); // min(v1, v2) 00089 friend vec2 max(const vec2& a, const vec2& b); // max(v1, v2) 00090 friend vec2 prod(const vec2& a, const vec2& b); // term by term * 00091 00092 // necessary friend declarations 00093 00094 friend class vec3; 00095 }; 00096 00097 /**************************************************************** 00098 * * 00099 * 3D Vector * 00100 * * 00101 ****************************************************************/ 00102 00103 class vec3 00104 { 00105 protected: 00106 00107 double n[3]; 00108 00109 public: 00110 00111 // Constructors 00112 00113 vec3(); 00114 vec3(const double x, const double y, const double z); 00115 vec3(const double d); 00116 vec3(const vec3& v); // copy constructor 00117 vec3(const vec2& v); // cast v2 to v3 00118 vec3(const vec2& v, double d); // cast v2 to v3 00119 vec3(const vec4& v); // cast v4 to v3 00120 vec3(const vec4& v, int dropAxis); // cast v4 to v3 00121 00122 // Assignment operators 00123 00124 vec3& operator = ( const vec3& v ); // assignment of a vec3 00125 vec3& operator += ( const vec3& v ); // incrementation by a vec3 00126 vec3& operator -= ( const vec3& v ); // decrementation by a vec3 00127 vec3& operator *= ( const double d ); // multiplication by a constant 00128 vec3& operator /= ( const double d ); // division by a constant 00129 double& operator [] ( int i); // indexing 00130 const double& operator[](int i) const; // indexing 00131 00132 // special functions 00133 00134 double length(); // length of a vec3 00135 double length2(); // squared length of a vec3 00136 vec3& normalize(); // normalize a vec3 00137 vec3& apply(V_FCT_PTR fct); // apply a func. to each component 00138 00139 // friends 00140 00141 friend vec3 operator - (const vec3& v); // -v1 00142 friend vec3 operator + (const vec3& a, const vec3& b); // v1 + v2 00143 friend vec3 operator - (const vec3& a, const vec3& b); // v1 - v2 00144 friend vec3 operator * (const vec3& a, const double d); // v1 * 3.0 00145 friend vec3 operator * (const double d, const vec3& a); // 3.0 * v1 00146 friend vec3 operator * (const mat4& a, const vec3& v); // M . v 00147 friend vec3 operator * (const vec3& v, const mat4& a); // v . M 00148 friend double operator * (const vec3& a, const vec3& b); // dot product 00149 friend vec3 operator / (const vec3& a, const double d); // v1 / 3.0 00150 friend vec3 operator ^ (const vec3& a, const vec3& b); // cross product 00151 friend int operator == (const vec3& a, const vec3& b); // v1 == v2 ? 00152 friend int operator != (const vec3& a, const vec3& b); // v1 != v2 ? 00153 friend std::ostream& operator << (std::ostream& s, vec3& v);// output to stream 00154 friend std::istream& operator >> (std::istream& s, vec3& v);// input from strm. 00155 friend void swap(vec3& a, vec3& b); // swap v1 & v2 00156 friend vec3 min(const vec3& a, const vec3& b); // min(v1, v2) 00157 friend vec3 max(const vec3& a, const vec3& b); // max(v1, v2) 00158 friend vec3 prod(const vec3& a, const vec3& b); // term by term * 00159 00160 // necessary friend declarations 00161 00162 friend class vec2; 00163 friend class vec4; 00164 friend class mat3; 00165 friend vec2 operator * (const mat3& a, const vec2& v); // linear transform 00166 friend mat3 operator * (const mat3& a, const mat3& b); // matrix 3 product 00167 }; 00168 00169 /**************************************************************** 00170 * * 00171 * 4D Vector * 00172 * * 00173 ****************************************************************/ 00174 00175 class vec4 00176 { 00177 protected: 00178 00179 double n[4]; 00180 00181 public: 00182 00183 // Constructors 00184 00185 vec4(); 00186 vec4(const double x, const double y, const double z, const double w); 00187 vec4(const double d); 00188 vec4(const vec4& v); // copy constructor 00189 vec4(const vec3& v); // cast vec3 to vec4 00190 vec4(const vec3& v, const double d); // cast vec3 to vec4 00191 00192 // Assignment operators 00193 00194 vec4& operator = ( const vec4& v ); // assignment of a vec4 00195 vec4& operator += ( const vec4& v ); // incrementation by a vec4 00196 vec4& operator -= ( const vec4& v ); // decrementation by a vec4 00197 vec4& operator *= ( const double d ); // multiplication by a constant 00198 vec4& operator /= ( const double d ); // division by a constant 00199 double& operator [] ( int i); // indexing 00200 const double& operator [] ( int i) const; // indexing 00201 00202 // special functions 00203 00204 double length(); // length of a vec4 00205 double length2(); // squared length of a vec4 00206 vec4& normalize(); // normalize a vec4 00207 vec4& apply(V_FCT_PTR fct); // apply a func. to each component 00208 00209 // friends 00210 00211 friend vec4 operator - (const vec4& v); // -v1 00212 friend vec4 operator + (const vec4& a, const vec4& b); // v1 + v2 00213 friend vec4 operator - (const vec4& a, const vec4& b); // v1 - v2 00214 friend vec4 operator * (const vec4& a, const double d); // v1 * 3.0 00215 friend vec4 operator * (const double d, const vec4& a); // 3.0 * v1 00216 friend vec4 operator * (const mat4& a, const vec4& v); // M . v 00217 friend vec4 operator * (const vec4& v, const mat4& a); // v . M 00218 friend double operator * (const vec4& a, const vec4& b); // dot product 00219 friend vec4 operator / (const vec4& a, const double d); // v1 / 3.0 00220 friend int operator == (const vec4& a, const vec4& b); // v1 == v2 ? 00221 friend int operator != (const vec4& a, const vec4& b); // v1 != v2 ? 00222 friend std::ostream& operator << (std::ostream& s, vec4& v);// output to stream 00223 friend std::istream& operator >> (std::istream& s, vec4& v);// input from strm. 00224 friend void swap(vec4& a, vec4& b); // swap v1 & v2 00225 friend vec4 min(const vec4& a, const vec4& b); // min(v1, v2) 00226 friend vec4 max(const vec4& a, const vec4& b); // max(v1, v2) 00227 friend vec4 prod(const vec4& a, const vec4& b); // term by term * 00228 00229 // necessary friend declarations 00230 00231 friend class vec3; 00232 friend class mat4; 00233 friend vec3 operator * (const mat4& a, const vec3& v); // linear transform 00234 friend mat4 operator * (const mat4& a, const mat4& b); // matrix 4 product 00235 }; 00236 00237 /**************************************************************** 00238 * * 00239 * 3x3 Matrix * 00240 * * 00241 ****************************************************************/ 00242 00243 class mat3 00244 { 00245 protected: 00246 00247 vec3 v[3]; 00248 00249 public: 00250 00251 // Constructors 00252 00253 mat3(); 00254 mat3(const vec3& v0, const vec3& v1, const vec3& v2); 00255 mat3(const double d); 00256 mat3(const mat3& m); 00257 00258 // Assignment operators 00259 00260 mat3& operator = ( const mat3& m ); // assignment of a mat3 00261 mat3& operator += ( const mat3& m ); // incrementation by a mat3 00262 mat3& operator -= ( const mat3& m ); // decrementation by a mat3 00263 mat3& operator *= ( const double d ); // multiplication by a constant 00264 mat3& operator /= ( const double d ); // division by a constant 00265 vec3& operator [] ( int i); // indexing 00266 const vec3& operator [] ( int i) const; // indexing 00267 00268 // special functions 00269 00270 mat3 transpose() const; // transpose 00271 mat3 inverse(); // inverse 00272 mat3& apply(V_FCT_PTR fct); // apply a func. to each element 00273 00274 // friends 00275 00276 friend mat3 operator - (const mat3& a); // -m1 00277 friend mat3 operator + (const mat3& a, const mat3& b); // m1 + m2 00278 friend mat3 operator - (const mat3& a, const mat3& b); // m1 - m2 00279 friend mat3 operator * (const mat3& a, const mat3& b); // m1 * m2 00280 friend mat3 operator * (const mat3& a, const double d); // m1 * 3.0 00281 friend mat3 operator * (const double d, const mat3& a); // 3.0 * m1 00282 friend mat3 operator / (const mat3& a, const double d); // m1 / 3.0 00283 friend int operator == (const mat3& a, const mat3& b); // m1 == m2 ? 00284 friend int operator != (const mat3& a, const mat3& b); // m1 != m2 ? 00285 friend std::ostream& operator << (std::ostream& s, mat3& m);// output to stream 00286 friend std::istream& operator >> (std::istream& s, mat3& m);// input from strm. 00287 friend void swap(mat3& a, mat3& b); // swap m1 & m2 00288 00289 // necessary friend declarations 00290 00291 friend vec3 operator * (const mat3& a, const vec3& v); // linear transform 00292 friend vec2 operator * (const mat3& a, const vec2& v); // linear transform 00293 }; 00294 00295 /**************************************************************** 00296 * * 00297 * 4x4 Matrix * 00298 * * 00299 ****************************************************************/ 00300 00301 class mat4 00302 { 00303 protected: 00304 00305 vec4 v[4]; 00306 00307 public: 00308 00309 // Constructors 00310 00311 mat4(); 00312 mat4(const vec4& v0, const vec4& v1, const vec4& v2, const vec4& v3); 00313 mat4(const double d); 00314 mat4(const mat4& m); 00315 00316 // Assignment operators 00317 00318 mat4& operator = ( const mat4& m ); // assignment of a mat4 00319 mat4& operator += ( const mat4& m ); // incrementation by a mat4 00320 mat4& operator -= ( const mat4& m ); // decrementation by a mat4 00321 mat4& operator *= ( const double d ); // multiplication by a constant 00322 mat4& operator /= ( const double d ); // division by a constant 00323 vec4& operator [] ( int i); // indexing 00324 const vec4& operator [] ( int i) const; // indexing 00325 00326 // special functions 00327 00328 mat4 transpose() const; // transpose 00329 mat4 inverse(); // inverse 00330 mat4& apply(V_FCT_PTR fct); // apply a func. to each element 00331 00332 // friends 00333 00334 friend mat4 operator - (const mat4& a); // -m1 00335 friend mat4 operator + (const mat4& a, const mat4& b); // m1 + m2 00336 friend mat4 operator - (const mat4& a, const mat4& b); // m1 - m2 00337 friend mat4 operator * (const mat4& a, const mat4& b); // m1 * m2 00338 friend mat4 operator * (const mat4& a, const double d); // m1 * 4.0 00339 friend mat4 operator * (const double d, const mat4& a); // 4.0 * m1 00340 friend mat4 operator / (const mat4& a, const double d); // m1 / 3.0 00341 friend int operator == (const mat4& a, const mat4& b); // m1 == m2 ? 00342 friend int operator != (const mat4& a, const mat4& b); // m1 != m2 ? 00343 friend std::ostream& operator << (std::ostream& s, mat4& m);// output to stream 00344 friend std::istream& operator >> (std::istream& s, mat4& m);// input from strm. 00345 friend void swap(mat4& a, mat4& b); // swap m1 & m2 00346 00347 // necessary friend declarations 00348 00349 friend vec4 operator * (const mat4& a, const vec4& v); // linear transform 00350 friend vec3 operator * (const mat4& a, const vec3& v); // linear transform 00351 }; 00352 00353 /**************************************************************** 00354 * * 00355 * 2D functions and 3D functions * 00356 * * 00357 ****************************************************************/ 00358 00359 mat3 identity2D(); // identity 2D 00360 mat3 translation2D(const vec2& v); // translation 2D 00361 mat3 rotation2D(const vec2& Center, const double angleDeg); // rotation 2D 00362 mat3 scaling2D(const vec2& scaleVector); // scaling 2D 00363 mat4 identity3D(); // identity 3D 00364 mat4 translation3D(const vec3& v); // translation 3D 00365 mat4 rotation3D(const vec3& Axis, const double angleDeg); // rotation 3D 00366 mat4 scaling3D(const vec3& scaleVector); // scaling 3D 00367 mat4 perspective3D(const double d); // perspective 3D 00368 00369 } 00370 00371 #endif Generated at Fri Jan 10 08:14:08 2003 for MPQC 2.1.3 using the documentation package Doxygen 1.2.14. |