diff --git a/perso/galaxy.c b/perso/galaxy.c index ac6ee68251692741a3a88402564ab35738f01811..5fa2caeadad0e8277694eaf3fae7a85783f67137 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 8263e07a52446b45ab5ef1c86e377263eb12c0b3..7925780fd94c538adbe358a5e20c1f51a963d2cc 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 1216c3b638b9c521eb00fa970980d392020a1cd2..c841dd2d1e4ddaac77978e92dc9b5690f6fe8853 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