Matrix3.inl
1 //
3 // SFGE - Simple and Fast Multimedia Library
4 // Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com)
5 //
6 // This software is provided 'as-is', without any express or implied warranty.
7 // In no event will the authors be held liable for any damages arising from the use of this software.
8 //
9 // Permission is granted to anyone to use this software for any purpose,
10 // including commercial applications, and to alter it and redistribute it freely,
11 // subject to the following restrictions:
12 //
13 // 1. The origin of this software must not be misrepresented;
14 // you must not claim that you wrote the original software.
15 // If you use this software in a product, an acknowledgment
16 // in the product documentation would be appreciated but is not required.
17 //
18 // 2. Altered source versions must be plainly marked as such,
19 // and must not be misrepresented as being the original software.
20 //
21 // 3. This notice may not be removed or altered from any source distribution.
22 //
24 
25 
29 inline Matrix3::Matrix3()
30 {
31  myData[0] = 1.f; myData[4] = 0.f; myData[8] = 0.f; myData[12] = 0.f;
32  myData[1] = 0.f; myData[5] = 1.f; myData[9] = 0.f; myData[13] = 0.f;
33  myData[2] = 0.f; myData[6] = 0.f; myData[10] = 1.f; myData[14] = 0.f;
34  myData[3] = 0.f; myData[7] = 0.f; myData[11] = 0.f; myData[15] = 1.f;
35 }
36 
37 
41 inline Matrix3::Matrix3(float a00, float a01, float a02,
42  float a10, float a11, float a12,
43  float a20, float a21, float a22)
44 {
45  myData[0] = a00; myData[4] = a01; myData[8] = 0.f; myData[12] = a02;
46  myData[1] = a10; myData[5] = a11; myData[9] = 0.f; myData[13] = a12;
47  myData[2] = 0.f; myData[6] = 0.f; myData[10] = 1.f; myData[14] = 0.f;
48  myData[3] = a20; myData[7] = a21; myData[11] = 0.f; myData[15] = a22;
49 }
50 
51 
55 inline void Matrix3::SetFromTransformations(const Vector2f& Center, const Vector2f& Translation, float Rotation, const Vector2f& Scale)
56 {
57  float Angle = Rotation * 3.141592654f / 180.f;
58  float Cos = static_cast<float>(cos(Angle));
59  float Sin = static_cast<float>(sin(Angle));
60  float SxCos = Scale.x * Cos;
61  float SyCos = Scale.y * Cos;
62  float SxSin = Scale.x * Sin;
63  float SySin = Scale.y * Sin;
64  float Tx = -Center.x * SxCos - Center.y * SySin + Translation.x;
65  float Ty = Center.x * SxSin - Center.y * SyCos + Translation.y;
66 
67  myData[0] = SxCos; myData[4] = SySin; myData[8] = 0.f; myData[12] = Tx;
68  myData[1] = -SxSin; myData[5] = SyCos; myData[9] = 0.f; myData[13] = Ty;
69  myData[2] = 0.f; myData[6] = 0.f; myData[10] = 1.f; myData[14] = 0.f;
70  myData[3] = 0.f; myData[7] = 0.f; myData[11] = 0.f; myData[15] = 1.f;
71 }
72 
73 
77 inline Vector2f Matrix3::Transform(const Vector2f& Point) const
78 {
79  return Vector2f(myData[0] * Point.x + myData[4] * Point.y + myData[12],
80  myData[1] * Point.x + myData[5] * Point.y + myData[13]);
81 }
82 
83 
87 inline Matrix3 Matrix3::GetInverse() const
88 {
89  // Compute the determinant
90  float Det = myData[0] * (myData[15] * myData[5] - myData[7] * myData[13]) -
91  myData[1] * (myData[15] * myData[4] - myData[7] * myData[12]) +
92  myData[3] * (myData[13] * myData[4] - myData[5] * myData[12]);
93 
94  // Compute the inverse if determinant is not zero
95  if ((Det < -1E-7f) || (Det > 1E-7f))
96  {
97  return Matrix3( (myData[15] * myData[5] - myData[7] * myData[13]) / Det,
98  -(myData[15] * myData[4] - myData[7] * myData[12]) / Det,
99  (myData[13] * myData[4] - myData[5] * myData[12]) / Det,
100  -(myData[15] * myData[1] - myData[3] * myData[13]) / Det,
101  (myData[15] * myData[0] - myData[3] * myData[12]) / Det,
102  -(myData[13] * myData[0] - myData[1] * myData[12]) / Det,
103  (myData[7] * myData[1] - myData[3] * myData[5]) / Det,
104  -(myData[7] * myData[0] - myData[3] * myData[4]) / Det,
105  (myData[5] * myData[0] - myData[1] * myData[4]) / Det);
106  }
107  else
108  {
109  return Identity;
110  }
111 }
112 
113 
118 inline const float* Matrix3::Get4x4Elements() const
119 {
120  return myData;
121 }
122 
123 
127 inline float Matrix3::operator ()(unsigned int Row, unsigned int Col) const
128 {
129  switch (Row + Col * 3)
130  {
131  case 0 : return myData[0];
132  case 1 : return myData[1];
133  case 2 : return myData[3];
134  case 3 : return myData[4];
135  case 4 : return myData[5];
136  case 5 : return myData[7];
137  case 6 : return myData[12];
138  case 7 : return myData[13];
139  case 8 : return myData[15];
140 
141  default : return myData[0];
142  }
143 }
144 inline float& Matrix3::operator ()(unsigned int Row, unsigned int Col)
145 {
146  switch (Row + Col * 3)
147  {
148  case 0 : return myData[0];
149  case 1 : return myData[1];
150  case 2 : return myData[3];
151  case 3 : return myData[4];
152  case 4 : return myData[5];
153  case 5 : return myData[7];
154  case 6 : return myData[12];
155  case 7 : return myData[13];
156  case 8 : return myData[15];
157 
158  default : return myData[0];
159  }
160 }
161 
162 
166 inline Matrix3 Matrix3::operator *(const Matrix3& Mat) const
167 {
168  return Matrix3(myData[0] * Mat.myData[0] + myData[4] * Mat.myData[1] + myData[12] * Mat.myData[3],
169  myData[0] * Mat.myData[4] + myData[4] * Mat.myData[5] + myData[12] * Mat.myData[7],
170  myData[0] * Mat.myData[12] + myData[4] * Mat.myData[13] + myData[12] * Mat.myData[15],
171  myData[1] * Mat.myData[0] + myData[5] * Mat.myData[1] + myData[13] * Mat.myData[3],
172  myData[1] * Mat.myData[4] + myData[5] * Mat.myData[5] + myData[13] * Mat.myData[7],
173  myData[1] * Mat.myData[12] + myData[5] * Mat.myData[13] + myData[13] * Mat.myData[15],
174  myData[3] * Mat.myData[0] + myData[7] * Mat.myData[1] + myData[15] * Mat.myData[3],
175  myData[3] * Mat.myData[4] + myData[7] * Mat.myData[5] + myData[15] * Mat.myData[7],
176  myData[3] * Mat.myData[12] + myData[7] * Mat.myData[13] + myData[15] * Mat.myData[15]);
177 }
178 
179 
183 inline Matrix3& Matrix3::operator *=(const Matrix3& Mat)
184 {
185  return *this = *this * Mat;
186 }
T x
X coordinate of the vector.
Definition: Vector2.hpp:59
Utility class to manipulate 3x3 matrices representing 2D transformations.
Definition: Matrix3.hpp:42
T y
Y coordinate of the vector.
Definition: Vector2.hpp:60