#include "CelestialObject.h" #include <GL/glut.h> #include <stdlib.h> #include <string.h> #include "drawing.h" #define G 6.67e-11 #define SUN_MASS 1.989e30 CelestialObject *celestial_object_create(char *name, double mass, double semi_major_axis, double eccentricity, uint32_t drawing_disc_radius, uint32_t drawing_color) { CelestialObject *object = (CelestialObject *)malloc(sizeof(CelestialObject)); strcpy(object->name, name); object->mass = mass; object->previous_position = vector2_create_zero(); double periapsis = semi_major_axis * (1 - eccentricity); object->current_position = vector2_create(-periapsis, 0); object->semi_major_axis = semi_major_axis; object->eccentricity = eccentricity; object->drawing_disc_radius = drawing_disc_radius; object->drawing_color = drawing_color; object->points = (Vector2 *)malloc(sizeof(Vector2) * 200); object->points_length = 0; return object; } void celestial_object_draw(CelestialObject *object, Vector2 reference_frame, double zoom_factor) { Vector2 scaled_position = scale_position(zoom_factor, object->current_position, reference_frame); uint32_t color = object->drawing_color; glColor3ub((color & 0xFF0000) >> 16, (color & 0x00FF00) >> 8, (color & 0x0000FF) >> 0); if (zoom_factor < 1) draw_disc(scaled_position, object->drawing_disc_radius * zoom_factor); else draw_disc(scaled_position, object->drawing_disc_radius); if (strcmp(object->name, "Moon") != 0) { if (zoom_factor < 1) glLineWidth(4.0 * zoom_factor); else glLineWidth(4.0); for (int32_t j = 0; j < object->points_length - 1; j += 1) { Vector2 p1 = scale_position(zoom_factor, object->points[j], reference_frame); Vector2 p2 = scale_position(zoom_factor, object->points[j + 1], reference_frame); draw_line(p1, p2); } } // celestial_object_draw_name(object, reference_frame,zoom_factor); } void celestial_object_draw_name(CelestialObject *object, Vector2 reference_frame, double zoom_factor) { Vector2 scaled_position = scale_position(zoom_factor, object->current_position, reference_frame); if (strcmp(object->name, "Moon") == 0 && zoom_factor < 36) { return; } draw_text(object->name, vector2_add(scaled_position, vector2_create(object->drawing_disc_radius + 8, 7))); }