diff --git a/CelestialObject.c b/CelestialObject.c index ea0fedc53bc0429516481295cb7b421160483144..1a5b389f93050ee0c61cea2d870fafbf08d2c113 100644 --- a/CelestialObject.c +++ b/CelestialObject.c @@ -9,7 +9,7 @@ CelestialObject *celestial_object_create(double mass, Vector2 position) { CelestialObject *object = (CelestialObject*)malloc(sizeof(CelestialObject)); object->mass = mass; - // object->previous_position = NULL; + object->previous_position = vector2_create_zero(); object->current_position = position; return object; diff --git a/Makefile b/Makefile index d8a47db4a47df911674645f3cb0713e13feb3172..1e2510a3cb168f3425c6464fde18c7006ce57e95 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ TARGET = main CC:=gcc # CFLAGS:=-g -Ofast -Wall -Wextra -fsanitize=address -fsanitize=leak -std=gnu11 -CFLAGS:=-fsanitize=address +# CFLAGS:=-fsanitize=address LDFLAGS:=-lm -lSDL2 VPATH:=gfx diff --git a/SolarSystem.c b/SolarSystem.c index 1c79cd2150f1c639c8d956e2955849ead4e6c62b..71e63fb6dd2b84167958d589d8de8fd886177914 100644 --- a/SolarSystem.c +++ b/SolarSystem.c @@ -8,43 +8,74 @@ #define SCREEN_WIDTH 1000 #define SCREEN_HEIGHT 1000 +const double G = 6.67430 * 1E-11; SolarSystem *solar_system_create(double interval) { SolarSystem *solar_system = (SolarSystem *)malloc(sizeof(SolarSystem)); - solar_system->objects_length = 2; + solar_system->objects_length = 3; solar_system->objects = (CelestialObject **)malloc(sizeof(SolarSystem *) * solar_system->objects_length); + solar_system->interval = interval; solar_system->objects[0] = celestial_object_create(1.989 * 1E30, vector2_create(0, 0)); double perihelion_1 = 149.6 * 1E9 * (1 - 0.01671123); solar_system->objects[1] = celestial_object_create(5.972 * 1E24, vector2_create(-perihelion_1, 0)); - // const double MARS_MASS = 6.39 * 1E23; - // double e_2 = 0.0934; - // double semi_major_2 = 227.9 * 1E9; - // double perihelion_2 = semi_major_2 * (1 - e_2); - // Vector2 *mars_position = vector2_create(-perihelion_2, 0); - // solar_system->celestial_objects[2] = celestial_object_create(MARS_MASS, mars_position); - - // const double VENUS_MASS = 4.867 * 1E24; - // double e_3 = 0.00678; - // double semi_major_3 = 108.2095 * 1E9; - // double perihelion_3 = semi_major_3 * (1 - e_3); - // Vector2 *venus_position = vector2_create(-perihelion_3, 0); - // solar_system->celestial_objects[3] = celestial_object_create(VENUS_MASS, venus_position); + double perihelion_2 = 227.9 * 1E9 * (1 - 0.0934); + solar_system->objects[2] = celestial_object_create(6.39 * 1E23, vector2_create(-perihelion_2, 0)); return solar_system; } +Vector2 gravit(CelestialObject *sun, CelestialObject *b) { + Vector2 r = vector2_multiply(b->current_position, -1); + double afff = G * sun->mass * b->mass * (1.0 / pow(vector2_norm(r), 3)); + Vector2 f = vector2_multiply(r, afff); + Vector2 a = vector2_multiply(f, 1.0 / b->mass); + return a; +} + void solar_system_update(SolarSystem *solar_system) { + for (int32_t i = 1; i < solar_system->objects_length; i += 1) { + CelestialObject *object = solar_system->objects[i]; + + if (vector2_is_zero(solar_system->objects[i]->previous_position)) { + // https://i.ytimg.com/vi/hbEbD1Z_tNQ/maxresdefault.jpg + + CelestialObject *star = solar_system->objects[0]; + double perihelion_speed = 0; + + if (i == 1) { + perihelion_speed = sqrt((G * star->mass * (1 + 0.01671123)) / (149.6 * 1E9 * (1 - 0.01671123))); + } else if (i == 2) { + perihelion_speed = sqrt((G * star->mass * (1 + 0.0934)) / (227.9 * 1E9 * (1 - 0.0934))); + printf("%lf\n", perihelion_speed); + } + + Vector2 tmp = object->current_position; + Vector2 r = vector2_normalize(vector2_create(-tmp.y, tmp.x)); + Vector2 v = vector2_multiply(r, perihelion_speed); + + Vector2 current_position = object->current_position; + Vector2 new_position = vector2_add(current_position, vector2_multiply(v, solar_system->interval)); + object->previous_position = object->current_position; + object->current_position = new_position; + } else { + Vector2 new_position = vector2_substract(vector2_multiply(object->current_position, 2), object->previous_position); + Vector2 a = gravit(solar_system->objects[0], object); + new_position = vector2_add(new_position, vector2_multiply(a, pow(solar_system->interval, 2))); + object->previous_position = object->current_position; + object->current_position = new_position; + } + } } void solar_system_draw(SolarSystem *solar_system, struct gfx_context_t *context) { for (uint32_t i = 0; i < solar_system->objects_length; i += 1) { CelestialObject *object = solar_system->objects[i]; - Vector2 scaled_position = vector2_multiply(object->current_position, 1.0 / (227.9 * 1E9 * 1.1)); + Vector2 scaled_position = vector2_multiply(object->current_position, 1.0 / (300 * 1E9)); scaled_position = vector2_fit_canvas(scaled_position, SCREEN_WIDTH, SCREEN_HEIGHT); if (i == 0) { @@ -56,11 +87,7 @@ void solar_system_draw(SolarSystem *solar_system, struct gfx_context_t *context) } if (i == 2) { - draw_full_circle(context, scaled_position.x, scaled_position.y, 8, COLOR_RED); - } - - if (i == 3) { - draw_full_circle(context, scaled_position.x, scaled_position.y, 15, COLOR_GREEN); + draw_full_circle(context, scaled_position.x, scaled_position.y, 10, COLOR_RED); } } } diff --git a/SolarSystem.h b/SolarSystem.h index 139a1253eab62d9384826d03221586a926a16978..a9f10107c5a91daaa50c62e2b19881d08c4479fd 100644 --- a/SolarSystem.h +++ b/SolarSystem.h @@ -9,6 +9,7 @@ typedef struct { uint32_t objects_length; CelestialObject **objects; + double interval; } SolarSystem; SolarSystem *solar_system_create(double interval); diff --git a/Vector2.c b/Vector2.c index 8e91e99d1fdc5de0117b3110485ae022f356487f..0770586bcb122fb80859f8a33e6a00b29c987728 100644 --- a/Vector2.c +++ b/Vector2.c @@ -13,6 +13,10 @@ Vector2 vector2_create_zero() { return vector2_create(0, 0); } +bool vector2_is_zero(Vector2 v) { + return v.x == 0 && v.y == 0; +} + Vector2 vector2_add(Vector2 a, Vector2 b) { return vector2_create(a.x + b.x, a.y + b.y); } diff --git a/Vector2.h b/Vector2.h index 1045c99ea563cd3b1d9adf3aba97158d673e2176..5193d60d64997442db950d8b138b51541b128827 100644 --- a/Vector2.h +++ b/Vector2.h @@ -12,6 +12,7 @@ struct Vector2 { Vector2 vector2_create(double x, double y); Vector2 vector2_create_zero(); +bool vector2_is_zero(Vector2 v); Vector2 vector2_add(Vector2 a, Vector2 b); Vector2 vector2_substract(Vector2 a, Vector2 b); Vector2 vector2_multiply(Vector2 v, double scalar); diff --git a/main.c b/main.c index 30429fa7dbb041ffcf01aa71b4ed67ca24129f20..332db2e753df5adbcb048f227a25df5f7b43a309 100644 --- a/main.c +++ b/main.c @@ -21,12 +21,13 @@ int main() { return EXIT_FAILURE; } - SolarSystem *solar_system = solar_system_create(0); + SolarSystem *solar_system = solar_system_create(10000); while (true) { gfx_present(context); gfx_clear(context, COLOR_BLACK); + solar_system_update(solar_system); solar_system_draw(solar_system, context); if (gfx_keypressed() == SDLK_ESCAPE) {