3 algebra3.cpp, algebra3.h - C++ Vector and Matrix Algebra routines
5 GLUI User Interface Toolkit (LGPL)
6 Copyright (c) 1998 Paul Rademacher
8 WWW: http://sourceforge.net/projects/glui/
9 Forums: http://sourceforge.net/forum/?group_id=92496
11 This library is free software; you can redistribute it and/or
12 modify it under the terms of the GNU Lesser General Public
13 License as published by the Free Software Foundation; either
14 version 2.1 of the License, or (at your option) any later version.
16 This library is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 Lesser General Public License for more details.
21 You should have received a copy of the GNU Lesser General Public
22 License along with this library; if not, write to the Free Software
23 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 /**************************************************************************
29 There are three vector classes and two matrix classes: vec2, vec3,
32 All the standard arithmetic operations are defined, with '*'
33 for dot product of two vectors and multiplication of two matrices,
34 and '^' for cross product of two vectors.
36 Additional functions include length(), normalize(), homogenize for
37 vectors, and print(), set(), apply() for all classes.
39 There is a function transpose() for matrices, but note that it
40 does not actually change the matrix,
42 When multiplied with a matrix, a vector is treated as a row vector
43 if it precedes the matrix (v*M), and as a column vector if it
44 follows the matrix (M*v).
46 Matrices are stored in row-major form.
48 A vector of one dimension (2d, 3d, or 4d) can be cast to a vector
49 of a higher or lower dimension. If casting to a higher dimension,
50 the new component is set by default to 1.0, unless a value is
52 vec3 a(1.0, 2.0, 3.0 );
53 vec4 b( a, 4.0 ); // now b == {1.0, 2.0, 3.0, 4.0};
54 When casting to a lower dimension, the vector is homogenized in
55 the lower dimension. E.g., if a 4d {X,Y,Z,W} is cast to 3d, the
56 resulting vector is {X/W, Y/W, Z/W}. It is up to the user to
57 insure the fourth component is not zero before casting.
59 There are also the following function for building matrices:
60 identity2D(), translation2D(), rotation2D(),
61 scaling2D(), identity3D(), translation3D(),
62 rotation3D(), rotation3Drad(), scaling3D(),
65 NOTE: When compiling for Windows, include this file first, to avoid
66 certain name conflicts
68 ---------------------------------------------------------------------
70 Author: Jean-Francois DOUEg
71 Revised: Paul Rademacher
72 Version 3.2 - Feb 1998
73 Revised: Nigel Stewart (GLUI Code Cleaning)
75 **************************************************************************/
77 #ifndef GLUI_ALGEBRA3_H
78 #define GLUI_ALGEBRA3_H
84 // this line defines a new type: pointer to a function which returns a
85 // float and takes as argument a float
86 typedef float (*V_FCT_PTR)(float);
95 #define M_PI 3.141592654
98 enum {VX, VY, VZ, VW}; // axes
99 enum {PA, PB, PC, PD}; // planes
100 enum {RED, GREEN, BLUE, ALPHA}; // colors
101 enum {KA, KD, KS, ES}; // phong coefficients
103 /****************************************************************
107 ****************************************************************/
122 vec2(float x, float y);
123 vec2(const vec2 &v); // copy constructor
124 vec2(const vec3 &v); // cast v3 to v2
125 vec2(const vec3 &v, int dropAxis); // cast v3 to v2
127 // Assignment operators
129 vec2 &operator = (const vec2 &v); // assignment of a vec2
130 vec2 &operator += (const vec2 &v); // incrementation by a vec2
131 vec2 &operator -= (const vec2 &v); // decrementation by a vec2
132 vec2 &operator *= (float d); // multiplication by a constant
133 vec2 &operator /= (float d); // division by a constant
137 float length() const; // length of a vec2
138 float length2() const; // squared length of a vec2
139 vec2 &normalize(); // normalize a vec2
140 vec2 &apply(V_FCT_PTR fct); // apply a func. to each component
141 void set(float x, float y); // set vector
143 float &operator [] (int i); // indexing
144 const float &operator [] (int i) const; // indexing
148 friend vec2 operator - (const vec2 &v); // -v1
149 friend vec2 operator + (const vec2 &a, const vec2 &b); // v1 + v2
150 friend vec2 operator - (const vec2 &a, const vec2 &b); // v1 - v2
151 friend vec2 operator * (const vec2 &a, float d); // v1 * 3.0
152 friend vec2 operator * (float d, const vec2 &a); // 3.0 * v1
153 friend vec2 operator * (const mat3 &a, const vec2 &v); // M . v
154 friend vec2 operator * (const vec2 &v, const mat3 &a); // v . M
155 friend float operator * (const vec2 &a, const vec2 &b); // dot product
156 friend vec2 operator / (const vec2 &a, float d); // v1 / 3.0
157 friend vec3 operator ^ (const vec2 &a, const vec2 &b); // cross product
158 friend int operator == (const vec2 &a, const vec2 &b); // v1 == v2 ?
159 friend int operator != (const vec2 &a, const vec2 &b); // v1 != v2 ?
160 //friend ostream& operator << (ostream& s, vec2& v); // output to stream
161 //friend istream& operator >> (istream& s, vec2& v); // input from strm.
162 friend void swap(vec2 &a, vec2 &b); // swap v1 & v2
163 friend vec2 min_vec(const vec2 &a, const vec2 &b); // min(v1, v2)
164 friend vec2 max_vec(const vec2 &a, const vec2 &b); // max(v1, v2)
165 friend vec2 prod (const vec2 &a, const vec2 &b); // term by term *
168 /****************************************************************
172 ****************************************************************/
189 vec3(float x, float y, float z);
190 vec3(const vec3 &v); // copy constructor
191 vec3(const vec2 &v); // cast v2 to v3
192 vec3(const vec2 &v, float d); // cast v2 to v3
193 vec3(const vec4 &v); // cast v4 to v3
194 vec3(const vec4 &v, int dropAxis); // cast v4 to v3
196 // Assignment operators
198 vec3 &operator = (const vec3 &v); // assignment of a vec3
199 vec3 &operator += (const vec3 &v); // incrementation by a vec3
200 vec3 &operator -= (const vec3 &v); // decrementation by a vec3
201 vec3 &operator *= (float d); // multiplication by a constant
202 vec3 &operator /= (float d); // division by a constant
206 float length() const; // length of a vec3
207 float length2() const; // squared length of a vec3
208 vec3& normalize(); // normalize a vec3
209 vec3& homogenize(); // homogenize (div by Z)
210 vec3& apply(V_FCT_PTR fct); // apply a func. to each component
211 void set(float x, float y, float z); // set vector
213 void print(FILE *file, const char *name) const; // print vector to a file
216 float &operator [] (int i); // indexing
217 const float &operator [] (int i) const; // indexing
221 friend vec3 operator - (const vec3 &v); // -v1
222 friend vec3 operator + (const vec3 &a, const vec3 &b); // v1 + v2
223 friend vec3 operator - (const vec3 &a, const vec3 &b); // v1 - v2
224 friend vec3 operator * (const vec3 &a, float d); // v1 * 3.0
225 friend vec3 operator * (float d, const vec3 &a); // 3.0 * v1
226 friend vec3 operator * (const mat4 &a, const vec3 &v); // M . v
227 friend vec3 operator * (const vec3 &v, const mat4 &a); // v . M
228 friend float operator * (const vec3 &a, const vec3 &b); // dot product
229 friend vec3 operator / (const vec3 &a, float d); // v1 / 3.0
230 friend vec3 operator ^ (const vec3 &a, const vec3 &b); // cross product
231 friend int operator == (const vec3 &a, const vec3 &b); // v1 == v2 ?
232 friend int operator != (const vec3 &a, const vec3 &b); // v1 != v2 ?
233 //friend ostream& operator << (ostream& s, vec3& v); // output to stream
234 //friend istream& operator >> (istream& s, vec3& v); // input from strm.
235 friend void swap(vec3 &a, vec3 &b); // swap v1 & v2
236 friend vec3 min_vec(const vec3 &a, const vec3 &b); // min(v1, v2)
237 friend vec3 max_vec(const vec3 &a, const vec3 &b); // max(v1, v2)
238 friend vec3 prod(const vec3 &a, const vec3 &b); // term by term *
240 // necessary friend declarations
242 friend vec2 operator * (const mat3 &a, const vec2 &v); // linear transform
243 friend vec3 operator * (const mat3 &a, const vec3 &v); // linear transform
244 friend mat3 operator * (const mat3 &a, const mat3 &b); // matrix 3 product
247 /****************************************************************
251 ****************************************************************/
267 vec4(float x, float y, float z, float w);
268 vec4(const vec4 &v); // copy constructor
269 vec4(const vec3 &v); // cast vec3 to vec4
270 vec4(const vec3 &v, float d); // cast vec3 to vec4
272 // Assignment operators
274 vec4 &operator = (const vec4 &v); // assignment of a vec4
275 vec4 &operator += (const vec4 &v); // incrementation by a vec4
276 vec4 &operator -= (const vec4 &v); // decrementation by a vec4
277 vec4 &operator *= (float d); // multiplication by a constant
278 vec4 &operator /= (float d); // division by a constant
282 float length() const; // length of a vec4
283 float length2() const; // squared length of a vec4
284 vec4 &normalize(); // normalize a vec4
285 vec4 &apply(V_FCT_PTR fct); // apply a func. to each component
288 void print(FILE *file, const char *name) const; // print vector to a file
290 void set(float x, float y, float z, float a);
292 float &operator [] (int i); // indexing
293 const float &operator [] (int i) const; // indexing
297 friend vec4 operator - (const vec4 &v); // -v1
298 friend vec4 operator + (const vec4 &a, const vec4 &b); // v1 + v2
299 friend vec4 operator - (const vec4 &a, const vec4 &b); // v1 - v2
300 friend vec4 operator * (const vec4 &a, float d); // v1 * 3.0
301 friend vec4 operator * (float d, const vec4 &a); // 3.0 * v1
302 friend vec4 operator * (const mat4 &a, const vec4 &v); // M . v
303 friend vec4 operator * (const vec4 &v, const mat4 &a); // v . M
304 friend float operator * (const vec4 &a, const vec4 &b); // dot product
305 friend vec4 operator / (const vec4 &a, float d); // v1 / 3.0
306 friend int operator == (const vec4 &a, const vec4 &b); // v1 == v2 ?
307 friend int operator != (const vec4 &a, const vec4 &b); // v1 != v2 ?
308 //friend ostream& operator << (ostream& s, vec4& v); // output to stream
309 //friend istream& operator >> (istream& s, vec4& v); // input from strm.
310 friend void swap(vec4 &a, vec4 &b); // swap v1 & v2
311 friend vec4 min_vec(const vec4 &a, const vec4 &b); // min(v1, v2)
312 friend vec4 max_vec(const vec4 &a, const vec4 &b); // max(v1, v2)
313 friend vec4 prod (const vec4 &a, const vec4 &b); // term by term *
315 // necessary friend declarations
317 friend vec3 operator * (const mat4 &a, const vec3 &v); // linear transform
318 friend mat4 operator * (const mat4 &a, const mat4 &b); // matrix 4 product
321 /****************************************************************
325 ****************************************************************/
338 mat3(const vec3 &v0, const vec3 &v1, const vec3 &v2);
341 // Assignment operators
343 mat3 &operator = (const mat3 &m); // assignment of a mat3
344 mat3 &operator += (const mat3 &m); // incrementation by a mat3
345 mat3 &operator -= (const mat3 &m); // decrementation by a mat3
346 mat3 &operator *= (float d); // multiplication by a constant
347 mat3 &operator /= (float d); // division by a constant
351 mat3 transpose() const; // transpose
352 mat3 inverse() const; // inverse
353 mat3 &apply(V_FCT_PTR fct); // apply a func. to each element
355 void print(FILE *file, const char *name ) const; // print matrix to a file
357 void set(const vec3 &v0, const vec3 &v1, const vec3 &v2);
359 vec3 &operator [] (int i); // indexing
360 const vec3 &operator [] (int i) const; // indexing
364 friend mat3 operator - (const mat3 &a); // -m1
365 friend mat3 operator + (const mat3 &a, const mat3 &b); // m1 + m2
366 friend mat3 operator - (const mat3 &a, const mat3 &b); // m1 - m2
367 friend mat3 operator * (const mat3 &a, const mat3 &b); // m1 * m2
368 friend mat3 operator * (const mat3 &a, float d); // m1 * 3.0
369 friend mat3 operator * (float d, const mat3 &a); // 3.0 * m1
370 friend mat3 operator / (const mat3 &a, float d); // m1 / 3.0
371 friend int operator == (const mat3 &a, const mat3 &b); // m1 == m2 ?
372 friend int operator != (const mat3 &a, const mat3 &b); // m1 != m2 ?
373 //friend ostream& operator << (ostream& s, mat3& m); // output to stream
374 //friend istream& operator >> (istream& s, mat3& m); // input from strm.
375 friend void swap(mat3 &a, mat3 &b); // swap m1 & m2
377 // necessary friend declarations
379 friend vec3 operator * (const mat3 &a, const vec3 &v); // linear transform
380 friend vec2 operator * (const mat3 &a, const vec2 &v); // linear transform
383 /****************************************************************
387 ****************************************************************/
400 mat4(const vec4 &v0, const vec4 &v1, const vec4 &v2, const vec4 &v3);
402 mat4(float a00, float a01, float a02, float a03,
403 float a10, float a11, float a12, float a13,
404 float a20, float a21, float a22, float a23,
405 float a30, float a31, float a32, float a33 );
408 // Assignment operators
410 mat4 &operator = (const mat4 &m); // assignment of a mat4
411 mat4 &operator += (const mat4 &m); // incrementation by a mat4
412 mat4 &operator -= (const mat4 &m); // decrementation by a mat4
413 mat4 &operator *= (float d); // multiplication by a constant
414 mat4 &operator /= (float d); // division by a constant
418 mat4 transpose() const; // transpose
419 mat4 inverse() const; // inverse
420 mat4 &apply(V_FCT_PTR fct); // apply a func. to each element
422 void print(FILE *file, const char *name) const; // print matrix to a file
424 vec4 &operator [] (int i); // indexing
425 const vec4 &operator [] (int i) const; // indexing
427 void swap_rows(int i, int j); // swap rows i and j
428 void swap_cols(int i, int j); // swap cols i and j
432 friend mat4 operator - (const mat4 &a); // -m1
433 friend mat4 operator + (const mat4 &a, const mat4 &b); // m1 + m2
434 friend mat4 operator - (const mat4 &a, const mat4 &b); // m1 - m2
435 friend mat4 operator * (const mat4 &a, const mat4 &b); // m1 * m2
436 friend mat4 operator * (const mat4 &a, float d); // m1 * 4.0
437 friend mat4 operator * (float d, const mat4 &a); // 4.0 * m1
438 friend mat4 operator / (const mat4 &a, float d); // m1 / 3.0
439 friend int operator == (const mat4 &a, const mat4 &b); // m1 == m2 ?
440 friend int operator != (const mat4 &a, const mat4 &b); // m1 != m2 ?
441 //friend ostream& operator << (ostream& s, mat4& m); // output to stream
442 //friend istream& operator >> (istream& s, mat4& m); // input from strm.
443 friend void swap(mat4 &a, mat4 &b); // swap m1 & m2
445 // necessary friend declarations
447 friend vec4 operator * (const mat4 &a, const vec4 &v); // linear transform
448 //friend vec4 operator * (const vec4& v, const mat4& a); // linear transform
449 friend vec3 operator * (const mat4 &a, const vec3 &v); // linear transform
450 friend vec3 operator * (const vec3 &v, const mat4 &a); // linear transform
453 /****************************************************************
455 * 2D functions and 3D functions *
457 ****************************************************************/
459 mat3 identity2D (); // identity 2D
460 mat3 translation2D(const vec2 &v); // translation 2D
461 mat3 rotation2D (const vec2 &Center, float angleDeg); // rotation 2D
462 mat3 scaling2D (const vec2 &scaleVector); // scaling 2D
463 mat4 identity3D (); // identity 3D
464 mat4 translation3D(const vec3 &v); // translation 3D
465 mat4 rotation3D (const vec3 &Axis, float angleDeg); // rotation 3D
466 mat4 rotation3Drad(const vec3 &Axis, float angleRad); // rotation 3D
467 mat4 scaling3D (const vec3 &scaleVector); // scaling 3D
468 mat4 perspective3D(float d); // perspective 3D
470 vec3 operator * (const vec3 &v, const mat3 &a);
471 vec2 operator * (const vec2 &v, const mat3 &a);
472 vec3 operator * (const vec3 &v, const mat4 &a);
473 vec4 operator * (const vec4 &v, const mat4 &a);