Select Git revision
CelestialObject.c
CelestialObject.c 2.27 KiB
#include "CelestialObject.h"
#include <GL/glut.h>
#include <stdlib.h>
#include <string.h>
#include "drawing.h"
const int32_t PREVIOUS_POSITIONS_LENGTH = 200;
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->previous_positions = (Vector2 *)malloc(sizeof(Vector2) * PREVIOUS_POSITIONS_LENGTH);
object->previous_positions_length = 0;
return object;
}
uint32_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(CelestialObject *object, Vector2 reference_frame, double zoom_factor) {
uint32_t color = object->drawing_color;
glColor3ub((color & 0xFF0000) >> 16, (color & 0x00FF00) >> 8, (color & 0x0000FF) >> 0);
Vector2 scaled_position = scale_position(zoom_factor, object->current_position, reference_frame);
draw_disc(scaled_position, get_zoomed_drawing_disc_radius(object, zoom_factor));
if (strcmp(object->name, "Moon") != 0) {
draw_scaled_lines(object->previous_positions, object->previous_positions_length, 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;
}
uint32_t zoomed_drawing_disc_radius = get_zoomed_drawing_disc_radius(object, zoom_factor);
draw_text(object->name, vector2_add(scaled_position, vector2_create(zoomed_drawing_disc_radius + 5, -10)));
}