Skip to content
Snippets Groups Projects
Commit 26fc71dd authored by navid.elmi's avatar navid.elmi
Browse files

tkt

parent e7ef9065
No related branches found
No related tags found
No related merge requests found
No preview for this file type
......@@ -8,6 +8,7 @@
#define SCREEN_WIDTH 1000
#define SCREEN_HEIGHT 1000
#define delta_t 86400 //en secondes
int main()
......@@ -22,16 +23,16 @@ int main()
}
// TODO : create your system
system_t s = create_system(0);
while (true)
{
system_t s = create_system();
bool x = false;
while (true){
gfx_present(ctxt);
// TODO : draw the current state of your system
show_system(ctxt, &s);
// TODO : update your system
//gfx_clear(ctxt, COLOR_BLACK);
if (gfx_keypressed() == SDLK_ESCAPE)
{
update_system(&s, delta_t, x);
gfx_clear(ctxt, COLOR_BLACK);
if (gfx_keypressed() == SDLK_ESCAPE){
break;
}
}
......
No preview for this file type
No preview for this file type
......@@ -3,7 +3,6 @@
#include <math.h>
#include <stdio.h>
//Masse (kg)
#define G 6.67e-11
#define M_SOLEIL 1.989e30
......@@ -15,10 +14,11 @@
#define M_AZEROTH 7.20e25
// e = excentricité ; DG = demi-grand axe ; peri = périhelie
planet_t create_planet(double mass, vec2 pos, double e, double DG, double peri){
planet_t create_planet(double mass, vec2 pos, vec2 prec_pos, double e, double DG, double peri){
planet_t p;
p.mass = mass;
p.pos = pos;
p.prec_pos = prec_pos;
p.e = e;
p.DG = DG;
p.peri = peri;
......@@ -26,83 +26,107 @@ planet_t create_planet(double mass, vec2 pos, double e, double DG, double peri){
}
//distances en échelle 1/1 000 000 000(m)
system_t create_system(double delta_t){
system_t create_system(){
system_t s;
s.star = create_planet(M_SOLEIL , vec2_create_zero(), 0, 0, 0);
s.star = create_planet(M_SOLEIL , vec2_create_zero(), vec2_create_zero(), 0, 0, 0);
s.nb_planets = 6;
s.planets = malloc(sizeof(planet_t) * s.nb_planets);
s.planets[4] = create_planet(M_NAMEK , vec2_create(474.1 , 0), 0.01, 34.2, 25.9);
s.planets[0] = create_planet(M_MERCURE , vec2_create(454 , 0), 0.20563069, 58, 46);
s.planets[1] = create_planet(M_VENUS , vec2_create(392.5 , 0), 0.0067733, 108.2, 107.5);
s.planets[2] = create_planet(M_TERRE, vec2_create(352.9 , 0), 0.01671022, 149.6, 147.1);
s.planets[3] = create_planet(M_MARS , vec2_create(293.3 , 0), 0.09341233, 228, 206.7);
s.planets[5] = create_planet(M_AZEROTH , vec2_create(230.2 , 0), 0.01, 280.7, 269.8);
s.planets[4] = create_planet(M_NAMEK , vec2_create(-0.05, 0), vec2_create(0 , 0), 0.01, 0.068, -0.05);
s.planets[0] = create_planet(M_MERCURE , vec2_create(-0.092, 0), vec2_create(0 , 0), 0.20563069, 0.116, -0.092);
s.planets[1] = create_planet(M_VENUS , vec2_create(-0.214, 0), vec2_create(0 , 0), 0.0067733, 0.216, -0.214);
s.planets[2] = create_planet(M_TERRE, vec2_create(-0.294 , 0), vec2_create(0 , 0), 0.01671022, 0.3, -0.294);
s.planets[3] = create_planet(M_MARS , vec2_create(-0.412 , 0), vec2_create(0 , 0), 0.09341233, 0.456, -0.412);
s.planets[5] = create_planet(M_AZEROTH , vec2_create(-0.556 , 0), vec2_create(0 , 0), 0.01, 0.582, -0.556);
return s;
}
//affichage des planetes rayon 1/ 1 000 000 (m)
void show_system(struct gfx_context_t *ctxt, system_t *system){
planet_t soleil = system->star;
draw_full_circle(ctxt, 500, 500, 5, COLOR_YELLOW);
int posx[system->nb_planets];
int posy[system->nb_planets];
int rayon[system->nb_planets];
int couleur[system->nb_planets];
for(int i = 0; i < system->nb_planets ; i++){
double mass = system->planets[i].mass;
coordinates coord = vec2_to_coordinates(system->planets[i].pos, 1000, 1000);
if(mass == M_NAMEK){
posx[i] = 474.1;
posx[i] = coord.column;
posy[i] = coord.row;
rayon[i] = 3;
couleur[i] = COLOR_GREEN;
}
else if(mass == M_MERCURE){
posx[i] = 454;
posx[i] = coord.column;
posy[i] = coord.row;
rayon[i] = 2.439;
couleur[i] = COLOR_WHITE;
}
else if(mass == M_VENUS){
posx[i] = 392.5;
posx[i] = coord.column;
posy[i] = coord.row;
rayon[i]= 6.051;
couleur[i] = COLOR_ORANGE;
}
else if(mass == M_TERRE){
posx[i] = 352.9;
posx[i] = coord.column;
posy[i] = coord.row;
rayon[i] = 6.371;
couleur[i] = COLOR_BLUE;
}
else if(mass == M_MARS){
posx[i] = 293.3;
posx[i] = coord.column;
posy[i] = coord.row;
rayon[i] = 6.991;
couleur[i] = COLOR_RED;
}
else{
posx[i] = 230.2;
posx[i] = coord.column;
posy[i] = coord.row;
rayon[i] = 10.45;
couleur[i] = COLOR_TURQUOISE;
}
}
for(int i = 0 ; i < system->nb_planets ; i++){
draw_full_circle(ctxt, posx[i], 500, rayon[i], couleur[i]);
draw_full_circle(ctxt, posx[i], posy[i], rayon[i], couleur[i]);
}
}
// update du systeme
void update_system(system_t *system, double delta_t, bool x){
for(int i = 0; i < system->nb_planets ; i++){
vec2 pos_tmp = system->planets[i].pos;
if(x == false){
system->planets[i].pos = pos_init(*system, system->planets[i] , delta_t);
x = true;
}
else{
system->planets[i].pos = pos_u(*system, system->planets[i] , delta_t);
}
system->planets[i].prec_pos = pos_tmp;
}
}
//fonction n'est pas egal à
bool is_equal(planet_t a, planet_t b){
return a.mass == b.mass;
}
vec2 gravite(double massA, double massB, vec2 AB){
//force de gravité
vec2 gravite(planet_t a, planet_t b){
vec2 AB = vec2_sub(a.pos, b.pos);
vec2 fBA;
fBA.x = G * ((massA * massB) / pow(vec2_norm(AB), 3)) * AB.x;
fBA.y = G * ((massA * massB) / pow(vec2_norm(AB), 3)) * AB.y;
fBA.x = G * ((a.mass * b.mass) / pow(vec2_norm(AB), 3)) * AB.x;
fBA.y = G * ((a.mass * b.mass) / pow(vec2_norm(AB), 3)) * AB.y;
return fBA;
}
//force résultante
vec2 somme_force(system_t system, planet_t p){
vec2 s;
vec2 s = gravite(p, system.star);
for(int i = 0 ; i < system.nb_planets ; i++){
if(is_equal(p , system.planets[i])){
vec2 g = gravite(system.planets[i].mass, p.mass, vec2_sub(system.planets[i].pos, p.pos));
vec2 g = gravite(p, system.planets[i]);
s.x += g.x;
s.y += g.y;
}
......@@ -110,11 +134,13 @@ vec2 somme_force(system_t system, planet_t p){
return s;
}
//acceleration
vec2 accel(system_t system, planet_t p){
vec2 a = somme_force(system , p);
return vec2_create(a.x / p.mass, a.y / p.mass);
}
//vitesse initiale
vec2 vitesse_i(planet_t p){
vec2 per = vec2_create(-p.pos.y , p.pos.x);
vec2 vi;
......@@ -123,15 +149,15 @@ vec2 vitesse_i(planet_t p){
return vi;
}
//premier changement de position
vec2 pos_init(system_t system, planet_t p, double delta_t){
vec2 v = vitesse_i(p);
vec2 a = accel(system , p);
return vec2_create(p.pos.x + delta_t * v.x + (pow(delta_t, 2) / 2) * a.x, p.pos.y + delta_t * v.y + (pow(delta_t, 2) / 2) * a.y);
}
vec2 pos_update(system_t system, planet_t p, double delta_t){
//position update
vec2 pos_u(system_t system, planet_t p, double delta_t){
vec2 a = accel(system , p);
vec2 b = pos_update(system , p, delta_t - 2 * delta_t)
return vec2_create(2 * p.pos.x - b.x + pow(delta_t, 2) * a.x , 2 * p.pos.y - b.y + pow(delta_t, 2) * a.y)
return vec2_create(2 * p.pos.x - p.prec_pos.x + pow(delta_t, 2) * a.x , 2 * p.pos.y - p.prec_pos.y + pow(delta_t, 2) * a.y);
}
\ No newline at end of file
......@@ -23,13 +23,13 @@ typedef struct _system
// Those function are not mandatory to implement,
// it's rather a hint of what you should have.
planet_t create_planet(double mass, vec2 pos, double e, double DG, double peri);
system_t create_system(double delta_t);
planet_t create_planet(double mass, vec2 pos, vec2 prec_pos, double e, double DG, double peri);
system_t create_system();
void show_system(struct gfx_context_t *ctxt, system_t *system);
void update_system(system_t *system, double delta_t);
void update_system(system_t *system, double delta_t, bool x);
void free_system(system_t *system);
vec2 gravite(double massA, double massB, vec2 AB);
vec2 gravite(planet_t a, planet_t b);
vec2 somme_force(system_t system, planet_t P);
......@@ -41,6 +41,6 @@ bool is_equal(planet_t a, planet_t b);
vec2 pos_init(system_t system, planet_t p, double delta_t);
vec2 pos_update(double delta_t);
vec2 pos_u(system_t system, planet_t p, double delta_t);
#endif
\ No newline at end of file
#include "vec2.h"
#include <stdio.h>
#include <stdbool.h>
#include <math.h>
typedef struct _test_result
{
bool passed;
const char *name;
} test_result;
typedef test_result (*unit_test_t)(void);
void print_in_color(char *color, char *text)
{
printf("\033%s", color);
printf("%s", text);
printf("\033[0m");
}
void print_in_red(char *text)
{
print_in_color("[0;31m", text);
}
void print_in_green(char *text)
{
print_in_color("[0;32m", text);
}
bool dbl_eq(double a, double b)
{
return fabs(a - b) < 1e-6;
}
/*
*
* Write your tests here
*
*/
/* TODO
vec2 vec2_create(double x_, double y_); -- Ok
vec2 vec2_create_zero(); -- Ok
vec2 vec2_add(vec2 lhs, vec2 rhs); -- Ok
vec2 vec2_sub(vec2 lhs, vec2 rhs); -- Ok
vec2 vec2_mul(double scalar, vec2 lhs); -- Ok
double vec2_dot(vec2 lhs, vec2 rhs); -- Ok
double vec2_norm_sqr(vec2 v); -- Ok
double vec2_norm(vec2 v); -- Ok
vec2 vec2_normalize(vec2 v); -- Ok
bool vec2_is_approx_equal(vec2 lhs, vec2 rhs, double eps);
coordinates vec2_to_coordinates(vec2 v, uint32_t width, uint32_t height);
*/
const double u_x[] = {1.25, 3.53, 2.64, 8.8};
const double u_y[] = {3.42, 7.22, 5.32, 2.44};
const double v_x[] = {4.32, 6.21, 7.42, 9.32};
const double v_y[] = {5.22, 3.56, 8.65, 6.44};
const uint32_t nb_tests = sizeof(u_x) / sizeof(double);
test_result t_vec2_create_0()
{
bool passed = true;
for (uint32_t i = 0; i < nb_tests; i++)
{
vec2 v = vec2_create(u_x[i], u_y[i]);
if (u_x[i] != v.x || u_y[i] != v.y)
{
passed = false;
break;
}
}
return (test_result){.passed = passed,
.name = "Test vec2_create 0"};
}
test_result t_vec2_create_zero_0()
{
vec2 v = vec2_create_zero();
return (test_result){.passed = v.x == 0.0 && v.y == 0.0,
.name = "Test vec2_create_zero 0"};
}
test_result t_vec2_add_0()
{
double r_x[] = {5.57, 9.74, 10.06, 18.12};
double r_y[] = {8.64, 10.78, 13.97, 8.88};
bool passed = true;
for (uint32_t i = 0; i < nb_tests; i++)
{
vec2 u = vec2_create(u_x[i], u_y[i]);
vec2 v = vec2_create(v_x[i], v_y[i]);
vec2 r = vec2_add(u, v);
if (!(dbl_eq(r.x, r_x[i]) && dbl_eq(r.y, r_y[i])))
{
passed = false;
break;
}
}
return (test_result){.passed = passed,
.name = "Test vec2_add 0"};
}
test_result t_vec2_sub_0()
{
double r_x[] = {-3.07, -2.68, -4.78, -0.52};
double r_y[] = {-1.80, 3.66, -3.33, -4.00};
bool passed = true;
for (uint32_t i = 0; i < nb_tests; i++)
{
vec2 u = vec2_create(u_x[i], u_y[i]);
vec2 v = vec2_create(v_x[i], v_y[i]);
vec2 r = vec2_sub(u, v);
if (!(dbl_eq(r.x, r_x[i]) && dbl_eq(r.y, r_y[i])))
{
passed = false;
break;
}
}
return (test_result){.passed = passed,
.name = "Test vec2_sub 0"};
}
test_result t_vec2_mul_0()
{
double r_x[] = {5.40, 21.9213, 19.5888, 82.016};
double r_y[] = {14.7744, 44.8362, 39.4744, 22.740800};
bool passed = true;
for (uint32_t i = 0; i < nb_tests; i++)
{
double alpha = v_x[i];
vec2 u = vec2_create(u_x[i], u_y[i]);
vec2 r = vec2_mul(alpha, u);
if (!(dbl_eq(r.x, r_x[i]) && dbl_eq(r.y, r_y[i])))
{
passed = false;
break;
}
}
return (test_result){.passed = passed,
.name = "Test vec2_mul 0"};
}
test_result t_vec2_dot_0()
{
double r[] = {23.2524, 47.6245, 65.6068, 97.7296};
bool passed = true;
for (uint32_t i = 0; i < nb_tests; i++)
{
vec2 u = vec2_create(u_x[i], u_y[i]);
vec2 v = vec2_create(v_x[i], v_y[i]);
double res = vec2_dot(u, v);
if (!dbl_eq(res, r[i]))
{
passed = false;
break;
}
}
return (test_result){.passed = passed,
.name = "Test vec2_dot 0"};
}
test_result t_vec2_norm_sqr_0()
{
double r[] = {13.2589, 64.5893, 35.272, 83.3936};
bool passed = true;
for (uint32_t i = 0; i < nb_tests; i++)
{
vec2 u = vec2_create(u_x[i], u_y[i]);
double res = vec2_norm_sqr(u);
if (!dbl_eq(res, r[i]))
{
passed = false;
break;
}
}
return (test_result){.passed = passed,
.name = "Test vec2_norm_sqr 0"};
}
test_result t_vec2_norm_0()
{
double r[] = {3.641277, 8.036747, 5.939023, 9.132010};
bool passed = true;
for (uint32_t i = 0; i < nb_tests; i++)
{
vec2 u = vec2_create(u_x[i], u_y[i]);
double res = vec2_norm(u);
if (!dbl_eq(res, r[i]))
{
passed = false;
break;
}
}
return (test_result){.passed = passed,
.name = "Test vec2_norm 0"};
}
test_result t_vec2_normalize_0()
{
double r_x[] = {0.343286, 0.439232, 0.444518, 0.963643};
double r_y[] = {0.939231, 0.898373, 0.895770, 0.267192};
bool passed = true;
for (uint32_t i = 0; i < nb_tests; i++)
{
vec2 u = vec2_create(u_x[i], u_y[i]);
vec2 r = vec2_normalize(u);
if (!(dbl_eq(r.x, r_x[i]) && dbl_eq(r.y, r_y[i])))
{
passed = false;
break;
}
}
return (test_result){.passed = passed,
.name = "Test vec2_normalize 0"};
}
test_result t_vec2_is_approx_equal_0()
{
bool r[] = {true, true, false, false};
double t_x[] = {u_x[0], u_x[1] + 1e-4, u_x[2] + 15.0, u_x[3] + 1e-2};
double t_y[] = {u_y[0], u_y[1] - 1e-4, u_y[2] + 15.0, u_y[3] + 1e-2};
bool passed = true;
for (uint32_t i = 0; i < nb_tests; i++)
{
vec2 u = vec2_create(u_x[i], u_y[i]);
vec2 t = vec2_create(t_x[i], t_y[i]);
if (vec2_is_approx_equal(u, t, 1e-3) != r[i])
{
passed = false;
break;
}
}
return (test_result){.passed = passed,
.name = "Test vec2_is_approx_equal 0"};
}
test_result t_vec2_to_coordinates_0()
{
uint32_t height = 300;
uint32_t width = 100;
double t_x[] = {0.25, 0.5, 0.75, 1};
double t_y[] = {0, 1.0 / 3.0, 2.0 / 3.0, 1};
uint32_t r_col[] = {62, 74, 87, 99};
uint32_t r_row[] = {150, 199, 249, 299};
bool passed = true;
for (uint32_t i = 0; i < nb_tests; i++)
{
vec2 t = vec2_create(t_x[i], t_y[i]);
coordinates r = vec2_to_coordinates(t, width, height);
if (r.row != r_row[i] || r.column != r_col[i])
{
passed = false;
break;
}
}
return (test_result){.passed = passed,
.name = "Test vec2_to_coordinates 0"};
}
//Add or remove your test function name here
const unit_test_t tests[] = {
t_vec2_create_0,
t_vec2_create_zero_0,
t_vec2_add_0,
t_vec2_sub_0,
t_vec2_mul_0,
t_vec2_dot_0,
t_vec2_norm_sqr_0,
t_vec2_norm_0,
t_vec2_normalize_0,
t_vec2_is_approx_equal_0,
t_vec2_to_coordinates_0};
int main()
{
uint32_t nb_tests = sizeof(tests) / sizeof(unit_test_t);
char message[256];
bool all_passed = true;
for (uint32_t i = 0; i < nb_tests; i++)
{
printf("Running test n°%d: ...\n", i);
test_result r = tests[i]();
if (r.passed)
{
sprintf(message, "\t- %s : OK", r.name);
print_in_green(message);
}
else
{
all_passed = false;
sprintf(message, "\t- %s : FAILED", r.name);
print_in_red(message);
}
printf("\n");
}
if (all_passed)
print_in_green("\nTests suite result : OK\n");
else
print_in_red("\nTests suite result : FAILED\n");
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment