diff --git a/PlanetarySystem.c b/PlanetarySystem.c index efbda9bbcc987848c226f52de03afd4b5cb08624..a27f9eed57a0a5d763435501f0f7ecbd1e2629a4 100644 --- a/PlanetarySystem.c +++ b/PlanetarySystem.c @@ -36,6 +36,8 @@ PlanetarySystem *planetary_system_create(double interval) { planetary_system->objects_length = 6; planetary_system->objects = (CelestialObject **)malloc(sizeof(PlanetarySystem *) * planetary_system->objects_length); planetary_system->interval = interval; + planetary_system->zoom_factor = 1; + planetary_system->reference_frame_object_index = 0; planetary_system->objects[0] = celestial_object_create(SUN_MASS, 0, 0, 50, 0x00FFFFFF); planetary_system->objects[1] = celestial_object_create(MERCURY_MASS, MERCURY_SEMI_MAJOR_AXIS, MERCURY_ECCENTRICITY, 10, 0x00DBCECA); @@ -88,13 +90,11 @@ void planetary_system_update(PlanetarySystem *planetary_system) { Vector2 r = vector2_normalize(vector2_create(current_position.y, -current_position.x)); Vector2 periapsis_velocity = vector2_multiply(r, periapsis_velocity_scalar); - vector2_print(periapsis_velocity); new_position = vector2_add(current_position, vector2_multiply(periapsis_velocity, planetary_system->interval)); Vector2 a = calculate_gravitational_acceleration(planetary_system, i); new_position = vector2_add(new_position, vector2_multiply(a, 0.5 * pow(planetary_system->interval, 2))); } else { - // continue; new_position = vector2_substract(vector2_multiply(current_position, 2), object->previous_position); Vector2 a = calculate_gravitational_acceleration(planetary_system, i); new_position = vector2_add(new_position, vector2_multiply(a, pow(planetary_system->interval, 2))); @@ -116,9 +116,9 @@ void planetary_system_draw(PlanetarySystem *planetary_system, struct gfx_context for (uint32_t i = 0; i < planetary_system->objects_length; i += 1) { CelestialObject *object = planetary_system->objects[i]; - // Vector2 tmp = vector2_substract(object->current_position, planetary_system->objects[3]->current_position); - // tmp = vector2_multiply(tmp, 1); - Vector2 scaled_position = scale_position(object->current_position); + Vector2 tmp = vector2_substract(object->current_position, planetary_system->objects[planetary_system->reference_frame_object_index]->current_position); + tmp = vector2_multiply(tmp, planetary_system->zoom_factor); + Vector2 scaled_position = scale_position(tmp); draw_full_circle(context, scaled_position.x, scaled_position.y, object->drawing_disc_radius, object->drawing_color); } diff --git a/PlanetarySystem.h b/PlanetarySystem.h index 9fb902ab7cba65b7548fc9e111f04c6308fe28fa..dca040ac4f4cfb1b372d76619603e0be6ef17521 100644 --- a/PlanetarySystem.h +++ b/PlanetarySystem.h @@ -13,6 +13,8 @@ typedef struct { uint32_t objects_length; CelestialObject **objects; double interval; + double zoom_factor; + uint32_t reference_frame_object_index; } PlanetarySystem; PlanetarySystem *planetary_system_create(double interval); diff --git a/main.c b/main.c index d21add36503dab0b00bee9da06b481fa0cd85133..0aeb50b7014ed458260aa1daa7b3935d01b21342 100644 --- a/main.c +++ b/main.c @@ -18,8 +18,8 @@ int main() { return EXIT_FAILURE; } - int32_t time_elapsing_per_second = 3600 * 24 * 10; - int32_t refresh_rate = 480; + int32_t time_elapsing_per_second = 3600 * 24 * 5; + int32_t refresh_rate = 240; int32_t elapsed_time = 0; double sleep_duration = 1.0 / refresh_rate * 1E9; printf("%lf\n", (double)time_elapsing_per_second / refresh_rate); @@ -39,8 +39,42 @@ int main() { SDL_SetWindowTitle(context->window, title); } - if (gfx_keypressed() == SDLK_ESCAPE) - break; + SDL_Event event; + if (SDL_PollEvent(&event)) { + if (event.type == SDL_MOUSEWHEEL) { + if (event.wheel.y > 0) { + planetary_system->zoom_factor *= 1.1; + } else if (event.wheel.y < 0) { + planetary_system->zoom_factor /= 1.1; + + if (planetary_system->zoom_factor < 1) { + planetary_system->zoom_factor = 1; + } + } + } + + if (event.type == SDL_KEYDOWN) { + if (event.key.keysym.sym == SDLK_ESCAPE) { + break; + } + + if (event.key.keysym.sym == SDLK_LEFT) { + planetary_system->reference_frame_object_index -= 1; + planetary_system->reference_frame_object_index %= planetary_system->objects_length; + } + + if (event.key.keysym.sym == SDLK_RIGHT) { + planetary_system->reference_frame_object_index += 1; + planetary_system->reference_frame_object_index %= planetary_system->objects_length; + } + } + } + + // if (gfx_keypressed() == SDLK_ESCAPE) + // break; + // if (gfx_keypressed() == SDL_MOUSEBUTTONDOWN) { + // printf("A"); + // } struct timespec t = {.tv_sec = 0, .tv_nsec = sleep_duration}; nanosleep(&t, NULL); elapsed_time += 1;