-
Florian Burgener authoredFlorian Burgener authored
CelestialObject.c 2.36 KiB
#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)));
}