From 4416c8530246eddacfff658c76008851b6843ef4 Mon Sep 17 00:00:00 2001
From: Orestis Malaspinas <orestis.malaspinas@hesge.ch>
Date: Mon, 24 Aug 2020 16:47:30 +0200
Subject: [PATCH] added normalize

---
 travail_pratique/vec2/tests/vec2_tests.c | 25 ++++++++++++++++++++++++
 travail_pratique/vec2/vec2.c             |  6 ++++++
 travail_pratique/vec2/vec2.h             |  2 ++
 3 files changed, 33 insertions(+)

diff --git a/travail_pratique/vec2/tests/vec2_tests.c b/travail_pratique/vec2/tests/vec2_tests.c
index b520144..12c9fa5 100644
--- a/travail_pratique/vec2/tests/vec2_tests.c
+++ b/travail_pratique/vec2/tests/vec2_tests.c
@@ -124,6 +124,30 @@ MU_TEST(test_vec2_norm) {
     );
 }
 
+MU_TEST(test_vec2_normalize) {
+    mu_assert(
+        vec2_is_approx_equal(vec2_normalize(e_x), e_x, MINUNIT_EPSILON),
+        "||e_x||=1 => normalize(e_x)=e_x"
+    );
+
+    mu_assert(
+        vec2_is_approx_equal(vec2_normalize(e_y), e_y, MINUNIT_EPSILON),
+        "||e_y||=1 => normalize(e_y)=e_y"
+    );
+
+    mu_assert(
+        vec2_is_approx_equal(
+            vec2_normalize(four_two), 
+            vec2_mul(1.0 / sqrt(20.0), four_two), MINUNIT_EPSILON),
+        "||v|| = ||(4, 2)|| = sqrt(20) => normalize(v) = 1/sqrt(20) * (4, 2)"
+    );
+
+    mu_assert_double_eq(
+        vec2_norm(vec2_normalize(four_two)), 
+        1.0
+    );
+}
+
 MU_TEST_SUITE(test_suite) {
 	MU_SUITE_CONFIGURE(&test_setup, &test_teardown);
 
@@ -134,6 +158,7 @@ MU_TEST_SUITE(test_suite) {
 	MU_RUN_TEST(test_vec2_mul);
 	MU_RUN_TEST(test_vec2_dot);
 	MU_RUN_TEST(test_vec2_norm);
+	MU_RUN_TEST(test_vec2_normalize);
 }
 
 int main() {
diff --git a/travail_pratique/vec2/vec2.c b/travail_pratique/vec2/vec2.c
index 4946724..62272c3 100644
--- a/travail_pratique/vec2/vec2.c
+++ b/travail_pratique/vec2/vec2.c
@@ -40,6 +40,12 @@ double vec2_norm(vec2 v) {
     return sqrt(vec2_norm_sqr(v));
 }
 
+vec2 vec2_normalize(vec2 v) {
+    double norm = vec2_norm(v);
+
+    return vec2_mul(1.0 / norm, v);
+}
+
 bool vec2_is_approx_equal(vec2 lhs, vec2 rhs, double eps) {
     return vec2_norm(vec2_sub(lhs, rhs)) < eps;
 }
diff --git a/travail_pratique/vec2/vec2.h b/travail_pratique/vec2/vec2.h
index f085f07..402824d 100644
--- a/travail_pratique/vec2/vec2.h
+++ b/travail_pratique/vec2/vec2.h
@@ -21,6 +21,8 @@ double vec2_norm_sqr(vec2 v);
 
 double vec2_norm(vec2 v);
 
+vec2 vec2_normalize(vec2 v);
+
 bool vec2_is_approx_equal(vec2 lhs, vec2 rhs, double eps);
 
 void vec2_print(vec2 v);
-- 
GitLab