From a881dd4ab6f72cbd1ebca4fcd2dbec5ba282c667 Mon Sep 17 00:00:00 2001
From: JM <crewgan@pop-os.localdomain>
Date: Sun, 15 May 2022 21:19:34 +0200
Subject: [PATCH] Creation fonctions pour draw_field_line

---
 src/field.c | 64 +++++++++++++++++++++++++----------------------------
 1 file changed, 30 insertions(+), 34 deletions(-)

diff --git a/src/field.c b/src/field.c
index 89a3483..2a757d8 100644
--- a/src/field.c
+++ b/src/field.c
@@ -50,6 +50,31 @@ bool is_in_screen(coordinates_t pos){
 	return true;
 }
 
+bool draw_field_line_point(struct gfx_context_t *ctxt, charge_t *charges, int num_charges, double x0, double x1, double y0, double y1, vec2 pos, vec2 *pos_next, double delta){
+	vec2 e;
+	compute_total_normalized_e(charges, num_charges, pos, 0.01, &e);
+	double norm_e = vec2_norm(e);
+
+	pos_next->x = pos.x + delta * (e.x / norm_e);
+	pos_next->y = pos.y + delta * (e.y / norm_e);
+	coordinates_t coordinate_pos = position_to_coordinates(WID, HEI, x0, x1, y0, y1, pos);
+	coordinates_t coordinate_pos_next = position_to_coordinates(WID, HEI, x0, x1, y0, y1, *pos_next);
+
+	gfx_draw_line(ctxt, coordinate_pos, coordinate_pos_next, COLOR_YELLOW);
+
+	return !is_in_screen(coordinate_pos);
+}
+
+bool line_reach_charge(vec2 pos, charge_t * charges, double num_charges, double dx){
+	for (int j = 0; j < num_charges; j++){
+		if(vec2_norm(vec2_sub(pos, charges[j].pos)) < dx / HEI){
+			return true;
+		}
+	}
+	return false;
+}
+
+
 // Compute and then draw all the points belonging to a field line,
 // starting from pos0.
 // Returns false if pos0 is not a valid position
@@ -57,56 +82,27 @@ bool is_in_screen(coordinates_t pos){
 static bool draw_field_line(struct gfx_context_t *ctxt, charge_t *charges, int num_charges, double dx, vec2 pos0, double x0, double x1, double y0, double y1) {
 	vec2 pos = vec2_create(pos0.x, pos0.y);
 	vec2 pos_next;
-	vec2 e;
 	bool stop = false;
 	double delta = compute_delta_x() * 5;
-	int max_for = 300; 
+	int max_for = 50; 
 	for (int i = 0; i < max_for && !stop; i++)
 	{
-		for (int j = 0; j < num_charges && !stop; j++){
-			if(vec2_norm(vec2_sub(pos, charges[j].pos)) < dx / HEI){
-				stop = true;
-			}
-		}
+		stop = line_reach_charge(pos, charges, num_charges, dx);
 
 		if(!stop){
-			compute_total_normalized_e(charges, num_charges, pos, 0.01, &e);
-			double norm_e = vec2_norm(e);
-			pos_next.x = pos.x + delta * (e.x / norm_e);
-			pos_next.y = pos.y + delta * (e.y / norm_e);
-
-			coordinates_t coordinate_pos = position_to_coordinates(WID, HEI, x0, x1, y0, y1, pos);
-			coordinates_t coordinate_pos_next = position_to_coordinates(WID, HEI, x0, x1, y0, y1, pos_next);
-
-			gfx_draw_line(ctxt, coordinate_pos, coordinate_pos_next, COLOR_YELLOW);
+			stop = draw_field_line_point(ctxt, charges, num_charges, x0, x1, y0, y1, pos, &pos_next, -delta);
 			pos = pos_next;
-			if(!is_in_screen(coordinate_pos))
-				stop = false;
 		}
 	}
 	pos = vec2_create(pos0.x, pos0.y);
 	stop = false;
 	for (int i = 0; i < max_for && !stop; i++)
 	{
-		for (int j = 0; j < num_charges && !stop; j++){
-			if(vec2_norm(vec2_sub(pos, charges[j].pos)) < dx / HEI){
-				stop = true;
-			}
-		}
+		stop = line_reach_charge(pos, charges, num_charges, dx);
 
 		if(!stop){
-			compute_total_normalized_e(charges, num_charges, pos, 0.01, &e);
-			double norm_e = vec2_norm(e);
-			pos_next.x = pos.x - delta * (e.x / norm_e);
-			pos_next.y = pos.y - delta * (e.y / norm_e);
-
-			coordinates_t coordinate_pos = position_to_coordinates(WID, HEI, x0, x1, y0, y1, pos);
-			coordinates_t coordinate_pos_next = position_to_coordinates(WID, HEI, x0, x1, y0, y1, pos_next);
-
-			gfx_draw_line(ctxt, coordinate_pos, coordinate_pos_next, COLOR_YELLOW);
+			stop = draw_field_line_point(ctxt, charges, num_charges, x0, x1, y0, y1, pos, &pos_next, delta);
 			pos = pos_next;
-			if(!is_in_screen(coordinate_pos))
-				stop = false;
 		}
 	}
 
-- 
GitLab