00001
00002
00003
00004
00005
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
00018
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};
00028 enum {PA, PB, PC, PD};
00029 enum {RED, GREEN, BLUE};
00030
00031
00032
00033
00034
00035
00036
00037 class vec2
00038 {
00039 protected:
00040
00041 double n[2];
00042
00043 public:
00044
00045
00046
00047 vec2();
00048 vec2(const double x, const double y);
00049 vec2(const double d);
00050 vec2(const vec2& v);
00051 vec2(const vec3& v);
00052 vec2(const vec3& v, int dropAxis);
00053
00054
00055
00056 vec2& operator = ( const vec2& v );
00057 vec2& operator += ( const vec2& v );
00058 vec2& operator -= ( const vec2& v );
00059 vec2& operator *= ( const double d );
00060 vec2& operator /= ( const double d );
00061 double& operator [] ( int i);
00062 const double& operator[](int i) const;
00063
00064
00065
00066 double length();
00067 double length2();
00068 vec2& normalize();
00069 vec2& apply(V_FCT_PTR fct);
00070
00071
00072
00073 friend vec2 operator - (const vec2& v);
00074 friend vec2 operator + (const vec2& a, const vec2& b);
00075 friend vec2 operator - (const vec2& a, const vec2& b);
00076 friend vec2 operator * (const vec2& a, const double d);
00077 friend vec2 operator * (const double d, const vec2& a);
00078 friend vec2 operator * (const mat3& a, const vec2& v);
00079 friend vec2 operator * (const vec2& v, mat3& a);
00080 friend double operator * (const vec2& a, const vec2& b);
00081 friend vec2 operator / (const vec2& a, const double d);
00082 friend vec3 operator ^ (const vec2& a, const vec2& b);
00083 friend int operator == (const vec2& a, const vec2& b);
00084 friend int operator != (const vec2& a, const vec2& b);
00085 friend std::ostream& operator << (std::ostream& s, vec2& v);
00086 friend std::istream& operator >> (std::istream& s, vec2& v);
00087 friend void swap(vec2& a, vec2& b);
00088 friend vec2 min(const vec2& a, const vec2& b);
00089 friend vec2 max(const vec2& a, const vec2& b);
00090 friend vec2 prod(const vec2& a, const vec2& b);
00091
00092
00093
00094 friend class vec3;
00095 };
00096
00097
00098
00099
00100
00101
00102
00103 class vec3
00104 {
00105 protected:
00106
00107 double n[3];
00108
00109 public:
00110
00111
00112
00113 vec3();
00114 vec3(const double x, const double y, const double z);
00115 vec3(const double d);
00116 vec3(const vec3& v);
00117 vec3(const vec2& v);
00118 vec3(const vec2& v, double d);
00119 vec3(const vec4& v);
00120 vec3(const vec4& v, int dropAxis);
00121
00122
00123
00124 vec3& operator = ( const vec3& v );
00125 vec3& operator += ( const vec3& v );
00126 vec3& operator -= ( const vec3& v );
00127 vec3& operator *= ( const double d );
00128 vec3& operator /= ( const double d );
00129 double& operator [] ( int i);
00130 const double& operator[](int i) const;
00131
00132
00133
00134 double length();
00135 double length2();
00136 vec3& normalize();
00137 vec3& apply(V_FCT_PTR fct);
00138
00139
00140
00141 friend vec3 operator - (const vec3& v);
00142 friend vec3 operator + (const vec3& a, const vec3& b);
00143 friend vec3 operator - (const vec3& a, const vec3& b);
00144 friend vec3 operator * (const vec3& a, const double d);
00145 friend vec3 operator * (const double d, const vec3& a);
00146 friend vec3 operator * (const mat4& a, const vec3& v);
00147 friend vec3 operator * (const vec3& v, const mat4& a);
00148 friend double operator * (const vec3& a, const vec3& b);
00149 friend vec3 operator / (const vec3& a, const double d);
00150 friend vec3 operator ^ (const vec3& a, const vec3& b);
00151 friend int operator == (const vec3& a, const vec3& b);
00152 friend int operator != (const vec3& a, const vec3& b);
00153 friend std::ostream& operator << (std::ostream& s, vec3& v);
00154 friend std::istream& operator >> (std::istream& s, vec3& v);
00155 friend void swap(vec3& a, vec3& b);
00156 friend vec3 min(const vec3& a, const vec3& b);
00157 friend vec3 max(const vec3& a, const vec3& b);
00158 friend vec3 prod(const vec3& a, const vec3& b);
00159
00160
00161
00162 friend class vec2;
00163 friend class vec4;
00164 friend class mat3;
00165 friend vec2 operator * (const mat3& a, const vec2& v);
00166 friend mat3 operator * (const mat3& a, const mat3& b);
00167 };
00168
00169
00170
00171
00172
00173
00174
00175 class vec4
00176 {
00177 protected:
00178
00179 double n[4];
00180
00181 public:
00182
00183
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);
00189 vec4(const vec3& v);
00190 vec4(const vec3& v, const double d);
00191
00192
00193
00194 vec4& operator = ( const vec4& v );
00195 vec4& operator += ( const vec4& v );
00196 vec4& operator -= ( const vec4& v );
00197 vec4& operator *= ( const double d );
00198 vec4& operator /= ( const double d );
00199 double& operator [] ( int i);
00200 const double& operator [] ( int i) const;
00201
00202
00203
00204 double length();
00205 double length2();
00206 vec4& normalize();
00207 vec4& apply(V_FCT_PTR fct);
00208
00209
00210
00211 friend vec4 operator - (const vec4& v);
00212 friend vec4 operator + (const vec4& a, const vec4& b);
00213 friend vec4 operator - (const vec4& a, const vec4& b);
00214 friend vec4 operator * (const vec4& a, const double d);
00215 friend vec4 operator * (const double d, const vec4& a);
00216 friend vec4 operator * (const mat4& a, const vec4& v);
00217 friend vec4 operator * (const vec4& v, const mat4& a);
00218 friend double operator * (const vec4& a, const vec4& b);
00219 friend vec4 operator / (const vec4& a, const double d);
00220 friend int operator == (const vec4& a, const vec4& b);
00221 friend int operator != (const vec4& a, const vec4& b);
00222 friend std::ostream& operator << (std::ostream& s, vec4& v);
00223 friend std::istream& operator >> (std::istream& s, vec4& v);
00224 friend void swap(vec4& a, vec4& b);
00225 friend vec4 min(const vec4& a, const vec4& b);
00226 friend vec4 max(const vec4& a, const vec4& b);
00227 friend vec4 prod(const vec4& a, const vec4& b);
00228
00229
00230
00231 friend class vec3;
00232 friend class mat4;
00233 friend vec3 operator * (const mat4& a, const vec3& v);
00234 friend mat4 operator * (const mat4& a, const mat4& b);
00235 };
00236
00237
00238
00239
00240
00241
00242
00243 class mat3
00244 {
00245 protected:
00246
00247 vec3 v[3];
00248
00249 public:
00250
00251
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
00259
00260 mat3& operator = ( const mat3& m );
00261 mat3& operator += ( const mat3& m );
00262 mat3& operator -= ( const mat3& m );
00263 mat3& operator *= ( const double d );
00264 mat3& operator /= ( const double d );
00265 vec3& operator [] ( int i);
00266 const vec3& operator [] ( int i) const;
00267
00268
00269
00270 mat3 transpose() const;
00271 mat3 inverse();
00272 mat3& apply(V_FCT_PTR fct);
00273
00274
00275
00276 friend mat3 operator - (const mat3& a);
00277 friend mat3 operator + (const mat3& a, const mat3& b);
00278 friend mat3 operator - (const mat3& a, const mat3& b);
00279 friend mat3 operator * (const mat3& a, const mat3& b);
00280 friend mat3 operator * (const mat3& a, const double d);
00281 friend mat3 operator * (const double d, const mat3& a);
00282 friend mat3 operator / (const mat3& a, const double d);
00283 friend int operator == (const mat3& a, const mat3& b);
00284 friend int operator != (const mat3& a, const mat3& b);
00285 friend std::ostream& operator << (std::ostream& s, mat3& m);
00286 friend std::istream& operator >> (std::istream& s, mat3& m);
00287 friend void swap(mat3& a, mat3& b);
00288
00289
00290
00291 friend vec3 operator * (const mat3& a, const vec3& v);
00292 friend vec2 operator * (const mat3& a, const vec2& v);
00293 };
00294
00295
00296
00297
00298
00299
00300
00301 class mat4
00302 {
00303 protected:
00304
00305 vec4 v[4];
00306
00307 public:
00308
00309
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
00317
00318 mat4& operator = ( const mat4& m );
00319 mat4& operator += ( const mat4& m );
00320 mat4& operator -= ( const mat4& m );
00321 mat4& operator *= ( const double d );
00322 mat4& operator /= ( const double d );
00323 vec4& operator [] ( int i);
00324 const vec4& operator [] ( int i) const;
00325
00326
00327
00328 mat4 transpose() const;
00329 mat4 inverse();
00330 mat4& apply(V_FCT_PTR fct);
00331
00332
00333
00334 friend mat4 operator - (const mat4& a);
00335 friend mat4 operator + (const mat4& a, const mat4& b);
00336 friend mat4 operator - (const mat4& a, const mat4& b);
00337 friend mat4 operator * (const mat4& a, const mat4& b);
00338 friend mat4 operator * (const mat4& a, const double d);
00339 friend mat4 operator * (const double d, const mat4& a);
00340 friend mat4 operator / (const mat4& a, const double d);
00341 friend int operator == (const mat4& a, const mat4& b);
00342 friend int operator != (const mat4& a, const mat4& b);
00343 friend std::ostream& operator << (std::ostream& s, mat4& m);
00344 friend std::istream& operator >> (std::istream& s, mat4& m);
00345 friend void swap(mat4& a, mat4& b);
00346
00347
00348
00349 friend vec4 operator * (const mat4& a, const vec4& v);
00350 friend vec3 operator * (const mat4& a, const vec3& v);
00351 };
00352
00353
00354
00355
00356
00357
00358
00359 mat3 identity2D();
00360 mat3 translation2D(const vec2& v);
00361 mat3 rotation2D(const vec2& Center, const double angleDeg);
00362 mat3 scaling2D(const vec2& scaleVector);
00363 mat4 identity3D();
00364 mat4 translation3D(const vec3& v);
00365 mat4 rotation3D(const vec3& Axis, const double angleDeg);
00366 mat4 scaling3D(const vec3& scaleVector);
00367 mat4 perspective3D(const double d);
00368
00369 }
00370
00371 #endif