csgeom/matrix2.h Source File (Crystal Space 2.0 Public API Reference)

| ## Public API Reference

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

csgeom/matrix2.h
Go to the documentation of this file.

    00001 /*
    00002     Copyright (C) 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_MATRIX2_H__
    00021 #define __CS_MATRIX2_H__
    00022
    00023 #include "csgeom/vector2.h"
    00024
    00035 class csMatrix2
    00036 {
    00037 public:
    00038   float m11, m12;
    00039   float m21, m22;
    00040
    00041 public:
    00043   csMatrix2 ()
    00044     : m11 (1), m12 (0), m21 (0), m22 (1)
    00045   {}
    00046
    00048   csMatrix2 (float m11, float m12,
    00049              float m21, float m22)
    00050     : m11 (m11), m12 (m12), m21 (m21), m22 (m22)
    00051   {}
    00052
    00053
    00055   inline csVector2 Row1() const
    00056   { return csVector2 (m11,m12); }
    00057
    00059   inline csVector2 Row2() const
    00060   { return csVector2 (m21,m22); }
    00061
    00063   inline csVector2 Col1() const
    00064   { return csVector2 (m11,m21); }
    00065
    00067   inline csVector2 Col2() const
    00068   { return csVector2 (m12,m22); }
    00069
    00071   inline void Set (float m11, float m12,
    00072                    float m21, float m22)
    00073   {
    00074     csMatrix2::m11 = m11; csMatrix2::m12 = m12;
    00075     csMatrix2::m21 = m21; csMatrix2::m22 = m22;
    00076   }
    00077
    00079   inline csMatrix2& operator+= (const csMatrix2& m)
    00080   {
    00081     m11 += m.m11; m12 += m.m12;
    00082     m21 += m.m21; m22 += m.m22;
    00083     return *this;
    00084   }
    00085
    00087   inline csMatrix2& operator-= (const csMatrix2& m)
    00088   {
    00089     m11 -= m.m11; m12 -= m.m12;
    00090     m21 -= m.m21; m22 -= m.m22;
    00091     return *this;
    00092   }
    00093
    00095   inline csMatrix2& operator*= (const csMatrix2& m)
    00096   {
    00097     csMatrix2 r (*this);
    00098     m11 = r.m11 * m.m11 + r.m12 * m.m21;
    00099     m12 = r.m11 * m.m12 + r.m12 * m.m22;
    00100     m21 = r.m21 * m.m11 + r.m22 * m.m21;
    00101     m22 = r.m21 * m.m12 + r.m22 * m.m22;
    00102     return *this;
    00103   }
    00104
    00106   inline csMatrix2& operator*= (float s)
    00107   {
    00108     m11 *= s; m12 *= s;
    00109     m21 *= s; m22 *= s;
    00110     return *this;
    00111   }
    00112
    00114   inline csMatrix2& operator/= (float s)
    00115   {
    00116     s=1.0f/s;
    00117     m11 *= s; m12 *= s;
    00118     m21 *= s; m22 *= s;
    00119     return *this;
    00120   }
    00121
    00123   inline csMatrix2 operator+ () const
    00124   { return *this; }
    00125
    00127   inline csMatrix2 operator- () const
    00128   {
    00129     return csMatrix2 (-m11,-m12, -m21,-m22);
    00130   }
    00131
    00133   inline void Transpose ()
    00134   {
    00135     float swap = m12;
    00136     m12 = m21;
    00137     m21 = swap;
    00138   }
    00139
    00141   inline csMatrix2 GetTranspose () const
    00142   {
    00143     return csMatrix2 (m11, m21, m12, m22);
    00144   }
    00145
    00147   inline csMatrix2 GetInverse () const
    00148   {
    00149     float inv_det = 1 / (m11 * m22 - m12 * m21);
    00150     return csMatrix2 (m22 * inv_det, -m12 * inv_det,
    00151                       -m21 * inv_det, m11 * inv_det);
    00152   }
    00153
    00155   inline void Invert ()
    00156   { *this = GetInverse (); }
    00157
    00159   inline float Determinant () const
    00160   { return m11 * m22 - m12 * m21; }
    00161
    00163   inline void Identity ()
    00164   {
    00165     m11 = m22 = 1;
    00166     m12 = m21 = 0;
    00167   }
    00168
    00170   inline friend csMatrix2 operator+ (const csMatrix2& m1, const csMatrix2& m2)
    00171   {
    00172     return csMatrix2 (
    00173       m1.m11 + m2.m11, m1.m12 + m2.m12,
    00174       m1.m21 + m2.m21, m1.m22 + m2.m22);
    00175   }
    00176
    00178   inline friend csMatrix2 operator- (const csMatrix2& m1, const csMatrix2& m2)
    00179   {
    00180     return csMatrix2 (
    00181       m1.m11 - m2.m11, m1.m12 - m2.m12,
    00182       m1.m21 - m2.m21, m1.m22 - m2.m22);
    00183   }
    00184
    00186   inline friend csMatrix2 operator* (const csMatrix2& m1, const csMatrix2& m2)
    00187   {
    00188     return csMatrix2 (
    00189       m1.m11 * m2.m11 + m1.m12 * m2.m21,
    00190       m1.m11 * m2.m12 + m1.m12 * m2.m22,
    00191       m1.m21 * m2.m11 + m1.m22 * m2.m21,
    00192       m1.m21 * m2.m12 + m1.m22 * m2.m22);
    00193   }
    00194
    00196   inline friend csVector2 operator* (const csMatrix2& m, const csVector2& v)
    00197   { return csVector2 (m.m11*v.x + m.m12*v.y, m.m21*v.x + m.m22*v.y); }
    00198
    00200   inline friend csMatrix2 operator* (const csMatrix2& m, float f)
    00201   { return csMatrix2 (m.m11 * f, m.m12 * f, m.m21 * f, m.m22 * f); }
    00202
    00204   inline friend csMatrix2 operator* (float f, const csMatrix2& m)
    00205   { return csMatrix2 (m.m11 * f, m.m12 * f, m.m21 * f, m.m22 * f); }
    00206
    00208   inline friend csMatrix2 operator/ (const csMatrix2& m, float f)
    00209   {
    00210     float inv_f = 1 / f;
    00211     return csMatrix2 (
    00212       m.m11 * inv_f, m.m12 * inv_f,
    00213       m.m21 * inv_f, m.m22 * inv_f);
    00214   }
    00215 };
    00216
    00219 #endif // __CS_MATRIX2_H__
    00220