diff --git a/CelestialObject.c b/CelestialObject.c index 1bc7bacda333f4c64c48c29611feaa84bb1d6fe9..363c685435d50afe382cbc9d28d2c7f148c5fe09 100644 --- a/CelestialObject.c +++ b/CelestialObject.c @@ -8,7 +8,7 @@ #include "drawing.h" const double G = 6.67430 * 1E-11; -const int32_t PREVIOUS_POSITIONS_MAXIMUM_LENGTH = 200; +const int32_t PREVIOUS_POSITIONS_MAXIMUM_LENGTH = 300; CelestialObject *celestial_object_create(char *name, double mass, double semi_major_axis, double eccentricity, int32_t drawing_disc_radius, int32_t drawing_color) { CelestialObject *object = (CelestialObject *)malloc(sizeof(CelestialObject)); @@ -37,6 +37,30 @@ void celestial_object_destroy(CelestialObject *object) { free(object); } +int32_t get_zoomed_drawing_disc_radius(CelestialObject *object, double zoom_factor) { + if (zoom_factor < 1) { + return object->drawing_disc_radius * zoom_factor; + } + + return object->drawing_disc_radius; +} + +Vector2 calculate_gravitational_acceleration(int32_t object_index, CelestialObject **objects, int32_t objects_length) { + Vector2 a = vector2_create_zero(); + + for (int32_t i = 0; i < objects_length; i += 1) { + if (i == object_index) { + continue; + } + + Vector2 r = vector2_substract((i < object_index) ? objects[i]->previous_position : objects[i]->position, objects[object_index]->position); + double a_scalar = G * objects[i]->mass * pow(pow(vector2_norm(r), 2), -1); + a = vector2_add(a, vector2_multiply(vector2_normalize(r), a_scalar)); + } + + return a; +} + void celestial_object_first_update(int32_t object_index, CelestialObject **objects, int32_t objects_length, int32_t main_object_index) { CelestialObject *object = objects[object_index]; CelestialObject *main_object = objects[main_object_index]; @@ -71,22 +95,6 @@ void celestial_object_update(int32_t object_index, CelestialObject **objects, in celestial_object_update_previous_positions(object); } -Vector2 calculate_gravitational_acceleration(int32_t object_index, CelestialObject **objects, int32_t objects_length) { - Vector2 a = vector2_create_zero(); - - for (int32_t i = 0; i < objects_length; i += 1) { - if (i == object_index) { - continue; - } - - Vector2 r = vector2_substract((i < object_index) ? objects[i]->previous_position : objects[i]->position, objects[object_index]->position); - double a_scalar = G * objects[i]->mass * pow(pow(vector2_norm(r), 2), -1); - a = vector2_add(a, vector2_multiply(vector2_normalize(r), a_scalar)); - } - - return a; -} - void celestial_object_update_previous_positions(CelestialObject *object) { object->previous_positions[0] = object->position; int32_t length = object->previous_positions_length; @@ -118,14 +126,6 @@ void celestial_object_draw(CelestialObject *object, Vector2 reference_frame, dou } } -int32_t get_zoomed_drawing_disc_radius(CelestialObject *object, double zoom_factor) { - if (zoom_factor < 1) { - return object->drawing_disc_radius * zoom_factor; - } - - return object->drawing_disc_radius; -} - void celestial_object_draw_name(CelestialObject *object, Vector2 reference_frame, double zoom_factor) { Vector2 scaled_position = scale_position(object->position, reference_frame, zoom_factor); diff --git a/CelestialObject.h b/CelestialObject.h index d395fbdd387f7fe1a657b49f086e1f81ca6114e0..228f870a4be2ef9e06bae066d3971edb1a53d608 100644 --- a/CelestialObject.h +++ b/CelestialObject.h @@ -18,12 +18,12 @@ typedef struct CelestialObject { CelestialObject *celestial_object_create(char *name, double mass, double semi_major_axis, double eccentricity, int32_t drawing_disc_radius, int32_t drawing_color); void celestial_object_destroy(CelestialObject *object); +int32_t get_zoomed_drawing_disc_radius(CelestialObject *object, double zoom_factor); +Vector2 calculate_gravitational_acceleration(int32_t object_index, CelestialObject **objects, int32_t objects_length); void celestial_object_first_update(int32_t object_index, CelestialObject **objects, int32_t objects_length, int32_t main_object_index); void celestial_object_update(int32_t object_index, CelestialObject **objects, int32_t objects_length, double interval, double previous_interval); -Vector2 calculate_gravitational_acceleration(int32_t object_index, CelestialObject **objects, int32_t objects_length); void celestial_object_update_previous_positions(CelestialObject *object); void celestial_object_draw(CelestialObject *object, Vector2 reference_frame, double zoom_factor); -int32_t get_zoomed_drawing_disc_radius(CelestialObject *object, double zoom_factor); void celestial_object_draw_name(CelestialObject *object, Vector2 reference_frame, double zoom_factor); #endif