summaryrefslogtreecommitdiff
path: root/in_practice/breakout/my_math.c
diff options
context:
space:
mode:
Diffstat (limited to 'in_practice/breakout/my_math.c')
-rw-r--r--in_practice/breakout/my_math.c61
1 files changed, 57 insertions, 4 deletions
diff --git a/in_practice/breakout/my_math.c b/in_practice/breakout/my_math.c
index 5d69b92..ac5606b 100644
--- a/in_practice/breakout/my_math.c
+++ b/in_practice/breakout/my_math.c
@@ -1,6 +1,16 @@
#include "my_math.h"
#include <math.h>
+v2 v2a(f32 x)
+{
+ return (v2){x, x};
+}
+
+v3 v3a(f32 x)
+{
+ return (v3){x, x, x};
+}
+
v2 scale_v2(v2 v, f32 x)
{
return (v2){v.x * x, v.y * x};
@@ -11,14 +21,57 @@ v2 add_v2(v2 a, v2 b)
return (v2){a.x + b.x, a.y + b.y};
}
-v2 v2a(f32 x)
+v2 addf_v2(v2 a, f32 b)
{
- return (v2){x, x};
+ return (v2){a.x + b, a.y + b};
}
-v3 v3a(f32 x)
+v2 sub_v2(v2 a, v2 b)
{
- return (v3){x, x, x};
+ return (v2){a.x - b.x, a.y - b.y};
+}
+
+v2 clamp_v2(v2 v, v2 min, v2 max)
+{
+ f32 x = v.x < min.x ? min.x : v.x > max.x ? max.x : v.x;
+ f32 y = v.y < min.y ? min.y : v.y > max.y ? max.y : v.y;
+ return (v2){x, y};
+}
+
+f32 length_v2(v2 v)
+{
+ return sqrtf(v.x * v.x + v.y * v.y);
+}
+
+f32 dot_v2(v2 a, v2 b)
+{
+ return a.x * b.x + a.y * b.y;
+}
+
+v2 norm_v2(v2 a)
+{
+ f32 len = length_v2(a);
+ return (v2){a.x / len, a.y / len};
+}
+
+direction_enum direction_v2(v2 v)
+{
+ v2 directions[] = {
+ {1.0f, 0.0f},
+ {0.0f, 1.0f},
+ {-1.0f, 0.0f},
+ {0.0f, -1.0f}
+ };
+ f32 max = 0.0f;
+ i32 best = 0;
+ for (i32 i = 0; i < 4; i++) {
+ f32 dot = dot_v2(v, directions[i]);
+ if (dot > max) {
+ max = dot;
+ best = i;
+ }
+ }
+ return best;
}
mat mul_mat(mat l, mat r)