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) { ...@@ -9,7 +9,7 @@ CelestialObject *celestial_object_create(double mass, Vector2 position) {
CelestialObject *object = (CelestialObject*)malloc(sizeof(CelestialObject)); CelestialObject *object = (CelestialObject*)malloc(sizeof(CelestialObject));
object->mass = mass; object->mass = mass;
// object->previous_position = NULL; object->previous_position = vector2_create_zero();
object->current_position = position; object->current_position = position;
return object; return object;
......
TARGET = main TARGET = main
CC:=gcc CC:=gcc
# CFLAGS:=-g -Ofast -Wall -Wextra -fsanitize=address -fsanitize=leak -std=gnu11 # CFLAGS:=-g -Ofast -Wall -Wextra -fsanitize=address -fsanitize=leak -std=gnu11
CFLAGS:=-fsanitize=address # CFLAGS:=-fsanitize=address
LDFLAGS:=-lm -lSDL2 LDFLAGS:=-lm -lSDL2
VPATH:=gfx VPATH:=gfx
......
...@@ -8,43 +8,74 @@ ...@@ -8,43 +8,74 @@
#define SCREEN_WIDTH 1000 #define SCREEN_WIDTH 1000
#define SCREEN_HEIGHT 1000 #define SCREEN_HEIGHT 1000
const double G = 6.67430 * 1E-11;
SolarSystem *solar_system_create(double interval) { SolarSystem *solar_system_create(double interval) {
SolarSystem *solar_system = (SolarSystem *)malloc(sizeof(SolarSystem)); 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->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)); solar_system->objects[0] = celestial_object_create(1.989 * 1E30, vector2_create(0, 0));
double perihelion_1 = 149.6 * 1E9 * (1 - 0.01671123); double perihelion_1 = 149.6 * 1E9 * (1 - 0.01671123);
solar_system->objects[1] = celestial_object_create(5.972 * 1E24, vector2_create(-perihelion_1, 0)); solar_system->objects[1] = celestial_object_create(5.972 * 1E24, vector2_create(-perihelion_1, 0));
// const double MARS_MASS = 6.39 * 1E23; double perihelion_2 = 227.9 * 1E9 * (1 - 0.0934);
// double e_2 = 0.0934; solar_system->objects[2] = celestial_object_create(6.39 * 1E23, vector2_create(-perihelion_2, 0));
// 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);
return solar_system; 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) { 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) { void solar_system_draw(SolarSystem *solar_system, struct gfx_context_t *context) {
for (uint32_t i = 0; i < solar_system->objects_length; i += 1) { for (uint32_t i = 0; i < solar_system->objects_length; i += 1) {
CelestialObject *object = solar_system->objects[i]; 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); scaled_position = vector2_fit_canvas(scaled_position, SCREEN_WIDTH, SCREEN_HEIGHT);
if (i == 0) { if (i == 0) {
...@@ -56,11 +87,7 @@ void solar_system_draw(SolarSystem *solar_system, struct gfx_context_t *context) ...@@ -56,11 +87,7 @@ void solar_system_draw(SolarSystem *solar_system, struct gfx_context_t *context)
} }
if (i == 2) { if (i == 2) {
draw_full_circle(context, scaled_position.x, scaled_position.y, 8, COLOR_RED); draw_full_circle(context, scaled_position.x, scaled_position.y, 10, COLOR_RED);
}
if (i == 3) {
draw_full_circle(context, scaled_position.x, scaled_position.y, 15, COLOR_GREEN);
} }
} }
} }
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
typedef struct { typedef struct {
uint32_t objects_length; uint32_t objects_length;
CelestialObject **objects; CelestialObject **objects;
double interval;
} SolarSystem; } SolarSystem;
SolarSystem *solar_system_create(double interval); SolarSystem *solar_system_create(double interval);
......
...@@ -13,6 +13,10 @@ Vector2 vector2_create_zero() { ...@@ -13,6 +13,10 @@ Vector2 vector2_create_zero() {
return vector2_create(0, 0); 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) { Vector2 vector2_add(Vector2 a, Vector2 b) {
return vector2_create(a.x + b.x, a.y + b.y); return vector2_create(a.x + b.x, a.y + b.y);
} }
......
...@@ -12,6 +12,7 @@ struct Vector2 { ...@@ -12,6 +12,7 @@ struct Vector2 {
Vector2 vector2_create(double x, double y); Vector2 vector2_create(double x, double y);
Vector2 vector2_create_zero(); Vector2 vector2_create_zero();
bool vector2_is_zero(Vector2 v);
Vector2 vector2_add(Vector2 a, Vector2 b); Vector2 vector2_add(Vector2 a, Vector2 b);
Vector2 vector2_substract(Vector2 a, Vector2 b); Vector2 vector2_substract(Vector2 a, Vector2 b);
Vector2 vector2_multiply(Vector2 v, double scalar); Vector2 vector2_multiply(Vector2 v, double scalar);
......
...@@ -21,12 +21,13 @@ int main() { ...@@ -21,12 +21,13 @@ int main() {
return EXIT_FAILURE; return EXIT_FAILURE;
} }
SolarSystem *solar_system = solar_system_create(0); SolarSystem *solar_system = solar_system_create(10000);
while (true) { while (true) {
gfx_present(context); gfx_present(context);
gfx_clear(context, COLOR_BLACK); gfx_clear(context, COLOR_BLACK);
solar_system_update(solar_system);
solar_system_draw(solar_system, context); solar_system_draw(solar_system, context);
if (gfx_keypressed() == SDLK_ESCAPE) { 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