Google

Main Page   Class Hierarchy   Compound List   File List   Compound Members   Related Pages  

algebra3.h

00001 /****************************************************************
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.