diff --git a/doc/rapport.md b/doc/rapport.md index b69c8bd9ae2ca1ab9cf5bae502f7f6f68e03f5e6..b9528bbb14098ffd93b43fe5dfd7a404eed4f2c2 100644 --- a/doc/rapport.md +++ b/doc/rapport.md @@ -250,4 +250,4 @@ Au cours de ce projet, nous avons pu observer la "forme" du champ électrique da Le fonctionnement du programme correspond à la théorie fournie et satisfait donc son but principal étant de permettre la visualisation des champs électriques. Il a été difficile dans le temps imparti de réaliser le programme ainsi que des tests, mais nous avons tout de même réussi à réaliser le travail, ainsi que des tests des fonctions les plus utilisées. -Afin d'améliorer le projet, la première étape serait d'y ajouter les tests unitaires manquants. Pour aller plus loin, il serait envisageable de le réaliser de manière dynamique. Cela demanderait un gros travail d'optimisation, pour obtenir suffisamment de frame par seconde ainsi que l'ajout de déplacement des charges. Ajouter des intéractions serait ludique et permettrait de comprendre plus facilement les lignes de champ. Ce serait faisable en laissant l'utilisateur ajouter des lignes de champ manuellement ou en modifiant en direct les charges. \ No newline at end of file +Afin d'améliorer le projet, la première étape serait d'y ajouter les tests unitaires manquants. Pour aller plus loin, il serait envisageable de le réaliser de manière dynamique. Cela demanderait un gros travail d'optimisation, pour obtenir suffisamment de frame par seconde ainsi que l'ajout de déplacement des charges. Ajouter des intéractions serait ludique et permettrait de comprendre plus facilement les lignes de champ. Ce serait faisable en laissant l'utilisateur ajouter des lignes de champ manuellement ou en modifiant en direct les charges. diff --git a/src/draw.c b/src/draw.c index 491f09aef908803131e14cd0d26615a555f89898..87e9d79ae88f448b7b217f96bab7de449662c668 100644 --- a/src/draw.c +++ b/src/draw.c @@ -1,3 +1,10 @@ +/** + * @file draw.c + * @author Boris Stefanovic, Joey Martig + * @brief Contient les méthodes d'affichage de lignes et de cercles. + * @date 23.05.2022 + */ + #include <stdbool.h> #include "../utils/gfx/gfx.h" #include "../utils/utils.h" diff --git a/src/draw.h b/src/draw.h index af39d211b52d600537bfc2d65c33c772b4d257c2..27843e4df751a05ef8dc2d188130862578b46338 100644 --- a/src/draw.h +++ b/src/draw.h @@ -1,3 +1,9 @@ +/** + * @file draw.h + * @author Boris Stefanovic, Joey Martig + * @date 23.05.2022 + */ + #ifndef DRAW_H #define DRAW_H diff --git a/src/draw_tests.c b/src/draw_tests.c index 4eba0e1356e801c294ba359993e4c4c4777e40bd..242bfb1804d819c5612af2e0fe5114147dde62d6 100644 --- a/src/draw_tests.c +++ b/src/draw_tests.c @@ -1,3 +1,10 @@ +/** + * @file draw_tests.c + * @author Boris Stefanovic, Joey Martig + * @brief Test des méthodes d'affichages de lignes et de cercles. + * @date 23.05.2022 + */ + #include <stdlib.h> #include "draw.h" @@ -52,5 +59,6 @@ int main() { gfx_present(ctxt); } + gfx_destroy(ctxt); return EXIT_SUCCESS; } diff --git a/src/field.c b/src/field.c index 95f80f08c84b4f4223d977ed7ba0267ce719b18d..62155afa7dc26c540d9e2246e6d48ba94805eb49 100644 --- a/src/field.c +++ b/src/field.c @@ -1,3 +1,10 @@ +/** + * @file field.c + * @author Boris Stefanovic, Joey Martig + * @brief Contient les fonctions de claculs physiques et d'affichage des charges et lignes de champ. + * @date 23.05.2022 + */ + #include <stdbool.h> #include "draw.h" #include "field.h" @@ -6,7 +13,6 @@ #define SIGN_SIZE 10 #define CHARGE_R 25 - bool compute_e(charge_t c, vec2 p, double eps, vec2 *e) { vec2 relative_position = vec2_sub(p, c.pos); if (vec2_norm(relative_position) < eps) return false; @@ -33,10 +39,22 @@ double compute_delta_x() { return 1 / result; } +// Vérifie si la position se trouve sur l'écran (entre 0 et HEI-1 ou WID-1) bool is_in_screen(coordinates_t pos) { return pos.column < WID && pos.row < HEI; } +// Si la valeur sort de l'écran, force sa position à la limite la plus proche (-10 -> 0) +void force_in_screen(coordinates_t *pos){ + if (!is_in_screen(*pos)){ + pos->column = (int)pos->column <= 0 ? 0 : pos->column; + pos->column = (int)pos->column >= WID ? WID-1 : pos->column; + + pos->row = (int)pos->row <= 0 ? 0 : pos->row; + pos->row = (int)pos->row >= HEI ? HEI-1 : pos->row; + } +} + 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); @@ -66,7 +84,6 @@ bool line_reach_charge(vec2 pos, charge_t *charges, int num_charges, double dx) 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 @@ -78,7 +95,7 @@ static bool draw_field_line(struct gfx_context_t *ctxt, charge_t *charges, int n vec2 pos_next_negative; bool stop_positive = false; bool stop_negative = false; - // * 5 à supprimer lorsque le code est optimisé + double delta = compute_delta_x(); int max_for = 100000; for (int i = 0; i < max_for && (!stop_positive || !stop_negative); i++) { @@ -99,7 +116,6 @@ static bool draw_field_line(struct gfx_context_t *ctxt, charge_t *charges, int n return !stop_positive || !stop_negative; } - /// Draw all the charges /// A circle with minus sign for negative charges /// A circle with a plus sign for positive charges @@ -107,7 +123,6 @@ static void draw_charges(struct gfx_context_t *context, charge_t *charges, int n for (int i = 0; i < num_charges; ++i) { coordinates_t charge_center = position_to_coordinates(WID, HEI, x0, x1, y0, y1, charges[i].pos); gfx_draw_circle(context, charge_center, CHARGE_R, COLOR_WHITE); - coordinates_t sign_src = charge_center; coordinates_t sign_dst = charge_center; uint32_t sign_color = COLOR_RED; @@ -119,9 +134,12 @@ static void draw_charges(struct gfx_context_t *context, charge_t *charges, int n sign_src.row = charge_center.row; sign_dst.row = charge_center.row; } - sign_src.column -= SIGN_SIZE; sign_dst.column += SIGN_SIZE; + + force_in_screen(&sign_src); + force_in_screen(&sign_dst); + gfx_draw_line(context, sign_src, sign_dst, sign_color); } } diff --git a/src/field.h b/src/field.h index 4fb8f804599c14198ce51f0280a013e53e3d6956..223242f49f49ff3974d98fa7793362779bc2e03e 100644 --- a/src/field.h +++ b/src/field.h @@ -1,3 +1,9 @@ +/** + * @file field.h + * @author Boris Stefanovic, Joey Martig + * @date 23.05.2022 + */ + #ifndef _PHYSIQUE_H_ #define _PHYSIQUE_H_ @@ -28,6 +34,7 @@ bool line_reach_charge(vec2 pos, charge_t *charges, int num_charges, double dx); bool is_in_screen(coordinates_t pos); +void force_in_screen(coordinates_t *pos); void draw_everything( struct gfx_context_t *ctxt, diff --git a/src/field_tests.c b/src/field_tests.c index 80281a1a35c02ea753efd6fd50aab4a49d355640..a7b5dae350902313faf40a564f75c2e3862d0391 100644 --- a/src/field_tests.c +++ b/src/field_tests.c @@ -1,3 +1,10 @@ +/** + * @file field_tests.c + * @author Boris Stefanovic, Joey Martig + * @brief Test unitaires des méthodes field.h + * @date 23.05.2022 + */ + #include <stdlib.h> #include <stdio.h> #include <math.h> @@ -153,7 +160,7 @@ test_result t_is_in_screen_0() coordinates_create(WID / 2, HEI + 10), coordinates_create(WID + 10, HEI + 10) }; - bool results[] = {true, true, true, true, false, false, false, false, false, false}; + bool results[] = {true, true, true, false, false, false, false, false, false, false}; uint32_t nb_tests = sizeof(results) / sizeof(bool); @@ -168,8 +175,51 @@ test_result t_is_in_screen_0() return (test_result){.passed = passed, .name = "Test is_in_screen 0"}; } +test_result t_force_in_screen_0() +{ + bool passed = true; + + coordinates_t p[] = { + coordinates_create(99 / WID * 100, 1 / HEI * 100), + coordinates_create(50 / WID * 100, 50 / HEI * 100), + coordinates_create(1 / WID * 100, 99 / HEI * 100), + coordinates_create(WID, HEI), + coordinates_create(-1, HEI / 2), + coordinates_create(WID / 2, -1), + coordinates_create(-1, -1), + coordinates_create(WID + 10, HEI/2), + coordinates_create(WID / 2, HEI + 10), + coordinates_create(WID + 10, HEI + 10) + }; + coordinates_t p_results[] = { + coordinates_create(99 / WID * 100, 1 / HEI * 100), + coordinates_create(50 / WID * 100, 50 / HEI * 100), + coordinates_create(1 / WID * 100, 99 / HEI * 100), + coordinates_create(WID-1, HEI-1), + coordinates_create(0, HEI / 2), + coordinates_create(WID / 2, 0), + coordinates_create(0, 0), + coordinates_create(WID -1, HEI/2), + coordinates_create(WID / 2, HEI -1), + coordinates_create(WID -1, HEI -1) + }; + + uint32_t nb_tests = sizeof(p_results) / sizeof(coordinates_t); + + for (size_t i = 0; i < nb_tests; i++) + { + force_in_screen(&p[i]); + if(p[i].column != p_results[i].column || p[i].row != p_results[i].row){ + passed = false; + break; + } + } + + return (test_result){.passed = passed, .name = "Test is_in_screen 0"}; +} + // Add or remove your test function name here -const unit_test_t tests[] = {t_compute_e_0, t_compute_total_normalized_e_0, t_line_reach_charge_0, t_is_in_screen_0}; +const unit_test_t tests[] = {t_compute_e_0, t_compute_total_normalized_e_0, t_line_reach_charge_0, t_is_in_screen_0, t_force_in_screen_0}; int main() { diff --git a/src/main.c b/src/main.c index 9c5e5a15d0b75e86d300438ac2d8000b8e3a6bde..5d8618329b21d817e4d95afa3db59ae7aa9cc003 100644 --- a/src/main.c +++ b/src/main.c @@ -1,29 +1,18 @@ +/** + * @file main.c + * @author Boris Stefanovic, Joey Martig + * @brief Main du programme de simulation de charges électriques et lignes de champs. + * @date 23.05.2022 + */ + #include <stdlib.h> #include "field.h" - -#define NCHARGES 2 #define NC 3 #define DX 25 #define NLINES 50 - -void main_old() { - charge_t charges[NCHARGES] = { - charge_create(0.25, vec2_create(0.25, 0.5)), - charge_create(-0.25, vec2_create(0.75, 0.5)) - }; - struct gfx_context_t *ctxt = gfx_create("elec", WID, HEI); - - draw_everything(ctxt, charges, NCHARGES, NLINES, DX, 0.0, 1.0, 0.0, 1.0); - gfx_present(ctxt); - - while (gfx_keypressed() != SDLK_ESCAPE); - gfx_destroy(ctxt); -} - - -void main_new() { +int main() { charge_t charges[NC]; for (int i = 0; i < NC; ++i) charges[i] = charge_create(i % 2 == 0 ? rand_one() : -rand_one(), vec2_create(rand_one(), rand_one())); @@ -31,14 +20,8 @@ void main_new() { draw_everything(ctxt, charges, NC, NLINES, DX, 0.0, 1.0, 0.0, 1.0); gfx_present(ctxt); - while (gfx_keypressed() != SDLK_ESCAPE) { - gfx_present(ctxt); - } + while (gfx_keypressed() != SDLK_ESCAPE); gfx_destroy(ctxt); -} - -int main() { - main_new(); return EXIT_SUCCESS; }