diff --git a/planet/constants.h b/planet/constants.h index 85d1b5de7dcb0a3ecaf9fc3e3db6fd515f3a7006..d021dbe70da72f76faa0a267e75c587785d970ea 100644 --- a/planet/constants.h +++ b/planet/constants.h @@ -2,62 +2,40 @@ #define PLANET_CONSTANTS_H -// display -#define DISPLAY_PLANET_RADIUS_DIV 1.0e23 -#define DISPLAY_MAX_ORBIT_RADIUS - - -// logic -#define PLANET_COUNT 4 - - // physical constants #define G 6.67e-11 #define M_SOLEIL 1.989e30 +// perihelion +#define PER_MERCURE 4.60012e10 +#define PER_VENUS 1.07477e11 +#define PER_TERRE 1.47095e11 +#define PER_MARS 2.06700e11 + // mass #define M_MERCURE 3.3011e23 #define M_VENUS 4.8675e24 #define M_TERRE 5.9742e24 #define M_MARS 6.4171e23 -#define M_JUPITER 1.8982e27 -#define M_SATURN 5.6834e26 -#define M_URANUS 8.6810e25 -#define M_NEPTUNE 1.02413e26 -#define M_PLUTO 1.303e22 - -// major axis -#define A_MERCURE 5.7909e10 -#define A_VENUS 1.0821e11 -#define A_TERRE 1.4960e11 -#define A_MARS 2.2794e11 -#define A_JUPITER 7.7857e11 -#define A_SATURN 1.43353e12 -#define A_URANUS 2.870972e12 -#define A_NEPTUNE 4.50e12 -#define A_PLUTO 5.90638e12 // excentricity #define E_MERCURE 0.205630 #define E_VENUS 0.006772 #define E_TERRE 0.0167086 #define E_MARS 0.0934 -#define E_JUPITER 0.0489 -#define E_SATURN 0.0565 -#define E_URANUS 0.04717 -#define E_NEPTUNE 0.008678 -#define E_PLUTO 0.2488 -// perihelion -#define PER_MERCURE 4.60012e10 -#define PER_VENUS 1.07477e11 -#define PER_TERRE 1.47095e11 -#define PER_MARS 2.06700e11 -#define PER_JUPITER 7.40520e11 -#define PER_SATURN 1.35255e12 -#define PER_URANUS 2.73556e12 -#define PER_NEPTUNE 4.46e12 -#define PER_PLUTO 4.43682e12 +// major axis +#define A_MERCURE 5.7909e10 +#define A_VENUS 1.0821e11 +#define A_TERRE 1.4960e11 +#define A_MARS 2.2794e11 + +// radius: no hope of writing anything user-friendly that is to scale... +#define R_SUN 6.96342e8 +#define R_MERCURY 2.4397e6 +#define R_VENUS 6.0518e6 +#define R_EARTH 6.3710e6 +#define R_MARS 3.3895e6 #endif //PLANET_CONSTANTS_H diff --git a/planet/planet.c b/planet/planet.c index e1f3b946f27d83bb7269aa5db812cb16c9f77870..0add943afe4ef25427f96497a878d82e3768e00b 100755 --- a/planet/planet.c +++ b/planet/planet.c @@ -3,7 +3,25 @@ #include "constants.h" -#define NB_PLANETS 4 + +#define NB_PLANETS 4 +#define NB_FICT 4 + +#define DISPLAY_DISTANCE 4.0e11 + +const double masses[] = {M_MERCURE, M_VENUS, M_TERRE, M_MARS}; +const double perihelions[] = {PER_MERCURE, PER_VENUS, PER_TERRE, PER_MARS}; +const double eccentricities[] = {E_MERCURE, E_VENUS, E_TERRE, E_MARS}; +const double axis_major[] = {A_MERCURE, A_VENUS, A_TERRE, A_MARS}; +const uint32_t display_sun_radius = 45; +const uint32_t display_radii[] = {5, 10, 10, 20}; + +// fictional +const double fict_per[] = {7.80e10, 1.28e11, 1.85e11, 3.00e11}; +const double fict_mas[] = {5.9e23, 7.0e23, 4.9e24, 7.0e23}; +const double fict_ecc[] = {0.025, 0.005, 0.01, 0.0008}; +const double fict_axm[] = {8.0e10, 1.2e11, 2.0e11, 2.9e11}; +const uint32_t fict_display_radii[] = {7, 8, 14, 24}; planet_t create_planet(double mass, vec2 pos) { @@ -15,60 +33,69 @@ planet_t create_planet(double mass, vec2 pos) { } +vec2 calc_prev_position(const double star_mass, const vec2 pos, const double ecc, const double axm, const double delta_t) { + double vel = G * star_mass * (1.0 + ecc); + vel /= axm * (1.0 - ecc); + vel = sqrt(vel); + const vec2 ru = vec2_normalize(pos); + const vec2 rp = vec2_create(-ru.y, ru.x); + const vec2 v = vec2_mul(vel, rp); + const vec2 prec_pos = vec2_sub(pos, vec2_mul(delta_t, v)); + return prec_pos; +} + + system_t create_system(double delta_t) { system_t system; system.star = create_planet(M_SOLEIL, vec2_create_zero()); - system.nb_planets = 4; + system.nb_planets = NB_PLANETS + NB_FICT; system.planets = malloc(system.nb_planets * sizeof(planet_t)); - double masses[] = { - M_MERCURE, - M_VENUS, - M_TERRE, - M_MARS}; - vec2 positions[] = { - 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[] = { - E_MERCURE, - E_VENUS, - E_TERRE, - E_MARS}; - double axis_major[] = { - A_MERCURE, - A_VENUS, - A_TERRE, - A_MARS}; - for (uint32_t i = 0; i < system.nb_planets; ++i) { + // real planets + for (uint32_t i = 0; i < 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, rp); - system.planets[i].prec_pos = vec2_sub(system.planets[i].pos, vec2_mul(delta_t, v)); + system.planets[i].pos = vec2_create(perihelions[i], 0.0); + system.planets[i].prec_pos = calc_prev_position( + system.star.mass, + system.planets[i].pos, + eccentricities[i], + axis_major[i], + delta_t); + } + // fictional planets + for (uint32_t i = 0; i < NB_FICT; ++i) { + const size_t idx = i + NB_PLANETS; + system.planets[idx].mass = fict_mas[i]; + system.planets[idx].pos = vec2_create(fict_per[i], 0.0); + system.planets[idx].prec_pos = calc_prev_position( + system.star.mass, + system.planets[idx].pos, + fict_ecc[i], + fict_axm[i], + delta_t); } return system; } -void show_system(struct gfx_context_t* ctxt, system_t* system, const double show_radius) { +void show_system(struct gfx_context_t* ctxt, system_t* system) { // draw sun const coordinates xy_sun = vec2_to_coordinates_centered( vec2_normalize(system->star.pos), ctxt->width, ctxt->height); - draw_full_circle(ctxt, xy_sun.column, xy_sun.row, 50, COLOR_YELLOW); + draw_full_circle(ctxt, xy_sun.column, xy_sun.row, display_sun_radius, COLOR_YELLOW); // draw planets for (uint32_t i = 0; i < system->nb_planets; ++i) { + const double display_distance = vec2_norm(system->planets[i].pos) / DISPLAY_DISTANCE; const coordinates xy = vec2_to_coordinates_centered( - vec2_mul(vec2_norm(system->planets[i].pos) / show_radius, vec2_normalize(system->planets[i].pos)), + vec2_mul(display_distance, vec2_normalize(system->planets[i].pos)), ctxt->width, ctxt->height); - draw_full_circle(ctxt, xy.column, xy.row, 20, COLOR_BLUE); + if (i < NB_PLANETS) { + draw_full_circle(ctxt, xy.column, xy.row, display_radii[i], COLOR_BLUE); + } else { + draw_full_circle(ctxt, xy.column, xy.row, fict_display_radii[i - NB_PLANETS], COLOR_GREEN); + } } } diff --git a/planet/planet.h b/planet/planet.h index a946cfef01f7940fdefb32674196857a3d08e08f..f28e48cb806d641d706a190b7a045ea246901b1f 100755 --- a/planet/planet.h +++ b/planet/planet.h @@ -20,8 +20,7 @@ planet_t create_planet(double mass, vec2 pos); system_t create_system(double delta_t); -//void show_system(struct gfx_context_t* ctxt, system_t* system); -void show_system(struct gfx_context_t* ctxt, system_t* system, const double show_radius); +void show_system(struct gfx_context_t* ctxt, system_t* system); void update_system(system_t* system, double delta_t);