EHS
Loading...
Searching...
No Matches
Mat2.h
Go to the documentation of this file.
1#pragma once
2
3#include "EHS.h"
4#include "Vec2.h"
5
6namespace ehs
7{
8 template<typename T = float>
9 class Mat2
10 {
11 private:
12 T data[4];
13
14 public:
16 {
17 for (UInt_8 i = 0; i < 4; ++i)
18 data[i] = 0;
19 }
20
21 template<typename C>
22 Mat2(const Mat2<C>& mat)
23 {
24 for (UInt_8 i = 0; i < 4; ++i)
25 data[i] = mat.data[i];
26 }
27
28 template<typename C>
30 {
31 if (this == &mat)
32 return *this;
33
34 for (UInt_8 i = 0; i < 4; ++i)
35 data[i] = mat.data[i];
36
37 return *this;
38 }
39
40 operator const T*() const
41 {
42 return data;
43 }
44
45 operator T*()
46 {
47 return data;
48 }
49
51 {
52 Vec2<T> result;
53 result.x = vec.x * data[0] + vec.y * data[2];
54 result.y = vec.x * data[1] + vec.y * data[3];
55
56 return result;
57 }
58
59 Mat2<T>& operator*=(const T scalar)
60 {
61 for (UInt_8 i = 0; i < 4; ++i)
62 data[i] *= scalar;
63
64 return *this;
65 }
66
67 Mat2<T> operator*(const T scalar) const
68 {
69 Mat2<T> result;
70 for (UInt_8 i = 0; i < 4; ++i)
71 result.data[i] = data[i] * scalar;
72
73 return result;
74 }
75
77 {
78 Mat2<T> old = *this;
79 for (UInt_8 i = 0; i < 4; ++i)
80 {
81 UInt_8 row = i / 2;
82 UInt_8 column = i % 2;
83 data[i] = 0;
84 data[i] += old.data[0 * 2 + column] * mat.data[row * 2 + 0];
85 data[i] += old.data[1 * 2 + column] * mat.data[row * 2 + 1];
86 }
87
88 return *this;
89 }
90
91 Mat2<T> operator*(const Mat2<T>& mat) const
92 {
93 Mat2<T> result;
94 for (UInt_8 i = 0; i < 4; ++i)
95 {
96 UInt_8 row = i / 2;
97 UInt_8 column = i % 2;
98 result.data[i] += data[0 * 2 + column] * mat.data[row * 2 + 0];
99 result.data[i] += data[1 * 2 + column] * mat.data[row * 2 + 1];
100 }
101
102 return result;
103 }
104
106 {
107 Mat2<T> result;
108 for (UInt_8 i = 0; i < 4; ++i)
109 result.data[i] = data[2 * (i % 2) + i / 2];
110
111 return result;
112 }
113
115 {
116 Mat2<T> old = *this;
117 for (UInt_8 i = 0; i < 4; ++i)
118 data[i] = old.data[2 * (i % 2) + i / 2];
119 }
120
122 {
123 Mat2<T> result;
124 result.data[0] = data[3];
125 result.data[1] = data[2];
126 result.data[2] = data[1];
127 result.data[3] = data[0];
128 return result;
129 }
130
131 void Minor()
132 {
133 Mat2<T> old = *this;
134 data[0] = old.data[3];
135 data[1] = old.data[2];
136 data[2] = old.data[1];
137 data[3] = old.data[0];
138 }
139
141 {
142 return data[0] * data[3] - data[1] * data[2];
143 }
144
146 {
147 Mat2<T> minor = GetMinor();
148 Mat2<T> result;
149
150 for (UInt_8 r = 0; r < 2; ++r)
151 {
152 for (UInt_8 c = 0; c < 2; ++c)
153 {
154 UInt_8 i = 2 * c + r;
155 result.data[i] = minor.data[i] * Math::Pow<T>(-1, r + c);
156 }
157 }
158
159 return result;
160 }
161
162 void Cofactor()
163 {
164 Mat2<T> minor = GetMinor();
165
166 for (UInt_8 r = 0; r < 2; ++r)
167 {
168 for (UInt_8 c = 0; c < 2; ++c)
169 {
170 UInt_8 i = 2 * c + r;
171 data[i] = minor.data[i] * Math::Pow<T>(-1, r + c);
172 }
173 }
174 }
175
177 {
178 return GetCofactor().GetTranspose();
179 }
180
181 void Adjugate()
182 {
183 Cofactor();
184 Transpose();
185 }
186
188 {
189 T det = GetDeterminant();
190 if (Math::ComCmp(det, 0))
191 return {};
192
193 return GetAdjugate() * (1 / det);
194 }
195
196 void Inverse()
197 {
198 T det = GetDeterminant();
199 if (Math::ComCmp(det, 0))
200 return;
201
202 Adjugate();
203 operator*=(1 / det);
204 }
205
207 {
208 Mat2<T> result;
209 result[0] = 1;
210 result[3] = 1;
211 return result;
212 }
213 };
214
215 template class EHS_LIB_IO Mat2<float>;
216 template class EHS_LIB_IO Mat2<double>;
217
220}
Definition Mat2.h:10
void Cofactor()
Definition Mat2.h:162
Mat2< T > & operator*=(const T scalar)
Definition Mat2.h:59
void Inverse()
Definition Mat2.h:196
Mat2(const Mat2< C > &mat)
Definition Mat2.h:22
T GetDeterminant() const
Definition Mat2.h:140
Mat2< T > operator*(const Mat2< T > &mat) const
Definition Mat2.h:91
Mat2()
Definition Mat2.h:15
void Transpose()
Definition Mat2.h:114
Mat2< T > & operator*=(const Mat2< T > &mat)
Definition Mat2.h:76
Mat2< T > GetCofactor() const
Definition Mat2.h:145
static Mat2< T > Identity()
Definition Mat2.h:206
void Minor()
Definition Mat2.h:131
Mat2< T > & operator=(const Mat2< C > &mat)
Definition Mat2.h:29
Mat2< T > GetTranspose() const
Definition Mat2.h:105
void Adjugate()
Definition Mat2.h:181
Mat2< T > operator*(const T scalar) const
Definition Mat2.h:67
Mat2< T > GetInverse() const
Definition Mat2.h:187
Mat2< T > GetMinor() const
Definition Mat2.h:121
Mat2< T > GetAdjugate() const
Definition Mat2.h:176
Vec2< T > operator*(Vec2< T > vec) const
Definition Mat2.h:50
static T Pow(const T base, const I exponent)
Definition Math.h:173
static bool ComCmp(float a, float b)
Combined absolute and relative tolerance comparison for single precision floats.
Definition Math.cpp:26
Definition Vec2.h:13
T y
Definition Vec2.h:16
T x
Definition Vec2.h:15
Definition Anchor.h:6
Mat2< float > Mat2_f
Definition Mat2.h:218
unsigned char UInt_8
Definition Types.h:43
Mat2< double > Mat2_d
Definition Mat2.h:219