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