diff --git a/src/charge.c b/src/charge.c index 06f27ec759488d5b80f79afbf9f6836da7ef3b4c..afb93696cb6418bbd906f47381e3be5ef7dbf2f5 100644 --- a/src/charge.c +++ b/src/charge.c @@ -17,10 +17,10 @@ double compute_delta_x(int width, int height) { return 1.0 / sqrt((width * width) + (height * height)); } -bool compute_next_point(charge_t *charges, int num_charges, vector2_t current_pos, double eps, vector2_t *new_pos, double dx) { +bool compute_next_point(charge_t *charges, int num_charges, vector2_t current_pos, double eps, vector2_t *new_pos, double dx, int orientation) { 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)); + *new_pos = vector2_add(current_pos, vector2_multiply(vector2_multiply(electric_field, dx), orientation)); return true; } @@ -66,13 +66,13 @@ bool compute_total_normalized_e(charge_t *charges, int num_charges, vector2_t p, 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) { +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, int orientation) { vector2_t current_pos = pos0; while (true) { vector2_t new_pos; - if (!compute_next_point(charges, num_charges, current_pos, 4.5e-2, &new_pos, dx)) { + if (!compute_next_point(charges, num_charges, current_pos, 4.5e-2, &new_pos, dx, orientation)) { break; } @@ -82,11 +82,16 @@ void draw_field_line(struct gfx_context_t *ctxt, charge_t *charges, int num_char coordinates_t current_coordinates = position_to_coordinates(SCREEN_WIDTH, SCREEN_HEIGHT, x0, x1, y0, y1, current_pos); coordinates_t new_coordinates = position_to_coordinates(SCREEN_WIDTH, SCREEN_HEIGHT, x0, x1, y0, y1, new_pos); - gfx_draw_line(ctxt, current_coordinates, new_coordinates, COLOR_BLUE); + gfx_draw_line(ctxt, current_coordinates, new_coordinates, COLOR_WHITE); current_pos = new_pos; } } +void draw_field_lines(struct gfx_context_t *ctxt, charge_t *charges, int num_charges, double dx, vector2_t pos0, double x0, double x1, double y0, double y1){ + draw_field_line(ctxt, charges, num_charges, dx, pos0, x0, x1, y0, y1, -1); + draw_field_line(ctxt, charges, num_charges, dx, pos0, x0, x1, y0, y1, 1); +} + void draw_charges(struct gfx_context_t *ctxt, charge_t *charges, int num_charges, double x0, double x1, double y0, double y1) { for (int32_t i = 0; i < num_charges; i += 1) { coordinates_t c = position_to_coordinates(SCREEN_WIDTH, SCREEN_HEIGHT, x0, x1, y0, y1, charges[i].pos); diff --git a/src/charge.h b/src/charge.h index 29f02d38e7e766ccf7fd6e855ce8e05d49e9d562..a2a29b7303626b138f30eba6b188d75334c28563 100644 --- a/src/charge.h +++ b/src/charge.h @@ -22,7 +22,7 @@ charge_t charge_create(double q, vector2_t pos); bool compute_e(charge_t c, vector2_t p, double eps, vector2_t *e); bool compute_total_normalized_e(charge_t *charges, int num_charges, vector2_t p, double eps, vector2_t *e); -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); +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, int orientation); void draw_charges(struct gfx_context_t *ctxt, charge_t *charges, int num_charges, double x0, double x1, double y0, double y1); - +void draw_field_lines(struct gfx_context_t *ctxt, charge_t *charges, int num_charges, double dx, vector2_t pos0, double x0, double x1, double y0, double y1); #endif diff --git a/src/main.c b/src/main.c index b0bd3ef066f2da8a4ba0f846f63a72c4b0ff1ca5..e49c01343a9d97a6e7d636ccd9ca6d4d9d30dde1 100644 --- a/src/main.c +++ b/src/main.c @@ -31,7 +31,7 @@ int main(int argc, char *argv[]) { gfx_clear(canvas, COLOR_BLACK); draw_charges(canvas, charges, num_charges, x0, x1, y0, y1); - draw_field_line(canvas, charges, num_charges, dx, vector2_create(.5, .25), x0, x1, y0, y1); + draw_field_lines(canvas, charges, num_charges, dx, vector2_create(.5, .25), x0, x1, y0, y1); gfx_present(canvas); while (true) {