From 7a28cc81358693688362174a58c624391b8b7b7d Mon Sep 17 00:00:00 2001
From: Boris Stefanovic <owldev@bluewin.ch>
Date: Mon, 6 Dec 2021 11:07:41 +0100
Subject: [PATCH] ADD: import vec2 implementation

---
 vec2/vec2.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 105 insertions(+), 1 deletion(-)

diff --git a/vec2/vec2.c b/vec2/vec2.c
index 4a58ad8..7370f51 100644
--- a/vec2/vec2.c
+++ b/vec2/vec2.c
@@ -1 +1,105 @@
-// TODO : Replace this file by your vec2.c from last tp.
+#include "vec2.h"
+#include <math.h>
+#include <stdio.h>
+
+/// Create a 2d vector.
+/// @param x_ The first component.
+/// @param y_ The second component.
+/// @return The newly created vector.
+vec2 vec2_create(double x_, double y_) {
+	return (vec2){ .x = x_ , .y = y_ };
+}
+
+/// Create a zero 2d vector.
+/// @return The newly created zero vector.
+vec2 vec2_create_zero() {
+	return vec2_create(0.0, 0.0);
+}
+
+/// Add two vectors.
+/// @param lhs The left operand.
+/// @param rhs The right operand.
+/// @return The sum in a new vector.
+vec2 vec2_add(vec2 lhs, vec2 rhs) {
+	return (vec2){ .x = lhs.x + rhs.x , .y = lhs.y + rhs.y };
+}
+
+/// Substract two vectors.
+/// @param lhs The left operand.
+/// @param rhs The right operand.
+/// @return The difference in a new vector.
+vec2 vec2_sub(vec2 lhs, vec2 rhs) {
+	return (vec2){ .x = lhs.x - rhs.x , .y = lhs.y - rhs.y };
+}
+
+/// Multiply a vector by a scalar.
+/// @param scalar The left operand, a scalar.
+/// @param rhs The right operand, a vector.
+/// @return The product in a new vector.
+vec2 vec2_mul(double scalar, vec2 rhs) {
+	return (vec2){ .x = scalar * rhs.x , .y = scalar * rhs.y };
+}
+
+/// Compute the dot product (scalar product) between two vectors.
+/// @param lhs The left operand.
+/// @param rhs The right operand.
+/// @return The dot product.
+double vec2_dot(vec2 lhs, vec2 rhs) {
+	return lhs.x * rhs.x + lhs.y * rhs.y;
+}
+
+/// Compute the square of the euclidean norm of a given vector.
+/// @param v The vector.
+/// @return The square of the norm.
+double vec2_norm_sqr(vec2 v) {
+	return v.x * v.x + v.y * v.y;
+}
+
+/// Compute the euclidean norm of a given vector.
+/// @param v The vector.
+/// @return The norm.
+double vec2_norm(vec2 v) {
+	return sqrt(vec2_norm_sqr(v));
+}
+
+/// Compute the normalization of a given vector.
+/// @param v The vector.
+/// @return The new normalized vector.
+vec2 vec2_normalize(vec2 v) {
+	double norm = vec2_norm(v);
+	return (vec2){ .x = v.x / norm , .y = v.y / norm };
+}
+
+/// Check whether two vectors are approximately equals within a given tolerance.
+/// @param lhs The left operand.
+/// @param rhs The right operand.
+/// @param eps The tolerance.
+/// @return Approx equality with range eps.
+bool vec2_is_approx_equal(vec2 lhs, vec2 rhs, double eps) {
+	//return (fabs(lhs.x - rhs.x) < eps) && (fabs(lhs.y - rhs.y) < eps);
+	vec2 dif = vec2_sub(lhs, rhs);
+	double norm = vec2_norm(dif);
+	return norm < eps;
+}
+
+/// Compute the coordinates of a 2d vector (with components between 0 and 1)
+/// in a given screen matrix.
+/// @param v The 2d vector.
+/// @param width The screen width.
+/// @param height The screen height.
+/// @return The coordinates (rwo, column).
+coordinates vec2_to_coordinates(vec2 v, uint32_t width, uint32_t height) {
+	// tests used to fail because this produces more accurate results
+	// than those expected by the test, please check
+	return (coordinates){
+		.column = (uint32_t)(v.x * width) ,
+		.row    = (uint32_t)(v.y * height)
+	};
+}
+
+/// Print a vector in the standard output.
+/// @param v The vector.
+void vec2_print(vec2 v)
+{
+    printf("x = %g, y = %g\n", v.x, v.y);
+}
-- 
GitLab