csgeom/matrix3.h
Go to the documentation of this file.00001 /* 00002 Copyright (C) 1998,1999,2000 by Jorrit Tyberghein 00003 Largely rewritten by Ivan Avramovic <ivan@avramovic.com> 00004 00005 This library is free software; you can redistribute it and/or 00006 modify it under the terms of the GNU Library General Public 00007 License as published by the Free Software Foundation; either 00008 version 2 of the License, or (at your option) any later version. 00009 00010 This library is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 Library General Public License for more details. 00014 00015 You should have received a copy of the GNU Library General Public 00016 License along with this library; if not, write to the Free 00017 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00018 */ 00019 00020 #ifndef __CS_MATRIX3_H__ 00021 #define __CS_MATRIX3_H__ 00022 00030 #include "csextern.h" 00031 #include "csgeom/vector3.h" 00032 00033 class csQuaternion; 00034 00038 class CS_CRYSTALSPACE_EXPORT csMatrix3 00039 { 00040 public: 00041 float m11, m12, m13; 00042 float m21, m22, m23; 00043 float m31, m32, m33; 00044 00045 public: 00047 csMatrix3 () 00048 : m11(1), m12(0), m13(0), 00049 m21(0), m22(1), m23(0), 00050 m31(0), m32(0), m33(1) 00051 {} 00052 00054 csMatrix3 (float am11, float am12, float am13, 00055 float am21, float am22, float am23, 00056 float am31, float am32, float am33) 00057 : m11(am11), m12(am12), m13(am13), 00058 m21(am21), m22(am22), m23(am23), 00059 m31(am31), m32(am32), m33(am33) 00060 {} 00061 00063 csMatrix3 (csMatrix3 const& o) 00064 : m11(o.m11), m12(o.m12), m13(o.m13), 00065 m21(o.m21), m22(o.m22), m23(o.m23), 00066 m31(o.m31), m32(o.m32), m33(o.m33) 00067 {} 00068 00070 csMatrix3 (float x,float y, float z, float angle); 00071 00073 explicit csMatrix3 (const csQuaternion &quat) 00074 { Set (quat); } 00075 00077 csString Description() const; 00078 00080 inline csVector3 Row1() const 00081 { return csVector3 (m11, m12, m13); } 00082 00084 inline csVector3 Row2() const 00085 { return csVector3 (m21, m22, m23); } 00086 00088 inline csVector3 Row3() const 00089 { return csVector3 (m31, m32, m33); } 00090 00092 inline csVector3 Row(size_t n) const 00093 { 00094 return !n ? csVector3 (m11, m12, m13) : 00095 n&1 ? csVector3 (m21, m22, m23) : 00096 csVector3 (m31, m32, m33); 00097 } 00098 00100 inline csVector3 Col1() const 00101 { return csVector3 (m11, m21, m31); } 00102 00104 inline csVector3 Col2() const 00105 { return csVector3 (m12, m22, m32); } 00106 00108 inline csVector3 Col3() const 00109 { return csVector3 (m13, m23, m33); } 00110 00112 inline csVector3 Col(size_t n) const 00113 { 00114 return !n ? csVector3 (m11, m21, m31) : 00115 n&1 ? csVector3 (m12, m22, m32) : 00116 csVector3 (m13, m23, m33); 00117 } 00118 00120 inline void Set (float o11, float o12, float o13, 00121 float o21, float o22, float o23, 00122 float o31, float o32, float o33) 00123 { 00124 m11 = o11; m12 = o12; m13 = o13; 00125 m21 = o21; m22 = o22; m23 = o23; 00126 m31 = o31; m32 = o32; m33 = o33; 00127 } 00128 00130 inline void Set (csMatrix3 const &o) 00131 { 00132 m11 = o.m11; m12 = o.m12; m13 = o.m13; 00133 m21 = o.m21; m22 = o.m22; m23 = o.m23; 00134 m31 = o.m31; m32 = o.m32; m33 = o.m33; 00135 } 00136 00138 void Set (const csQuaternion&); 00139 00141 inline csMatrix3& operator= (const csMatrix3& o) 00142 { Set(o); return *this; } 00143 00145 inline csMatrix3& operator+= (const csMatrix3& m) 00146 { 00147 m11 += m.m11; m12 += m.m12; m13 += m.m13; 00148 m21 += m.m21; m22 += m.m22; m23 += m.m23; 00149 m31 += m.m31; m32 += m.m32; m33 += m.m33; 00150 return *this; 00151 } 00152 00154 inline csMatrix3& operator-= (const csMatrix3& m) 00155 { 00156 m11 -= m.m11; m12 -= m.m12; m13 -= m.m13; 00157 m21 -= m.m21; m22 -= m.m22; m23 -= m.m23; 00158 m31 -= m.m31; m32 -= m.m32; m33 -= m.m33; 00159 return *this; 00160 } 00161 00163 inline csMatrix3& operator*= (const csMatrix3& m) 00164 { 00165 float old_m11 = m11; 00166 m11 = m11 * m.m11 + m12 * m.m21 + m13 * m.m31; 00167 00168 float old_m12 = m12; 00169 m12 = old_m11 * m.m12 + m12 * m.m22 + m13 * m.m32; 00170 m13 = old_m11 * m.m13 + old_m12 * m.m23 + m13 * m.m33; 00171 00172 float old_m21 = m21; 00173 m21 = m21 * m.m11 + m22 * m.m21 + m23 * m.m31; 00174 00175 float old_m22 = m22; 00176 m22 = old_m21 * m.m12 + m22 * m.m22 + m23 * m.m32; 00177 m23 = old_m21 * m.m13 + old_m22 * m.m23 + m23 * m.m33; 00178 00179 float old_m31 = m31; 00180 m31 = m31 * m.m11 + m32 * m.m21 + m33 * m.m31; 00181 00182 float old_m32 = m32; 00183 m32 = old_m31 * m.m12 + m32 * m.m22 + m33 * m.m32; 00184 m33 = old_m31 * m.m13 + old_m32 * m.m23 + m33 * m.m33; 00185 return *this; 00186 } 00187 00189 inline csMatrix3& operator*= (float s) 00190 { 00191 m11 *= s; m12 *= s; m13 *= s; 00192 m21 *= s; m22 *= s; m23 *= s; 00193 m31 *= s; m32 *= s; m33 *= s; 00194 return *this; 00195 } 00196 00198 inline csMatrix3& operator/= (float s) 00199 { 00200 s = 1.0f/s; 00201 m11 *= s; m12 *= s; m13 *= s; 00202 m21 *= s; m22 *= s; m23 *= s; 00203 m31 *= s; m32 *= s; m33 *= s; 00204 return *this; 00205 } 00206 00208 inline csMatrix3 operator+ () const 00209 { return *this; } 00210 00212 inline csMatrix3 operator- () const 00213 { 00214 return csMatrix3(-m11,-m12,-m13, 00215 -m21,-m22,-m23, 00216 -m31,-m32,-m33); 00217 } 00218 00220 inline void Transpose () 00221 { 00222 float swap; 00223 swap = m12; m12 = m21; m21 = swap; 00224 swap = m13; m13 = m31; m31 = swap; 00225 swap = m23; m23 = m32; m32 = swap; 00226 } 00227 00229 csMatrix3 GetTranspose () const 00230 { 00231 return csMatrix3 ( 00232 m11, m21, m31, 00233 m12, m22, m32, 00234 m13, m23, m33); 00235 } 00236 00238 inline csMatrix3 GetInverse () const 00239 { 00240 csMatrix3 C( 00241 (m22*m33 - m23*m32), -(m12*m33 - m13*m32), (m12*m23 - m13*m22), 00242 -(m21*m33 - m23*m31), (m11*m33 - m13*m31), -(m11*m23 - m13*m21), 00243 (m21*m32 - m22*m31), -(m11*m32 - m12*m31), (m11*m22 - m12*m21)); 00244 float s = (float)1./(m11*C.m11 + m12*C.m21 + m13*C.m31); 00245 C *= s; 00246 return C; 00247 } 00248 00250 inline void Invert() 00251 { *this = GetInverse (); } 00252 00254 float Determinant () const 00255 { 00256 return m11 * (m22 * m33 - m23 * m32) 00257 - m12 * (m21 * m33 - m23 * m31) 00258 + m13 * (m21 * m32 - m22 * m31); 00259 } 00260 00262 inline void Identity () 00263 { 00264 m11 = m22 = m33 = 1.0; 00265 m12 = m13 = m21 = m23 = m31 = m32 = 0.0; 00266 } 00267 00269 inline bool IsIdentity () const 00270 { 00271 return (m11 == 1.0) && (m12 == 0.0) && (m13 == 0.0) && 00272 (m21 == 0.0) && (m22 == 1.0) && (m23 == 0.0) && 00273 (m31 == 0.0) && (m32 == 0.0) && (m33 == 1.0); 00274 } 00275 00277 inline friend csMatrix3 operator+ (const csMatrix3& m1, const csMatrix3& m2) 00278 { 00279 return csMatrix3 ( 00280 m1.m11 + m2.m11, m1.m12 + m2.m12, m1.m13 + m2.m13, 00281 m1.m21 + m2.m21, m1.m22 + m2.m22, m1.m23 + m2.m23, 00282 m1.m31 + m2.m31, m1.m32 + m2.m32, m1.m33 + m2.m33); 00283 } 00284 00286 inline friend csMatrix3 operator- (const csMatrix3& m1, const csMatrix3& m2) 00287 { 00288 return csMatrix3 ( 00289 m1.m11 - m2.m11, m1.m12 - m2.m12, m1.m13 - m2.m13, 00290 m1.m21 - m2.m21, m1.m22 - m2.m22, m1.m23 - m2.m23, 00291 m1.m31 - m2.m31, m1.m32 - m2.m32, m1.m33 - m2.m33); 00292 } 00293 00295 inline friend csMatrix3 operator* (const csMatrix3& m1, const csMatrix3& m2) 00296 { 00297 return csMatrix3 ( 00298 m1.m11 * m2.m11 + m1.m12 * m2.m21 + m1.m13 * m2.m31, 00299 m1.m11 * m2.m12 + m1.m12 * m2.m22 + m1.m13 * m2.m32, 00300 m1.m11 * m2.m13 + m1.m12 * m2.m23 + m1.m13 * m2.m33, 00301 m1.m21 * m2.m11 + m1.m22 * m2.m21 + m1.m23 * m2.m31, 00302 m1.m21 * m2.m12 + m1.m22 * m2.m22 + m1.m23 * m2.m32, 00303 m1.m21 * m2.m13 + m1.m22 * m2.m23 + m1.m23 * m2.m33, 00304 m1.m31 * m2.m11 + m1.m32 * m2.m21 + m1.m33 * m2.m31, 00305 m1.m31 * m2.m12 + m1.m32 * m2.m22 + m1.m33 * m2.m32, 00306 m1.m31 * m2.m13 + m1.m32 * m2.m23 + m1.m33 * m2.m33); 00307 } 00308 00310 inline friend csVector3 operator* (const csMatrix3& m, const csVector3& v) 00311 { 00312 return csVector3 (m.m11*v.x + m.m12*v.y + m.m13*v.z, 00313 m.m21*v.x + m.m22*v.y + m.m23*v.z, 00314 m.m31*v.x + m.m32*v.y + m.m33*v.z); 00315 } 00316 00318 inline friend csMatrix3 operator* (const csMatrix3& m, float f) 00319 { 00320 return csMatrix3 ( 00321 m.m11 * f, m.m12 * f, m.m13 * f, 00322 m.m21 * f, m.m22 * f, m.m23 * f, 00323 m.m31 * f, m.m32 * f, m.m33 * f); 00324 } 00325 00327 inline friend csMatrix3 operator* (float f, const csMatrix3& m) 00328 { 00329 return csMatrix3 ( 00330 m.m11 * f, m.m12 * f, m.m13 * f, 00331 m.m21 * f, m.m22 * f, m.m23 * f, 00332 m.m31 * f, m.m32 * f, m.m33 * f); 00333 } 00334 00336 inline friend csMatrix3 operator/ (const csMatrix3& m, float f) 00337 { 00338 float inv_f = 1 / f; 00339 return csMatrix3 ( 00340 m.m11 * inv_f, m.m12 * inv_f, m.m13 * inv_f, 00341 m.m21 * inv_f, m.m22 * inv_f, m.m23 * inv_f, 00342 m.m31 * inv_f, m.m32 * inv_f, m.m33 * inv_f); 00343 } 00344 00346 inline friend bool operator== (const csMatrix3& m1, const csMatrix3& m2) 00347 { 00348 if (m1.m11 != m2.m11 || m1.m12 != m2.m12 || m1.m13 != m2.m13) 00349 return false; 00350 if (m1.m21 != m2.m21 || m1.m22 != m2.m22 || m1.m23 != m2.m23) 00351 return false; 00352 if (m1.m31 != m2.m31 || m1.m32 != m2.m32 || m1.m33 != m2.m33) 00353 return false; 00354 return true; 00355 } 00356 00358 inline friend bool operator!= (const csMatrix3& m1, const csMatrix3& m2) 00359 { 00360 if (m1.m11 != m2.m11 || m1.m12 != m2.m12 || m1.m13 != m2.m13) return true; 00361 if (m1.m21 != m2.m21 || m1.m22 != m2.m22 || m1.m23 != m2.m23) return true; 00362 if (m1.m31 != m2.m31 || m1.m32 != m2.m32 || m1.m33 != m2.m33) return true; 00363 return false; 00364 } 00365 00367 inline friend bool operator< (const csMatrix3& m, float f) 00368 { 00369 return fabsf (m.m11) < f && fabsf (m.m12) < f && fabsf (m.m13) < f && 00370 fabsf (m.m21) < f && fabsf (m.m22) < f && fabsf (m.m23) < f && 00371 fabsf (m.m31) < f && fabsf (m.m32) < f && fabsf (m.m33) < f; 00372 } 00373 00375 inline friend bool operator> (float f, const csMatrix3& m) 00376 { 00377 return !(m < f); 00378 } 00379 }; 00380 00382 class CS_CRYSTALSPACE_EXPORT csXRotMatrix3 : public csMatrix3 00383 { 00384 public: 00391 csXRotMatrix3 (float angle); 00392 }; 00393 00395 class CS_CRYSTALSPACE_EXPORT csYRotMatrix3 : public csMatrix3 00396 { 00397 public: 00404 csYRotMatrix3 (float angle); 00405 }; 00406 00408 class CS_CRYSTALSPACE_EXPORT csZRotMatrix3 : public csMatrix3 00409 { 00410 public: 00417 csZRotMatrix3 (float angle); 00418 }; 00419 00421 class CS_CRYSTALSPACE_EXPORT csXScaleMatrix3 : public csMatrix3 00422 { 00423 public: 00427 csXScaleMatrix3 (float scaler) 00428 : csMatrix3(scaler, 0, 0, 0, 1, 0, 0, 0, 1) 00429 {} 00430 }; 00431 00433 class CS_CRYSTALSPACE_EXPORT csYScaleMatrix3 : public csMatrix3 00434 { 00435 public: 00439 csYScaleMatrix3 (float scaler) 00440 : csMatrix3(1, 0, 0, 0, scaler, 0, 0, 0, 1) 00441 {} 00442 }; 00443 00445 class CS_CRYSTALSPACE_EXPORT csZScaleMatrix3 : public csMatrix3 00446 { 00447 public: 00451 csZScaleMatrix3 (float scaler) 00452 : csMatrix3(1, 0, 0, 0, 1, 0, 0, 0, scaler) 00453 {} 00454 }; 00455 00456 00459 #endif // __CS_MATRIX3_H__
Generated for Crystal Space 1.4.0 by doxygen 1.5.8