Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

GMatrix44.h

00001 /***************************************************************************
00002  *   Copyright (C) 2003-2004 by Raphael Langerhorst                        *
00003  *   raphael-langerhorst@gmx.at                                            *
00004  *                                                                         *
00005  *   Copyright (C) 2004 Gerald Degeneve <gerald.degeneve@gmx.at>           *
00006  *                                                                         *
00007  *   Permission is hereby granted, free of charge, to any person obtaining *
00008  *   a copy of this software and associated documentation files (the       *
00009  *   "Software"), to deal in the Software without restriction, including   *
00010  *   without limitation the rights to use, copy, modify, merge, publish,   *
00011  *   distribute, sublicense, and/or sell copies of the Software, and to    *
00012  *   permit persons to whom the Software is furnished to do so, subject to *
00013  *   the following conditions:                                             *
00014  *                                                                         *
00015  *   The above copyright notice and this permission notice shall be        *
00016  *   included in all copies or substantial portions of the Software.       *
00017  *                                                                         *
00018  *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       *
00019  *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    *
00020  *   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*
00021  *   IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR     *
00022  *   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
00023  *   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR *
00024  *   OTHER DEALINGS IN THE SOFTWARE.                                       *
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

Generated on Thu Oct 21 21:18:03 2004 for G System by doxygen 1.3.6