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 #ifndef GMATRIX44H
00028 #define GMATRIX44H
00029
00030 #include "GVector3.h"
00031
00032 namespace GCS
00033
00034 {
00035
00036 class GVector3;
00037
00045 class GMatrix44
00046 {
00047
00048 public:
00052 union
00053 {
00057 struct
00058 {
00059 double m11, m12, m13, m14,
00060 m21, m22, m23, m24,
00061 m31, m32, m33, m34,
00062 m41, m42, m43, m44;
00063 };
00064
00069 double m[4][4];
00070
00075 double n[16];
00076 };
00077
00078 public:
00079
00083 GMatrix44() :
00084 m11(1), m12(0), m13(0), m14(0),
00085 m21(0), m22(1), m23(0), m24(0),
00086 m31(0), m32(0), m33(1), m34(0),
00087 m41(0), m42(0), m43(0), m44(1)
00088 {
00089 }
00090
00094 GMatrix44(double _m11, double _m12, double _m13, double _m14,
00095 double _m21, double _m22, double _m23, double _m24,
00096 double _m31, double _m32, double _m33, double _m34,
00097 double _m41, double _m42, double _m43, double _m44) :
00098 m11(_m11), m12(_m12), m13(_m13), m14(_m14),
00099 m21(_m21), m22(_m22), m23(_m23), m24(_m24),
00100 m31(_m31), m32(_m32), m33(_m33), m34(_m34),
00101 m41(_m41), m42(_m42), m43(_m43), m44(_m44)
00102 {
00103 }
00104
00108 GMatrix44(const GMatrix44& original) :
00109 m11(original.m11), m12(original.m12), m13(original.m13), m14(original.m14),
00110 m21(original.m21), m22(original.m22), m23(original.m23), m24(original.m24),
00111 m31(original.m31), m32(original.m32), m33(original.m33), m34(original.m34),
00112 m41(original.m41), m42(original.m42), m43(original.m43), m44(original.m44)
00113 {
00114 }
00115
00116
00120 operator double* ();
00121
00122
00126 GMatrix44& loadIdentity();
00127
00128
00133 GMatrix44 multiply(double scalar);
00134
00135
00140 GMatrix44 multiply(const GMatrix44& m) const;
00141
00142
00147 GVector3 transform(const GVector3& v) const;
00148
00149
00154 GMatrix44 operator + (const GMatrix44& m) const;
00155
00156
00161 GMatrix44 operator - (const GMatrix44& m) const;
00162
00163
00168 GMatrix44 operator * (const GMatrix44& m) const;
00169
00170
00175 GMatrix44 operator * (const double scalar) const;
00176
00177
00182 inline bool operator == (const GMatrix44& m) const;
00183
00184
00189 inline bool operator != (const GMatrix44& m) const;
00190
00191 };
00192
00193
00194 inline GMatrix44::operator double* ()
00195 {
00196 return (double*)(n);
00197 }
00198
00199
00200
00201 inline GMatrix44& GMatrix44::loadIdentity()
00202 {
00203 m11 = 1; m12 = 0; m13 = 0; m14 = 0;
00204 m21 = 0; m22 = 1; m23 = 0; m24 = 0;
00205 m31 = 0; m32 = 0; m33 = 1; m34 = 0;
00206 m41 = 0; m42 = 0; m43 = 0; m44 = 1;
00207
00208 return *this;
00209 }
00210
00211
00212 inline GMatrix44 GMatrix44::multiply(double scalar)
00213 {
00214 return GMatrix44(m11 * scalar, m12 * scalar, m13 * scalar, m14 * scalar,
00215 m21 * scalar, m22 * scalar, m23 * scalar, m24 * scalar,
00216 m31 * scalar, m32 * scalar, m33 * scalar, m34 * scalar,
00217 m41 * scalar, m42 * scalar, m43 * scalar, m44 * scalar);
00218 }
00219
00220
00221 inline GMatrix44 GMatrix44::multiply(const GMatrix44& m) const
00222 {
00223 return GMatrix44(m.m11 * m11 + m.m21 * m12 + m.m31 * m13 + m.m41 * m14,
00224 m.m12 * m11 + m.m22 * m12 + m.m32 * m13 + m.m42 * m14,
00225 m.m13 * m11 + m.m23 * m12 + m.m33 * m13 + m.m43 * m14,
00226 m.m14 * m11 + m.m24 * m12 + m.m34 * m13 + m.m44 * m14,
00227 m.m11 * m21 + m.m21 * m22 + m.m31 * m23 + m.m41 * m24,
00228 m.m12 * m21 + m.m22 * m22 + m.m32 * m23 + m.m42 * m24,
00229 m.m13 * m21 + m.m23 * m22 + m.m33 * m23 + m.m43 * m24,
00230 m.m14 * m21 + m.m24 * m22 + m.m34 * m23 + m.m44 * m24,
00231 m.m11 * m31 + m.m21 * m32 + m.m31 * m33 + m.m41 * m34,
00232 m.m12 * m31 + m.m22 * m32 + m.m32 * m33 + m.m42 * m34,
00233 m.m13 * m31 + m.m23 * m32 + m.m33 * m33 + m.m43 * m34,
00234 m.m14 * m31 + m.m24 * m32 + m.m34 * m33 + m.m44 * m34,
00235 m.m11 * m41 + m.m21 * m42 + m.m31 * m43 + m.m41 * m44,
00236 m.m12 * m41 + m.m22 * m42 + m.m32 * m43 + m.m42 * m44,
00237 m.m13 * m41 + m.m23 * m42 + m.m33 * m43 + m.m43 * m44,
00238 m.m14 * m41 + m.m24 * m42 + m.m34 * m43 + m.m44 * m44);
00239 }
00240
00241
00242
00243 inline GVector3 GMatrix44::transform(const GVector3& v) const
00244 {
00245 return GVector3(m[0][0]*v.x + m[0][1]*v.y + m[0][2]*v.z,
00246 m[1][0]*v.x + m[1][1]*v.y + m[1][2]*v.z,
00247 m[2][0]*v.x + m[2][1]*v.y + m[2][2]*v.z);
00248 }
00249
00250
00251
00252 inline GMatrix44 GMatrix44::operator + (const GMatrix44& m) const
00253 {
00254 return GMatrix44(m11 + m.m11, m12 + m.m12, m13 + m.m13, m14 + m.m14,
00255 m21 + m.m21, m22 + m.m22, m23 + m.m23, m24 + m.m24,
00256 m31 + m.m31, m32 + m.m32, m33 + m.m33, m34 + m.m34,
00257 m41 + m.m41, m42 + m.m42, m43 + m.m43, m44 + m.m44);
00258 }
00259
00260
00261 inline GMatrix44 GMatrix44::operator - (const GMatrix44& m) const
00262 {
00263 return GMatrix44(m11 - m.m11, m12 - m.m12, m13 - m.m13, m14 - m.m14,
00264 m21 - m.m21, m22 - m.m22, m23 - m.m23, m24 - m.m24,
00265 m31 - m.m31, m32 - m.m32, m33 - m.m33, m34 - m.m34,
00266 m41 - m.m41, m42 - m.m42, m43 - m.m43, m44 - m.m44);
00267 }
00268
00269
00270 inline GMatrix44 GMatrix44::operator * (const GMatrix44& m) const
00271 {
00272 return GMatrix44(m.m11 * m11 + m.m21 * m12 + m.m31 * m13 + m.m41 * m14,
00273 m.m12 * m11 + m.m22 * m12 + m.m32 * m13 + m.m42 * m14,
00274 m.m13 * m11 + m.m23 * m12 + m.m33 * m13 + m.m43 * m14,
00275 m.m14 * m11 + m.m24 * m12 + m.m34 * m13 + m.m44 * m14,
00276 m.m11 * m21 + m.m21 * m22 + m.m31 * m23 + m.m41 * m24,
00277 m.m12 * m21 + m.m22 * m22 + m.m32 * m23 + m.m42 * m24,
00278 m.m13 * m21 + m.m23 * m22 + m.m33 * m23 + m.m43 * m24,
00279 m.m14 * m21 + m.m24 * m22 + m.m34 * m23 + m.m44 * m24,
00280 m.m11 * m31 + m.m21 * m32 + m.m31 * m33 + m.m41 * m34,
00281 m.m12 * m31 + m.m22 * m32 + m.m32 * m33 + m.m42 * m34,
00282 m.m13 * m31 + m.m23 * m32 + m.m33 * m33 + m.m43 * m34,
00283 m.m14 * m31 + m.m24 * m32 + m.m34 * m33 + m.m44 * m34,
00284 m.m11 * m41 + m.m21 * m42 + m.m31 * m43 + m.m41 * m44,
00285 m.m12 * m41 + m.m22 * m42 + m.m32 * m43 + m.m42 * m44,
00286 m.m13 * m41 + m.m23 * m42 + m.m33 * m43 + m.m43 * m44,
00287 m.m14 * m41 + m.m24 * m42 + m.m34 * m43 + m.m44 * m44);
00288 }
00289
00290
00291
00292 inline GMatrix44 GMatrix44::operator * (const double scalar) const
00293 {
00294 return GMatrix44(m11 * scalar, m12 * scalar, m13 * scalar, m14 * scalar,
00295 m21 * scalar, m22 * scalar, m23 * scalar, m24 * scalar,
00296 m31 * scalar, m32 * scalar, m33 * scalar, m34 * scalar,
00297 m41 * scalar, m42 * scalar, m43 * scalar, m44 * scalar);
00298 }
00299
00300
00301
00302 inline bool GMatrix44::operator == (const GMatrix44& m) const
00303 {
00304 if(m11 != m.m11) return false;
00305 if(m12 != m.m12) return false;
00306 if(m13 != m.m13) return false;
00307 if(m14 != m.m14) return false;
00308 if(m21 != m.m21) return false;
00309 if(m22 != m.m22) return false;
00310 if(m23 != m.m23) return false;
00311 if(m24 != m.m24) return false;
00312 if(m31 != m.m31) return false;
00313 if(m32 != m.m32) return false;
00314 if(m33 != m.m33) return false;
00315 if(m34 != m.m34) return false;
00316 if(m41 != m.m41) return false;
00317 if(m42 != m.m42) return false;
00318 if(m43 != m.m43) return false;
00319 return m44 == m.m44;
00320 }
00321
00322
00323
00324 inline bool GMatrix44::operator != (const GMatrix44& m) const
00325 {
00326 if(m11 != m.m11) return true;
00327 if(m12 != m.m12) return true;
00328 if(m13 != m.m13) return true;
00329 if(m14 != m.m14) return true;
00330 if(m21 != m.m21) return true;
00331 if(m22 != m.m22) return true;
00332 if(m23 != m.m23) return true;
00333 if(m24 != m.m24) return true;
00334 if(m31 != m.m31) return true;
00335 if(m32 != m.m32) return true;
00336 if(m33 != m.m33) return true;
00337 if(m34 != m.m34) return true;
00338 if(m41 != m.m41) return true;
00339 if(m42 != m.m42) return true;
00340 if(m43 != m.m43) return true;
00341 return m44 != m.m44;
00342 }
00343
00344
00345
00346
00347 }
00348
00349 #endif