00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 #ifndef GLUI_ALGEBRA3_H
00078 #define GLUI_ALGEBRA3_H
00079
00080 #include <cmath>
00081 #include <cstdio>
00082 #include <cstdlib>
00083
00084
00085
00086 typedef float (*V_FCT_PTR)(float);
00087
00088 class vec2;
00089 class vec3;
00090 class vec4;
00091 class mat3;
00092 class mat4;
00093
00094 #ifndef M_PI
00095 #define M_PI 3.141592654
00096 #endif
00097
00098 enum {VX, VY, VZ, VW};
00099 enum {PA, PB, PC, PD};
00100 enum {RED, GREEN, BLUE, ALPHA};
00101 enum {KA, KD, KS, ES};
00102
00103
00104
00105
00106
00107
00108
00109 class vec2
00110 {
00111 friend class vec3;
00112
00113 protected:
00114
00115 float n[2];
00116
00117 public:
00118
00119
00120
00121 vec2();
00122 vec2(float x, float y);
00123 vec2(const vec2 &v);
00124 vec2(const vec3 &v);
00125 vec2(const vec3 &v, int dropAxis);
00126
00127
00128
00129 vec2 &operator = (const vec2 &v);
00130 vec2 &operator += (const vec2 &v);
00131 vec2 &operator -= (const vec2 &v);
00132 vec2 &operator *= (float d);
00133 vec2 &operator /= (float d);
00134
00135
00136
00137 float length() const;
00138 float length2() const;
00139 vec2 &normalize();
00140 vec2 &apply(V_FCT_PTR fct);
00141 void set(float x, float y);
00142
00143 float &operator [] (int i);
00144 const float &operator [] (int i) const;
00145
00146
00147
00148 friend vec2 operator - (const vec2 &v);
00149 friend vec2 operator + (const vec2 &a, const vec2 &b);
00150 friend vec2 operator - (const vec2 &a, const vec2 &b);
00151 friend vec2 operator * (const vec2 &a, float d);
00152 friend vec2 operator * (float d, const vec2 &a);
00153 friend vec2 operator * (const mat3 &a, const vec2 &v);
00154 friend vec2 operator * (const vec2 &v, const mat3 &a);
00155 friend float operator * (const vec2 &a, const vec2 &b);
00156 friend vec2 operator / (const vec2 &a, float d);
00157 friend vec3 operator ^ (const vec2 &a, const vec2 &b);
00158 friend int operator == (const vec2 &a, const vec2 &b);
00159 friend int operator != (const vec2 &a, const vec2 &b);
00160
00161
00162 friend void swap(vec2 &a, vec2 &b);
00163 friend vec2 min_vec(const vec2 &a, const vec2 &b);
00164 friend vec2 max_vec(const vec2 &a, const vec2 &b);
00165 friend vec2 prod (const vec2 &a, const vec2 &b);
00166 };
00167
00168
00169
00170
00171
00172
00173
00174 class vec3
00175 {
00176 friend class vec2;
00177 friend class vec4;
00178 friend class mat3;
00179
00180 protected:
00181
00182 float n[3];
00183
00184 public:
00185
00186
00187
00188 vec3();
00189 vec3(float x, float y, float z);
00190 vec3(const vec3 &v);
00191 vec3(const vec2 &v);
00192 vec3(const vec2 &v, float d);
00193 vec3(const vec4 &v);
00194 vec3(const vec4 &v, int dropAxis);
00195
00196
00197
00198 vec3 &operator = (const vec3 &v);
00199 vec3 &operator += (const vec3 &v);
00200 vec3 &operator -= (const vec3 &v);
00201 vec3 &operator *= (float d);
00202 vec3 &operator /= (float d);
00203
00204
00205
00206 float length() const;
00207 float length2() const;
00208 vec3& normalize();
00209 vec3& homogenize();
00210 vec3& apply(V_FCT_PTR fct);
00211 void set(float x, float y, float z);
00212
00213 void print(FILE *file, const char *name) const;
00214
00215
00216 float &operator [] (int i);
00217 const float &operator [] (int i) const;
00218
00219
00220
00221 friend vec3 operator - (const vec3 &v);
00222 friend vec3 operator + (const vec3 &a, const vec3 &b);
00223 friend vec3 operator - (const vec3 &a, const vec3 &b);
00224 friend vec3 operator * (const vec3 &a, float d);
00225 friend vec3 operator * (float d, const vec3 &a);
00226 friend vec3 operator * (const mat4 &a, const vec3 &v);
00227 friend vec3 operator * (const vec3 &v, const mat4 &a);
00228 friend float operator * (const vec3 &a, const vec3 &b);
00229 friend vec3 operator / (const vec3 &a, float d);
00230 friend vec3 operator ^ (const vec3 &a, const vec3 &b);
00231 friend int operator == (const vec3 &a, const vec3 &b);
00232 friend int operator != (const vec3 &a, const vec3 &b);
00233
00234
00235 friend void swap(vec3 &a, vec3 &b);
00236 friend vec3 min_vec(const vec3 &a, const vec3 &b);
00237 friend vec3 max_vec(const vec3 &a, const vec3 &b);
00238 friend vec3 prod(const vec3 &a, const vec3 &b);
00239
00240
00241
00242 friend vec2 operator * (const mat3 &a, const vec2 &v);
00243 friend vec3 operator * (const mat3 &a, const vec3 &v);
00244 friend mat3 operator * (const mat3 &a, const mat3 &b);
00245 };
00246
00247
00248
00249
00250
00251
00252
00253 class vec4
00254 {
00255 friend class vec3;
00256 friend class mat4;
00257
00258 protected:
00259
00260 float n[4];
00261
00262 public:
00263
00264
00265
00266 vec4();
00267 vec4(float x, float y, float z, float w);
00268 vec4(const vec4 &v);
00269 vec4(const vec3 &v);
00270 vec4(const vec3 &v, float d);
00271
00272
00273
00274 vec4 &operator = (const vec4 &v);
00275 vec4 &operator += (const vec4 &v);
00276 vec4 &operator -= (const vec4 &v);
00277 vec4 &operator *= (float d);
00278 vec4 &operator /= (float d);
00279
00280
00281
00282 float length() const;
00283 float length2() const;
00284 vec4 &normalize();
00285 vec4 &apply(V_FCT_PTR fct);
00286 vec4 &homogenize();
00287
00288 void print(FILE *file, const char *name) const;
00289
00290 void set(float x, float y, float z, float a);
00291
00292 float &operator [] (int i);
00293 const float &operator [] (int i) const;
00294
00295
00296
00297 friend vec4 operator - (const vec4 &v);
00298 friend vec4 operator + (const vec4 &a, const vec4 &b);
00299 friend vec4 operator - (const vec4 &a, const vec4 &b);
00300 friend vec4 operator * (const vec4 &a, float d);
00301 friend vec4 operator * (float d, const vec4 &a);
00302 friend vec4 operator * (const mat4 &a, const vec4 &v);
00303 friend vec4 operator * (const vec4 &v, const mat4 &a);
00304 friend float operator * (const vec4 &a, const vec4 &b);
00305 friend vec4 operator / (const vec4 &a, float d);
00306 friend int operator == (const vec4 &a, const vec4 &b);
00307 friend int operator != (const vec4 &a, const vec4 &b);
00308
00309
00310 friend void swap(vec4 &a, vec4 &b);
00311 friend vec4 min_vec(const vec4 &a, const vec4 &b);
00312 friend vec4 max_vec(const vec4 &a, const vec4 &b);
00313 friend vec4 prod (const vec4 &a, const vec4 &b);
00314
00315
00316
00317 friend vec3 operator * (const mat4 &a, const vec3 &v);
00318 friend mat4 operator * (const mat4 &a, const mat4 &b);
00319 };
00320
00321
00322
00323
00324
00325
00326
00327 class mat3
00328 {
00329 protected:
00330
00331 vec3 v[3];
00332
00333 public:
00334
00335
00336
00337 mat3();
00338 mat3(const vec3 &v0, const vec3 &v1, const vec3 &v2);
00339 mat3(const mat3 &m);
00340
00341
00342
00343 mat3 &operator = (const mat3 &m);
00344 mat3 &operator += (const mat3 &m);
00345 mat3 &operator -= (const mat3 &m);
00346 mat3 &operator *= (float d);
00347 mat3 &operator /= (float d);
00348
00349
00350
00351 mat3 transpose() const;
00352 mat3 inverse() const;
00353 mat3 &apply(V_FCT_PTR fct);
00354
00355 void print(FILE *file, const char *name ) const;
00356
00357 void set(const vec3 &v0, const vec3 &v1, const vec3 &v2);
00358
00359 vec3 &operator [] (int i);
00360 const vec3 &operator [] (int i) const;
00361
00362
00363
00364 friend mat3 operator - (const mat3 &a);
00365 friend mat3 operator + (const mat3 &a, const mat3 &b);
00366 friend mat3 operator - (const mat3 &a, const mat3 &b);
00367 friend mat3 operator * (const mat3 &a, const mat3 &b);
00368 friend mat3 operator * (const mat3 &a, float d);
00369 friend mat3 operator * (float d, const mat3 &a);
00370 friend mat3 operator / (const mat3 &a, float d);
00371 friend int operator == (const mat3 &a, const mat3 &b);
00372 friend int operator != (const mat3 &a, const mat3 &b);
00373
00374
00375 friend void swap(mat3 &a, mat3 &b);
00376
00377
00378
00379 friend vec3 operator * (const mat3 &a, const vec3 &v);
00380 friend vec2 operator * (const mat3 &a, const vec2 &v);
00381 };
00382
00383
00384
00385
00386
00387
00388
00389 class mat4
00390 {
00391 protected:
00392
00393 vec4 v[4];
00394
00395 public:
00396
00397
00398
00399 mat4();
00400 mat4(const vec4 &v0, const vec4 &v1, const vec4 &v2, const vec4 &v3);
00401 mat4(const mat4 &m);
00402 mat4(float a00, float a01, float a02, float a03,
00403 float a10, float a11, float a12, float a13,
00404 float a20, float a21, float a22, float a23,
00405 float a30, float a31, float a32, float a33 );
00406
00407
00408
00409
00410 mat4 &operator = (const mat4 &m);
00411 mat4 &operator += (const mat4 &m);
00412 mat4 &operator -= (const mat4 &m);
00413 mat4 &operator *= (float d);
00414 mat4 &operator /= (float d);
00415
00416
00417
00418 mat4 transpose() const;
00419 mat4 inverse() const;
00420 mat4 &apply(V_FCT_PTR fct);
00421
00422 void print(FILE *file, const char *name) const;
00423
00424 vec4 &operator [] (int i);
00425 const vec4 &operator [] (int i) const;
00426
00427 void swap_rows(int i, int j);
00428 void swap_cols(int i, int j);
00429
00430
00431
00432 friend mat4 operator - (const mat4 &a);
00433 friend mat4 operator + (const mat4 &a, const mat4 &b);
00434 friend mat4 operator - (const mat4 &a, const mat4 &b);
00435 friend mat4 operator * (const mat4 &a, const mat4 &b);
00436 friend mat4 operator * (const mat4 &a, float d);
00437 friend mat4 operator * (float d, const mat4 &a);
00438 friend mat4 operator / (const mat4 &a, float d);
00439 friend int operator == (const mat4 &a, const mat4 &b);
00440 friend int operator != (const mat4 &a, const mat4 &b);
00441
00442
00443 friend void swap(mat4 &a, mat4 &b);
00444
00445
00446
00447 friend vec4 operator * (const mat4 &a, const vec4 &v);
00448
00449 friend vec3 operator * (const mat4 &a, const vec3 &v);
00450 friend vec3 operator * (const vec3 &v, const mat4 &a);
00451 };
00452
00453
00454
00455
00456
00457
00458
00459 mat3 identity2D ();
00460 mat3 translation2D(const vec2 &v);
00461 mat3 rotation2D (const vec2 &Center, float angleDeg);
00462 mat3 scaling2D (const vec2 &scaleVector);
00463 mat4 identity3D ();
00464 mat4 translation3D(const vec3 &v);
00465 mat4 rotation3D (const vec3 &Axis, float angleDeg);
00466 mat4 rotation3Drad(const vec3 &Axis, float angleRad);
00467 mat4 scaling3D (const vec3 &scaleVector);
00468 mat4 perspective3D(float d);
00469
00470 vec3 operator * (const vec3 &v, const mat3 &a);
00471 vec2 operator * (const vec2 &v, const mat3 &a);
00472 vec3 operator * (const vec3 &v, const mat4 &a);
00473 vec4 operator * (const vec4 &v, const mat4 &a);
00474
00475 #endif