From a3a7dc05ee02bda117dfdd7b61aaa37f9a2d3820 Mon Sep 17 00:00:00 2001
From: ACKERMANNGUE <gawen.ackermann@etu.hesge.ch>
Date: Wed, 13 Apr 2022 10:26:35 +0200
Subject: [PATCH] WIP draw_field_line

---
 src/charge.c | 39 +++++++++++++++++++++++++--------------
 src/charge.h |  2 ++
 src/main.c   |  5 ++++-
 3 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/src/charge.c b/src/charge.c
index a6fcd09..3955f1c 100644
--- a/src/charge.c
+++ b/src/charge.c
@@ -14,19 +14,23 @@ const double THRESHOLD_CHARGES_DISTANCES = 0.5;
 const double EPSILON = 0.05;
 
 double compute_delta_x(int width, int height) {
+    printf("aaa %lf\n", 1.0 / sqrt((width * width) + (height * height)));
     return 1.0 / sqrt((width * width) + (height * height));
 }
 
-bool compute_next_point(charge_t *charges, int num_charges, vector2_t p, double eps, vector2_t *new_point) {
-    if (compute_total_normalized_e(charges, num_charges, p, eps, new_point)) {
-        *new_point = vector2_multiply(*new_point, (vector2_norm(p) + compute_delta_x(SCREEN_WIDTH, SCREEN_HEIGHT)));
+bool compute_next_point(charge_t *charges, int num_charges, vector2_t current_pos, double eps, vector2_t *new_pos, double dx) {
+    vector2_t electric_field;
+    if (!compute_total_normalized_e(charges, num_charges, current_pos, eps, &electric_field)) {
+        *new_pos = vector2_add(current_pos, vector2_multiply(electric_field, dx));
+        printf("adf %lf\n", dx);
         return true;
     }
+
     return false;
 }
 
 bool is_out_of_bounds(vector2_t position, double x0, double x1, double y0, double y1) {
-    return position.x < x0 || position.x > x1 || position.y < y0 || position.y > y0;
+    return position.x < x0 || position.x > x1 || position.y < y0 || position.y > y1;
 }
 
 charge_t charge_create(double q, vector2_t pos) {
@@ -36,7 +40,7 @@ charge_t charge_create(double q, vector2_t pos) {
 
 bool compute_e(charge_t c, vector2_t p, double eps, vector2_t *e) {
     *e = vector2_create_zero();
-    vector2_t r = vector2_substract(c.pos, p);
+    vector2_t r = vector2_substract(p, c.pos);
     double norm_r = vector2_norm(r);
     double E_i = K * (fabs(c.q) / (norm_r * norm_r));
     *e = vector2_multiply(vector2_normalize(r), E_i);
@@ -58,27 +62,34 @@ bool compute_total_normalized_e(charge_t *charges, int num_charges, vector2_t p,
         *e = vector2_add(*e, tmp);
     }
 
+    *e = vector2_normalize(*e);
     return true;
 }
 
 void draw_field_line(struct gfx_context_t *ctxt, charge_t *charges, int num_charges, double dx, vector2_t pos0, double x0, double x1, double y0, double y1) {
     vector2_t current_pos = pos0;
-    vector2_t new_point;
-    coordinates_t current_coordinates = position_to_coordinates(SCREEN_WIDTH, SCREEN_HEIGHT, x0, x1, y0, y1, current_pos);
-    coordinates_t new_coordinates;
 
     while (true) {
-        if (compute_next_point(charges, num_charges, pos0, EPSILON, &new_point)) {
+        vector2_t new_pos;
+
+        if (!compute_next_point(charges, num_charges, current_pos, EPSILON, &new_pos, dx)) {
             break;
         }
-        if (is_out_of_bounds(new_point, x0, x1, y0, y1)) {
+
+        vector2_print(current_pos);
+        vector2_print(new_pos);
+
+        if (is_out_of_bounds(new_pos, x0, x1, y0, y1)) {
             break;
         }
-        current_pos = vector2_add(current_pos, vector2_create(pos0.x + dx * vector2_norm(new_point), pos0.y + dx * vector2_norm(new_point)));
-        current_coordinates = position_to_coordinates(SCREEN_WIDTH, SCREEN_HEIGHT, x0, x1, y0, y1, current_pos);
-        new_coordinates = position_to_coordinates(SCREEN_WIDTH, SCREEN_HEIGHT, x0, x1, y0, y1, new_point);
+
+        coordinates_t current_coordinates = position_to_coordinates(SCREEN_WIDTH, SCREEN_HEIGHT, x0, x1, y0, y1, current_pos);
+        printf("%d %d\n", current_coordinates.row, current_coordinates.column);
+        coordinates_t new_coordinates = position_to_coordinates(SCREEN_WIDTH, SCREEN_HEIGHT, x0, x1, y0, y1, new_pos);
+        printf("%d %d\n", new_coordinates.row, new_coordinates.column);
         gfx_draw_line(ctxt, current_coordinates, new_coordinates, COLOR_BLUE);
-        current_pos = new_point;
+        current_pos = new_pos;
+        break;
     }
 }
 
diff --git a/src/charge.h b/src/charge.h
index 27c02e0..29f02d3 100644
--- a/src/charge.h
+++ b/src/charge.h
@@ -16,6 +16,8 @@ typedef struct _charge_t {
     vector2_t pos;
 } charge_t;
 
+double compute_delta_x(int width, int height);
+
 charge_t charge_create(double q, vector2_t pos);
 
 bool compute_e(charge_t c, vector2_t p, double eps, vector2_t *e);
diff --git a/src/main.c b/src/main.c
index 906291d..abc0d36 100644
--- a/src/main.c
+++ b/src/main.c
@@ -27,9 +27,12 @@ int main(int argc, char *argv[]) {
     charges[0] = charge_create(-ELEMENTARY_CHARGE, vector2_create(.5, .5));
     charges[1] = charge_create(ELEMENTARY_CHARGE, vector2_create(.75, .5));
 
+    double dx = compute_delta_x(SCREEN_WIDTH, SCREEN_HEIGHT);
+
     gfx_clear(canvas, COLOR_BLACK);
     draw_charges(canvas, charges, num_charges, x0, x1, y0, y1);
-    draw_field_line(canvas, charges, num_charges, compute_delta_x(SCREEN_WIDTH, SCREEN_HEIGHT), vector2_create(.5, .2), x0, x1, y0, y1);
+    printf("adadf a %lf\n", dx);
+    draw_field_line(canvas, charges, num_charges, dx, vector2_create(.5, .2), x0, x1, y0, y1);
     gfx_present(canvas);
 
     while (true) {
-- 
GitLab