Skip to content
Snippets Groups Projects
Commit ad05f794 authored by Boris Stefanovic's avatar Boris Stefanovic
Browse files

FINAL MERGE

parent 1731e6c7
No related branches found
No related tags found
No related merge requests found
......@@ -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.
/**
* @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"
......
/**
* @file draw.h
* @author Boris Stefanovic, Joey Martig
* @date 23.05.2022
*/
#ifndef DRAW_H
#define DRAW_H
......
/**
* @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);
......
/**
* @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);
}
}
......
/**
* @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,
......
/**
* @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()
{
......
/**
* @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"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment