Dura2D  v0.1.0
An educational 2D game physics library
Loading...
Searching...
No Matches
d2Math.h
Go to the documentation of this file.
1#ifndef D2MATH_H
2#define D2MATH_H
3
4#include <cmath>
5#include <cfloat>
6
7#include "d2api.h"
8#include "d2Types.h"
9
10#define d2Sqrt(x) sqrtf(x)
11#define d2Atan2(y, x) atan2f(y, x)
12#define d2Abs(x) ((x) > 0.0F ? (x) : -(x))
13
14#define PI 3.14159265359f
15#define TAU 6.28318530718f
16
22{
23 d2Vec2() : x(0.0F), y(0.0F) {}
24
30 d2Vec2(real x, real y) : x(x), y(y) {}
31
32 ~d2Vec2() = default;
33
35 void Zero() { x = 0.0F; y = 0.0F; }
36
41 real Lenght() const { return d2Sqrt(x * x + y * y); }
42
47 real LenghtSquared() const { return x * x + y * y; }
48
54
60 {
61 d2Vec2 result = d2Vec2(0, 0);
62 real length = Lenght();
63 if (length != 0.0F) {
64 result.x = x / length;
65 result.y = y / length;
66 }
67 return result;
68 }
69
74 d2Vec2 Normal() const { return d2Vec2(y, -x).Normalize(); }
75
81 real Dot(const d2Vec2 &v) const { return x * v.x + y * v.y; }
82
88 real Cross(const d2Vec2 &v) const { return x * v.y - y * v.x; }
89
90 // Overloaded operators
92 bool operator==(const d2Vec2 &v) const;
93 bool operator!=(const d2Vec2 &v) const;
94 d2Vec2 operator+(const d2Vec2 &v) const;
95 d2Vec2 operator-(const d2Vec2 &v) const;
96 d2Vec2 operator*(const real n) const;
97 d2Vec2 operator*(const d2Vec2 &v) const;
98 d2Vec2 operator/(const real n) const;
105
106 real x, y; // x and y components of the vector
107};
108
114{
116
121 d2VecN(int N);
122
127 d2VecN(const d2VecN &v);
128
130
132 void Zero();
133
139 real Dot(const d2VecN &v) const;
140
141 // Overloaded operators
143 d2VecN operator+(const d2VecN &v) const;
144 d2VecN operator-(const d2VecN &v) const;
145 d2VecN operator*(const real n) const;
146 const d2VecN &operator+=(const d2VecN &v);
147 const d2VecN &operator-=(const d2VecN &v);
148 const d2VecN &operator*=(const real n);
149 real operator[](const int index) const;
150 real &operator[](const int index);
151
152 int N;
154};
155
161{
163
169 d2MatMN(int M, int N);
170
171 d2MatMN(const d2MatMN &m);
172
174
176 void Zero();
177
183
184 // Overloaded operators
185 const d2MatMN &operator=(const d2MatMN &m); // Assignment operator
186 d2VecN operator*(const d2VecN &v) const; // Matrix-vector multiplication
187 d2MatMN operator*(const d2MatMN &m) const; // Matrix-matrix multiplication
188
195 static d2VecN SolveGaussSeidel(const d2MatMN &A, const d2VecN &b);
196
197 int M;
198 int N;
200};
201
207{
210
213
218 d2Rot() : s(0.0F), c(0.0F) {}
219
224 explicit d2Rot(real angle) : s(sinf(angle)), c(cosf(angle)) {}
225
231 d2Rot(real s, real c) : s(s), c(c) {}
232
237 void Set(real angle)
238 {
239 s = sinf(angle);
240 c = cosf(angle);
241 }
242
245 {
246 s = 0.0F;
247 c = 1.0F;
248 }
249
254 inline real GetAngle() const { return d2Atan2(s, c); }
255
260 inline d2Vec2 GetXAxis() const { return {c, s}; }
261
266 inline d2Vec2 GetYAxis() const { return {-s, c}; }
267
272 void Add(const d2Rot& other)
273 {
274 real temp_s = s * other.c + c * other.s;
275 real temp_c = c * other.c - s * other.s;
276 s = temp_s;
277 c = temp_c;
278 }
279
280 d2Rot operator+(const d2Rot& other) const
281 {
282 d2Rot result = *this;
283 result.Add(other);
284 return result;
285 }
286
287 d2Rot& operator+=(const d2Rot& other)
288 {
289 this->Add(other);
290 return *this;
291 }
292
294 {
295 real aSin = sinf(angle);
296 real aCos = cosf(angle);
297 real temp_s = s * aCos + c * aSin;
298 real temp_c = c * aCos - s * aSin;
299 s = temp_s; c = temp_c;
300 return *this;
301 }
302};
303
309{
312
315
320 d2Transform() : p(0.0F, 0.0F), q() {}
321
327 d2Transform(const d2Vec2& p, const d2Rot& q) : p(p), q(q) {}
328
333 {
334 p.Zero();
335 q.SetIdentity();
336 }
337
343 void Set(const d2Vec2& p, const d2Rot& q)
344 {
345 this->p = p;
346 this->q = q;
347 }
348};
349
350
351template <typename T>
352inline T
353d2Min(T a, T b)
354{
355 return a < b ? a : b;
356}
357
358inline d2Vec2
359d2Min(const d2Vec2& a, const d2Vec2& b)
360{
361 return {d2Min(a.x, b.x), d2Min(a.y, b.y)};
362}
363
364template <typename T>
365inline T d2Max(T a, T b)
366{
367 return a > b ? a : b;
368}
369
370inline d2Vec2
371d2Max(const d2Vec2& a, const d2Vec2& b)
372{
373 return {d2Max(a.x, b.x), d2Max(a.y, b.y)};
374}
375
376template <typename T>
377inline T
378d2Clamp(T value, T lower, T upper)
379{
380 return d2Max(lower, d2Min(value, upper));
381}
382
383// Operators
384inline d2Vec2
386{
387 return {s * v.x, s * v.y};
388}
389
390// Rotate a d2Vec2
391inline d2Vec2
392d2Rotate(const d2Rot& rot, const d2Vec2& v)
393{
394 real x = rot.c * v.x - rot.s * v.y;
395 real y = rot.s * v.x + rot.c * v.y;
396 return {x, y};
397}
398
399#endif //D2MATH_H
d2Vec2 d2Rotate(const d2Rot &rot, const d2Vec2 &v)
Definition d2Math.h:392
d2Vec2 operator*(real s, const d2Vec2 &v)
Definition d2Math.h:385
T d2Min(T a, T b)
Definition d2Math.h:353
#define d2Atan2(y, x)
Definition d2Math.h:11
#define d2Sqrt(x)
Definition d2Math.h:10
T d2Clamp(T value, T lower, T upper)
Definition d2Math.h:378
T d2Max(T a, T b)
Definition d2Math.h:365
float real
Definition d2Types.h:10
#define D2_API
Definition d2api.h:27
Represents an MxN matrix.
Definition d2Math.h:161
d2MatMN(int M, int N)
Constructor that initializes the matrix with given number of rows and columns.
d2MatMN(const d2MatMN &m)
void Zero()
Sets all components of the matrix to zero.
int M
The number of rows in the matrix.
Definition d2Math.h:197
const d2MatMN & operator=(const d2MatMN &m)
int N
The number of columns in the matrix.
Definition d2Math.h:198
static d2VecN SolveGaussSeidel(const d2MatMN &A, const d2VecN &b)
Solves a system of linear equations using the Gauss-Seidel method.
d2MatMN Transpose() const
Transposes the matrix.
d2VecN operator*(const d2VecN &v) const
d2MatMN operator*(const d2MatMN &m) const
d2VecN * rows
The rows of the matrix.
Definition d2Math.h:199
Represents a rotation in 2D space.
Definition d2Math.h:207
d2Rot()
Default constructor.
Definition d2Math.h:218
real c
The cosine of the rotation angle.
Definition d2Math.h:212
d2Rot(real angle)
Constructor that initializes the rotation with given angle in radians.
Definition d2Math.h:224
void Add(const d2Rot &other)
Adds the rotation of another d2Rot object to this object.
Definition d2Math.h:272
d2Rot & operator+=(const d2Rot &other)
Definition d2Math.h:287
real s
The sine of the rotation angle.
Definition d2Math.h:209
void Set(real angle)
Set the rotation angle from a given angle in radians.
Definition d2Math.h:237
d2Vec2 GetXAxis() const
Get the x-axis of the rotation.
Definition d2Math.h:260
d2Rot operator+(const d2Rot &other) const
Definition d2Math.h:280
d2Rot & operator+=(real angle)
Definition d2Math.h:293
d2Vec2 GetYAxis() const
Get the y-axis of the rotation.
Definition d2Math.h:266
void SetIdentity()
Set the rotation angle as identity.
Definition d2Math.h:244
real GetAngle() const
Get the rotation angle in radians.
Definition d2Math.h:254
d2Rot(real s, real c)
Constructor that initializes the rotation with given sine and cosine values.
Definition d2Math.h:231
Represents a transformation in 2D space.
Definition d2Math.h:309
d2Vec2 p
The translation of the body.
Definition d2Math.h:311
void Set(const d2Vec2 &p, const d2Rot &q)
Set the transformation with given translation and rotation.
Definition d2Math.h:343
d2Rot q
The rotation of the body.
Definition d2Math.h:314
d2Transform()
Default constructor.
Definition d2Math.h:320
void SetIdentity()
Set the transformation as identity.
Definition d2Math.h:332
d2Transform(const d2Vec2 &p, const d2Rot &q)
Constructor that initializes the transformation with given translation and rotation.
Definition d2Math.h:327
Represents a 2D vector.
Definition d2Math.h:22
d2Vec2 & operator*=(const real n)
real Dot(const d2Vec2 &v) const
Calculates the dot product with another vector.
Definition d2Math.h:81
real y
Definition d2Math.h:106
d2Vec2 operator*(const real n) const
d2Vec2 & operator-=(const d2Vec2 &v)
bool operator!=(const d2Vec2 &v) const
d2Vec2 operator*(const d2Vec2 &v) const
d2Vec2 operator/(const real n) const
~d2Vec2()=default
d2Vec2(real x, real y)
Constructor that initializes the vector with given x and y components.
Definition d2Math.h:30
d2Vec2 operator-(const d2Vec2 &v) const
d2Vec2()
Definition d2Math.h:23
d2Vec2 & operator*=(const d2Vec2 &v)
d2Vec2 & Normalize()
Normalizes the vector.
real Lenght() const
Calculates the magnitude of the vector.
Definition d2Math.h:41
d2Vec2 operator-()
d2Vec2 & operator+=(const d2Vec2 &v)
d2Vec2 UnitVector() const
Calculates the unit vector.
Definition d2Math.h:59
void Zero()
Sets all components of the vector to zero.
Definition d2Math.h:35
real LenghtSquared() const
Calculates the squared magnitude of the vector.
Definition d2Math.h:47
d2Vec2 operator+(const d2Vec2 &v) const
real Cross(const d2Vec2 &v) const
Calculates the cross product with another vector.
Definition d2Math.h:88
d2Vec2 & operator/=(const real n)
real x
Definition d2Math.h:106
bool operator==(const d2Vec2 &v) const
d2Vec2 Normal() const
Calculates the normal of the vector.
Definition d2Math.h:74
d2Vec2 & operator=(const d2Vec2 &v)
Represents an N-dimensional vector.
Definition d2Math.h:114
real & operator[](const int index)
real operator[](const int index) const
real * data
The data of the vector.
Definition d2Math.h:153
d2VecN operator-(const d2VecN &v) const
d2VecN operator*(const real n) const
void Zero()
Sets all components of the vector to zero.
const d2VecN & operator+=(const d2VecN &v)
const d2VecN & operator-=(const d2VecN &v)
d2VecN(const d2VecN &v)
Copy constructor.
d2VecN operator+(const d2VecN &v) const
int N
The dimension of the vector.
Definition d2Math.h:152
d2VecN & operator=(const d2VecN &v)
real Dot(const d2VecN &v) const
Calculates the dot product with another vector.
const d2VecN & operator*=(const real n)
d2VecN(int N)
Constructor that initializes the vector with given dimension.