Skip to content
Snippets Groups Projects
Commit 8482e278 authored by Florian Burgener's avatar Florian Burgener
Browse files

Gravity is working

parent ab22d687
No related branches found
No related tags found
No related merge requests found
......@@ -9,7 +9,7 @@ CelestialObject *celestial_object_create(double mass, Vector2 position) {
CelestialObject *object = (CelestialObject*)malloc(sizeof(CelestialObject));
object->mass = mass;
// object->previous_position = NULL;
object->previous_position = vector2_create_zero();
object->current_position = position;
return object;
......
TARGET = main
CC:=gcc
# CFLAGS:=-g -Ofast -Wall -Wextra -fsanitize=address -fsanitize=leak -std=gnu11
CFLAGS:=-fsanitize=address
# CFLAGS:=-fsanitize=address
LDFLAGS:=-lm -lSDL2
VPATH:=gfx
......
......@@ -8,43 +8,74 @@
#define SCREEN_WIDTH 1000
#define SCREEN_HEIGHT 1000
const double G = 6.67430 * 1E-11;
SolarSystem *solar_system_create(double interval) {
SolarSystem *solar_system = (SolarSystem *)malloc(sizeof(SolarSystem));
solar_system->objects_length = 2;
solar_system->objects_length = 3;
solar_system->objects = (CelestialObject **)malloc(sizeof(SolarSystem *) * solar_system->objects_length);
solar_system->interval = interval;
solar_system->objects[0] = celestial_object_create(1.989 * 1E30, vector2_create(0, 0));
double perihelion_1 = 149.6 * 1E9 * (1 - 0.01671123);
solar_system->objects[1] = celestial_object_create(5.972 * 1E24, vector2_create(-perihelion_1, 0));
// const double MARS_MASS = 6.39 * 1E23;
// double e_2 = 0.0934;
// double semi_major_2 = 227.9 * 1E9;
// double perihelion_2 = semi_major_2 * (1 - e_2);
// Vector2 *mars_position = vector2_create(-perihelion_2, 0);
// solar_system->celestial_objects[2] = celestial_object_create(MARS_MASS, mars_position);
// const double VENUS_MASS = 4.867 * 1E24;
// double e_3 = 0.00678;
// double semi_major_3 = 108.2095 * 1E9;
// double perihelion_3 = semi_major_3 * (1 - e_3);
// Vector2 *venus_position = vector2_create(-perihelion_3, 0);
// solar_system->celestial_objects[3] = celestial_object_create(VENUS_MASS, venus_position);
double perihelion_2 = 227.9 * 1E9 * (1 - 0.0934);
solar_system->objects[2] = celestial_object_create(6.39 * 1E23, vector2_create(-perihelion_2, 0));
return solar_system;
}
Vector2 gravit(CelestialObject *sun, CelestialObject *b) {
Vector2 r = vector2_multiply(b->current_position, -1);
double afff = G * sun->mass * b->mass * (1.0 / pow(vector2_norm(r), 3));
Vector2 f = vector2_multiply(r, afff);
Vector2 a = vector2_multiply(f, 1.0 / b->mass);
return a;
}
void solar_system_update(SolarSystem *solar_system) {
for (int32_t i = 1; i < solar_system->objects_length; i += 1) {
CelestialObject *object = solar_system->objects[i];
if (vector2_is_zero(solar_system->objects[i]->previous_position)) {
// https://i.ytimg.com/vi/hbEbD1Z_tNQ/maxresdefault.jpg
CelestialObject *star = solar_system->objects[0];
double perihelion_speed = 0;
if (i == 1) {
perihelion_speed = sqrt((G * star->mass * (1 + 0.01671123)) / (149.6 * 1E9 * (1 - 0.01671123)));
} else if (i == 2) {
perihelion_speed = sqrt((G * star->mass * (1 + 0.0934)) / (227.9 * 1E9 * (1 - 0.0934)));
printf("%lf\n", perihelion_speed);
}
Vector2 tmp = object->current_position;
Vector2 r = vector2_normalize(vector2_create(-tmp.y, tmp.x));
Vector2 v = vector2_multiply(r, perihelion_speed);
Vector2 current_position = object->current_position;
Vector2 new_position = vector2_add(current_position, vector2_multiply(v, solar_system->interval));
object->previous_position = object->current_position;
object->current_position = new_position;
} else {
Vector2 new_position = vector2_substract(vector2_multiply(object->current_position, 2), object->previous_position);
Vector2 a = gravit(solar_system->objects[0], object);
new_position = vector2_add(new_position, vector2_multiply(a, pow(solar_system->interval, 2)));
object->previous_position = object->current_position;
object->current_position = new_position;
}
}
}
void solar_system_draw(SolarSystem *solar_system, struct gfx_context_t *context) {
for (uint32_t i = 0; i < solar_system->objects_length; i += 1) {
CelestialObject *object = solar_system->objects[i];
Vector2 scaled_position = vector2_multiply(object->current_position, 1.0 / (227.9 * 1E9 * 1.1));
Vector2 scaled_position = vector2_multiply(object->current_position, 1.0 / (300 * 1E9));
scaled_position = vector2_fit_canvas(scaled_position, SCREEN_WIDTH, SCREEN_HEIGHT);
if (i == 0) {
......@@ -56,11 +87,7 @@ void solar_system_draw(SolarSystem *solar_system, struct gfx_context_t *context)
}
if (i == 2) {
draw_full_circle(context, scaled_position.x, scaled_position.y, 8, COLOR_RED);
}
if (i == 3) {
draw_full_circle(context, scaled_position.x, scaled_position.y, 15, COLOR_GREEN);
draw_full_circle(context, scaled_position.x, scaled_position.y, 10, COLOR_RED);
}
}
}
......@@ -9,6 +9,7 @@
typedef struct {
uint32_t objects_length;
CelestialObject **objects;
double interval;
} SolarSystem;
SolarSystem *solar_system_create(double interval);
......
......@@ -13,6 +13,10 @@ Vector2 vector2_create_zero() {
return vector2_create(0, 0);
}
bool vector2_is_zero(Vector2 v) {
return v.x == 0 && v.y == 0;
}
Vector2 vector2_add(Vector2 a, Vector2 b) {
return vector2_create(a.x + b.x, a.y + b.y);
}
......
......@@ -12,6 +12,7 @@ struct Vector2 {
Vector2 vector2_create(double x, double y);
Vector2 vector2_create_zero();
bool vector2_is_zero(Vector2 v);
Vector2 vector2_add(Vector2 a, Vector2 b);
Vector2 vector2_substract(Vector2 a, Vector2 b);
Vector2 vector2_multiply(Vector2 v, double scalar);
......
......@@ -21,12 +21,13 @@ int main() {
return EXIT_FAILURE;
}
SolarSystem *solar_system = solar_system_create(0);
SolarSystem *solar_system = solar_system_create(10000);
while (true) {
gfx_present(context);
gfx_clear(context, COLOR_BLACK);
solar_system_update(solar_system);
solar_system_draw(solar_system, context);
if (gfx_keypressed() == SDLK_ESCAPE) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment