29 inline Matrix3::Matrix3()
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;
41 inline Matrix3::Matrix3(
float a00,
float a01,
float a02,
42 float a10,
float a11,
float a12,
43 float a20,
float a21,
float a22)
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;
55 inline void Matrix3::SetFromTransformations(
const Vector2f& Center,
const Vector2f& Translation,
float Rotation,
const Vector2f& Scale)
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;
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;
79 return Vector2f(myData[0] * Point.
x + myData[4] * Point.
y + myData[12],
80 myData[1] * Point.
x + myData[5] * Point.
y + myData[13]);
87 inline Matrix3 Matrix3::GetInverse()
const
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]);
95 if ((Det < -1E-7f) || (Det > 1E-7f))
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);
118 inline const float* Matrix3::Get4x4Elements()
const
127 inline float Matrix3::operator ()(
unsigned int Row,
unsigned int Col)
const
129 switch (Row + Col * 3)
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];
141 default :
return myData[0];
144 inline float& Matrix3::operator ()(
unsigned int Row,
unsigned int Col)
146 switch (Row + Col * 3)
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];
158 default :
return myData[0];
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]);
185 return *
this = *
this * Mat;
T x
X coordinate of the vector.
Utility class to manipulate 3x3 matrices representing 2D transformations.
T y
Y coordinate of the vector.