From f6d46722579c5d7817d772e651ba6e9cad3c4cd1 Mon Sep 17 00:00:00 2001 From: "arnaud.devevey" <arnaud.de-vevey@etu.hesge.ch> Date: Sun, 16 Jun 2019 20:27:21 +0200 Subject: [PATCH] 20h30 --- perso/galaxy.c | 59 +++++++++++++++++++++++++++++++++++++++++--------- perso/star.c | 50 +++++++++++++++++++++++++++++++++++------- perso/star.h | 8 +++---- 3 files changed, 95 insertions(+), 22 deletions(-) diff --git a/perso/galaxy.c b/perso/galaxy.c index ac6ee68..5fa2cae 100644 --- a/perso/galaxy.c +++ b/perso/galaxy.c @@ -40,7 +40,8 @@ int main(int argc, char **argv) { printf("\n\n"); tests(); - Box box_initial = new_box(0.0, 0.0, 10.0, 10.0); + double zone = 1e10; + Box box_initial = new_box(-zone, zone, zone, -zone); // Galaxy* galaxy = create_and_init_galaxy(nb_stars, box_initial, DELTA_T); @@ -49,7 +50,6 @@ int main(int argc, char **argv) { /* - gestion_de_la_ligne_de_commande(); allocation_mémoire_et_initialisation_de_la_galaxie(); itérations_temporelles { liberation_des_etoiles_qui_sortent_du_domaine(); @@ -81,28 +81,67 @@ int main(int argc, char **argv) { Galaxy* create_and_init_galaxy(int nb_bodies, Box box, double delta_t) { Star* list_stars = malloc(sizeof(Star) * nb_bodies); - // on crée une étoile en (0;0) qui a comme masse 10^6 * masse solaire - // Star* sun = new_star_vel(new_vec(0, 0), speed, acc, 1e6 * MASSE_SOLAIRE, DELTA_T); - // list_stars[0] = sun; + Vector* v_null = new_vec(0, 0); + Star* temp; - for (int i = 1; i <= nb_bodies; i++) { - // Star* temp = new_star_vel(); + for (int i = 0; i < nb_bodies; i++) { + + if (i == 0) { + // on crée une étoile en (0;0) qui a comme masse 10^6 * masse solaire + temp = new_star_vel(*v_null, *v_null, *v_null, 1e6 * MASSE_SOLAIRE, 0.0); + + } else { + double m_i = random_mass(); + Vector r_i = random_position(); + // si pos est dans box + Vector v_i = random_speed(r_i, m_i); + + temp = new_star_vel(r_i, v_i, *v_null, m_i, 0.0); } + + list_stars[i] = *temp; + + // on regarde comment cette étoile se fait attirer par le "soleil" + // update_acc(list_stars[i], list_stars[0]); + } + + + Galaxy* galaxy = malloc(sizeof(Galaxy)); + galaxy -> nb_bodies = nb_bodies; + galaxy -> stars = list_stars; + galaxy -> box = box; + + return galaxy; } void reset_acc_galaxy(Galaxy* galaxy) { - printf("bla"); + Vector* v_null = new_vec(0, 0); + + for (int i = 0; i < galaxy -> nb_bodies; i++) { + galaxy -> stars[i].acc = *v_null; + + /*if (galaxy -> stars[i] != NULL) { + }*/ + } + + free(v_null); } void update_pos_galaxy(Galaxy* galaxy, double delta_t) { - printf("bla"); + for(int i = 0; i < galaxy -> nb_bodies; i++) { + update_pos_star(&(galaxy -> stars[i]), delta_t); + } } void free_galaxy(Galaxy* galaxy) { - + /* + for (int i = 0; i < galaxy -> nb_bodies; i++) { + free(galaxy -> stars[i]); + } + */ } diff --git a/perso/star.c b/perso/star.c index 8263e07..7925780 100644 --- a/perso/star.c +++ b/perso/star.c @@ -59,11 +59,18 @@ void reset_acc(Star* star) { void update_acc(Star* target, const Star* const s2) { - // target se fait attirer par s2 + Vector* rj_ri = sub_vec(&(s2 -> pos), &(target -> pos)); + int G_mi_mj = FORCE_GRAVITATION * target -> mass * s2 -> mass; + Vector* temp = mul_vec(rj_ri, G_mi_mj); + + target -> acc = *mul_vec(temp, (1 / pow(norm(rj_ri), 3))); + + free(rj_ri); + free(temp); } -void update_pos(Star* star, double delta_t) { +void update_pos_star(Star* star, double delta_t) { // new_position = (2 * pos) - previous_pos + (acc * delta_t * delta_t) star -> pos = *(mul_vec(&(star -> pos), 2)); star -> pos = *(sub_vec(&(star -> pos), &(star -> previous_pos))); @@ -100,13 +107,13 @@ Vector random_position() { } -Vector random_speed(Star* star) { +Vector random_speed(Vector r_i, double m_i) { // math.sqrt(FORCE_GRAVITATION * (star -> mass + )) * chaque composante du vecteur v(-sin(phi) ; cos(phi)) // où phi = atan2(star -> position.y / star -> position.x) // tan⁻¹ - Vector* p_norm = new_vec(star -> pos.x, star -> pos.y); - double temp = sqrt(FORCE_GRAVITATION * (star -> mass + (1e6 * MASSE_SOLAIRE)) / norm(p_norm)); - double phi = atan2(star -> pos.y, star -> pos.x); + Vector* p_norm = new_vec(r_i.x, r_i.y); + double temp = sqrt(FORCE_GRAVITATION * (m_i + (1e6 * MASSE_SOLAIRE)) / norm(p_norm)); + double phi = atan2(r_i.y, r_i.x); Vector speed; speed.x = temp * (-sin(phi)); @@ -116,7 +123,7 @@ Vector random_speed(Star* star) { } -// il faut deja faire une liste de stars qui se trouvent dans une box + Star* super_star(Star* list_stars, int size_list) { Star* super_star = malloc(sizeof(Star)); @@ -131,7 +138,6 @@ Star* super_star(Star* list_stars, int size_list) { // masse super_star -> mass += list_stars[i].mass; - } // ne donne pas la même chose si on fait /= 2 pour chaque boucle for @@ -145,6 +151,34 @@ Star* super_star(Star* list_stars, int size_list) { } +Vector* resultante(Vector* list_stars, int size_list) { + Vector* Fi = new_vec(0.0, 0.0); + + for (int i = 0; i < size_list; i++) { + for (int j = 0; j < size_list; j++) { + if (j != i) { + /* + Vector* rj_ri = sub_vec(&(list_stars[j] -> pos), &(list_stars[i] -> pos)); + int G_mi_mj = FORCE_GRAVITATION * list_stars[i] -> mass * list_stars[j] -> mass; + Vector* temp = mul_vec(rj_ri, G_mi_mj); + + Fi = add_vec(Fi, temp) + */ + } + } + } + + Fi -> x /= size_list; + Fi -> y /= size_list; + + return Fi; +} + +void new_position(Star* star, Vector resultante) { + star -> acc = *(add_vec(&(star -> acc), &resultante)); +} + + int random_10() { diff --git a/perso/star.h b/perso/star.h index 1216c3b..c841dd2 100644 --- a/perso/star.h +++ b/perso/star.h @@ -48,10 +48,10 @@ void update_pos_star(Star* star, double delta_t); void print_star(const Star* const star); -// calcule la force résultante d'une liste de vecteurs -Vector resultante(Vector** list_vectors); +// retourne l'accélération d'une étoile d'après toutes les autres d'une liste +Vector* resultante(Vector* list_stars, int size_list); -// calcule la position de la étoile après avoir subi la force résultante des autres vecteurs (deuxième loi de Newton) +// calcule la position de l'étoile après avoir subi la force résultante des autres vecteurs (deuxième loi de Newton) void new_position(Star* star, Vector resultante); // calcule l'accélération @@ -66,7 +66,7 @@ int random_mass(); Vector random_position(); // retourne une vitesse aléatoire -Vector random_speed(Star* star); +Vector random_speed(Vector r_i, double m_i); // calcule une super etoile d'après le poids et la position d'un groupe d'étoiles -- GitLab