diff --git a/planet/planet.c b/planet/planet.c index 362ed761cc4b46f07fc53c16b6b6fbc9a3927252..7e0de59d7119363077a90462ff3c580237b1e119 100755 --- a/planet/planet.c +++ b/planet/planet.c @@ -26,8 +26,8 @@ typedef struct _system planet_t create_planet(double mass, vec2 pos) { planet_t p; p.mass = mass; - p.prec_pos = pos; p.pos = pos; + p.prec_pos = pos; // must be changed return p; } @@ -37,17 +37,48 @@ system_t create_system(double delta_t) { system.star = create_planet(M_SOLEIL, vec2_create_zero()); system.nb_planets = 4; system.planets = malloc(system.nb_planets * sizeof(planet_t)); - double masses[system.nb_planets] = {M_MERCURE, M_VENUS, M_TERRE, M_MARS}; - //TODO - vec2 positions[system.nb_planets] = {vec2_create(), vec2_create(), vec2_create(), vec2_create()}; + if (NULL == system.planets) return NULL; + double masses[system.nb_planets] = { + M_MERCURE, + M_VENUS, + M_TERRE, + M_MARS}; + vec2 positions[system.nb_planets] = { + vec2_create(PER_MERCURE, 0.0), + vec2_create(PER_VENUS, 0.0), + vec2_create(PER_TERRE, 0.0), + vec2_create(PER_MARS, 0.0)}; + double eccentricities[system.nb_planets] = { + E_MERCURE, + E_VENUS, + E_TERRE, + E_MARS}; + double axis_major[system.nb_planets] = { + A_MERCURE, + A_VENUS, + A_TERRE, + A_MARS}; + for (uint32_t i = 0; i < system.nb_planets; ++i) { + system.planets[i].mass = masses[i]; + system.planets[i].pos = positions[i]; + double vel = G * system.star.mass * (1.0 + eccentricities[i]); + vel /= axis_major[i] * (1.0 - eccentricities[i]); + vel = sqrt(vel); + const vec2 ru = vec2_normalize(vec2_sub(system.planets[i].pos, system.star.pos)); + const vec2 rp = vec2_create(-ru.y, ru.x); + const vec2 v = vec2_mul(vel, r); + system.planets[i].prec_pos = vec2_sub(system.planets[i].pos, vec2_mul(delta_t, v)); + } return system; } -void show_system(struct gfx_context_t *ctxt, system_t *system); +void show_system(struct gfx_context_t* ctxt, system_t* system) { + //TODO +} -void update_system(system_t *system, double delta_t) { +void update_system(system_t* system, double delta_t) { for (uint32_t i = 0; i < system->nb_planets; ++i) { // apply the effects of the sun vec2 a = vec2_mul((G * system->star.mass) / r_star_2, vec2_normalize(system->planets[i].pos)); @@ -71,4 +102,6 @@ void update_system(system_t *system, double delta_t) { } -void free_system(system_t *system); +void free_system(system_t* system) { + free(system->planets); +}