diff options
Diffstat (limited to 'in_practice/breakout/my_math.c')
-rw-r--r-- | in_practice/breakout/my_math.c | 61 |
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) |