From 0b7ca65967b494f3739bac5ff084b26ff7c62ad8 Mon Sep 17 00:00:00 2001 From: Abdelrahman Date: Sat, 3 Feb 2024 18:36:58 +0000 Subject: [PATCH] Add unit vector utilities --- include/vector/vec.h | 5 +++++ src/vector/vec.c | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/include/vector/vec.h b/include/vector/vec.h index 658c3b2..d1b08fa 100644 --- a/include/vector/vec.h +++ b/include/vector/vec.h @@ -30,29 +30,34 @@ typedef struct { #define vec_mul(T, v1, v2) vec_mul_##T(v1, v2) #define vec_dot(T, v1, v2) vec_dot_##T(v1, v2) #define vec_magnitude(T, v) vec_magnitude_##T(v) +#define vec_unit(T, v) vec_unit_##T(v) vec2i_t vec_add_vec2i_t(vec2i_t v1, vec2i_t v2); vec2i_t vec_sub_vec2i_t(vec2i_t v1, vec2i_t v2); vec2i_t vec_mul_vec2i_t(vec2i_t v1, vec2i_t v2); i32 vec_dot_vec2i_t(vec2i_t v1, vec2i_t v2); i32 vec_magnitude_vec2i_t(vec2i_t v); +vec2i_t vec_unit_vec2i_t(vec2i_t v); vec2f_t vec_add_vec2f_t(vec2f_t v1, vec2f_t v2); vec2f_t vec_sub_vec2f_t(vec2f_t v1, vec2f_t v2); vec2f_t vec_mul_vec2f_t(vec2f_t v1, vec2f_t v2); f32 vec_dot_vec2f_t(vec2f_t v1, vec2f_t v2); f32 vec_magnitude_vec2f_t(vec2f_t v); +vec2f_t vec_unit_vec2f_t(vec2f_t v); vec3i_t vec_add_vec3i_t(vec3i_t v1, vec3i_t v2); vec3i_t vec_sub_vec3i_t(vec3i_t v1, vec3i_t v2); vec3i_t vec_mul_vec3i_t(vec3i_t v1, vec3i_t v2); i32 vec_dot_vec3i_t(vec3i_t v1, vec3i_t v2); i32 vec_magnitude_vec3i_t(vec3i_t v); +vec3i_t vec_unit_vec3i_t(vec3i_t v); vec3f_t vec_add_vec3f_t(vec3f_t v1, vec3f_t v2); vec3f_t vec_sub_vec3f_t(vec3f_t v1, vec3f_t v2); vec3f_t vec_mul_vec3f_t(vec3f_t v1, vec3f_t v2); f32 vec_dot_vec3f_t(vec3f_t v1, vec3f_t v2); f32 vec_magnitude_vec3f_t(vec3f_t v); +vec3f_t vec_unit_vec3f_t(vec3f_t v); #endif // !VEC_H diff --git a/src/vector/vec.c b/src/vector/vec.c index e9cef13..56096cc 100644 --- a/src/vector/vec.c +++ b/src/vector/vec.c @@ -22,6 +22,11 @@ i32 vec_magnitude_vec2i_t(vec2i_t v) { return (i32)sqrtf((f32)dot_product); } +vec2i_t vec_unit_vec2i_t(vec2i_t v) { + i32 magnitude = vec_magnitude_vec2i_t(v); + return (vec2i_t){v.x / magnitude, v.y / magnitude}; +} + vec2f_t vec_add_vec2f_t(vec2f_t v1, vec2f_t v2) { return (vec2f_t){.x = v1.x + v2.x, .y = v1.y + v2.y}; } @@ -43,6 +48,11 @@ f32 vec_magnitude_vec2f_t(vec2f_t v) { return sqrtf(dot_product); } +vec2f_t vec_unit_vec2f_t(vec2f_t v) { + f32 magnitude = vec_magnitude_vec2f_t(v); + return (vec2f_t){v.x / magnitude, v.y / magnitude}; +} + vec3i_t vec_add_vec3i_t(vec3i_t v1, vec3i_t v2) { return (vec3i_t){.x = v1.x + v2.x, .y = v1.y + v2.y, .z = v1.z + v2.z}; } @@ -64,6 +74,11 @@ i32 vec_magnitude_vec3i_t(vec3i_t v) { return (i32)sqrtf((f32)dot_product); } +vec3i_t vec_unit_vec3i_t(vec3i_t v) { + i32 magnitude = vec_magnitude_vec3i_t(v); + return (vec3i_t){v.x / magnitude, v.y / magnitude, v.z / magnitude}; +} + vec3f_t vec_add_vec3f_t(vec3f_t v1, vec3f_t v2) { return (vec3f_t){.x = v1.x + v2.x, .y = v1.y + v2.y, .z = v1.z + v2.z}; } @@ -84,3 +99,8 @@ f32 vec_magnitude_vec3f_t(vec3f_t v) { f32 dot_product = vec_dot_vec3f_t(v, v); return sqrtf(dot_product); } + +vec3f_t vec_unit_vec3f_t(vec3f_t v) { + f32 magnitude = vec_magnitude_vec3f_t(v); + return (vec3f_t){v.x / magnitude, v.y / magnitude, v.z / magnitude}; +}