diff --git a/doc/rapport.md b/doc/rapport.md index b69c8bd9ae2ca1ab9cf5bae502f7f6f68e03f5e6..9fa490829f5278ebac344472de7c4d95a998af6f 100644 --- a/doc/rapport.md +++ b/doc/rapport.md @@ -40,11 +40,11 @@ de simulation, plus complexe. # Plan -1. **Théorie** Rappel théorique simplifiant la compréhension du porgramme -2. **Méthodologie** Comment nous nous sommes organisé pour ce travail -3. **Implémentation** Structure du programme et fonctionnements -4. **Résultats** Les résultats obtenus ainsi que les tests effectués -5. **Conclusion** Notre conclusion de ce travail +1. **Théorie** Rappel théorique nécessaire à la compréhension du programme +2. **Méthodologie** Organisation de ce travail +3. **Implémentation** Structure du programme et fonctionnement +4. **Résultats** Résultats obtenus et tests effectués +5. **Conclusion** Ce qu'il faut retenir de ce travail @@ -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..9aa786d6a87e359f769406383fb4eb0f7f2648c0 100644 --- a/src/draw_tests.c +++ b/src/draw_tests.c @@ -1,9 +1,16 @@ +/** + * @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" int main() { struct gfx_context_t* ctxt = gfx_create("main", 100, 100); - + coordinates_t src = coordinates_create(50, 50); coordinates_t dst = coordinates_create(75, 50); gfx_draw_line(ctxt, src, dst, COLOR_WHITE); diff --git a/src/field.c b/src/field.c index 95f80f08c84b4f4223d977ed7ba0267ce719b18d..077b222896a669b325ad1c4ce9a51d5a925746b6 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" @@ -33,10 +40,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); @@ -78,7 +97,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++) { @@ -122,6 +141,10 @@ static void draw_charges(struct gfx_context_t *context, charge_t *charges, int n 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..9807958b2b6760f608716e338e486d9814f77f5b 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> @@ -121,7 +128,7 @@ test_result t_line_reach_charge_0() vec2_create(0.25, 0.5), vec2_create(0.24, 0.49) }; - + bool results[] = {false, false, false, true, true, true}; uint32_t nb_tests = sizeof(results) / sizeof(bool); @@ -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..65ae351345e830e8c732c07f63a1b7811804fb94 100644 --- a/src/main.c +++ b/src/main.c @@ -1,3 +1,10 @@ +/** + * @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"