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