From 6f23a2ddc9c308a57b320a775e7e1f62c865882f Mon Sep 17 00:00:00 2001 From: "fardin.hossain" <fardin.hossain@etu.hesge.ch> Date: Sun, 16 Jun 2019 20:24:16 +0200 Subject: [PATCH] test first --- box_lib.c | 91 ++++++++++++++++++++++++++ box_lib.h | 31 +++++++++ corbeille.txt | 56 ++++++++++++++++ galaxy_lib.c | 160 ++++++++++++++++++++++++++++++++++++++++++++++ galaxy_lib.h | 35 ++++++++++ gfx.c | 94 +++++++++++++++++++++++++++ gfx.h | 37 +++++++++++ main.c | 64 +++++++++++++++++++ quad_tree.c | 173 ++++++++++++++++++++++++++++++++++++++++++++++++++ quad_tree.h | 43 +++++++++++++ star_lib.c | 113 +++++++++++++++++++++++++++++++++ star_lib.h | 37 +++++++++++ vecteur_lib.c | 105 ++++++++++++++++++++++++++++++ vecteur_lib.h | 32 ++++++++++ 14 files changed, 1071 insertions(+) create mode 100644 box_lib.c create mode 100644 box_lib.h create mode 100644 corbeille.txt create mode 100644 galaxy_lib.c create mode 100644 galaxy_lib.h create mode 100644 gfx.c create mode 100644 gfx.h create mode 100644 main.c create mode 100644 quad_tree.c create mode 100644 quad_tree.h create mode 100644 star_lib.c create mode 100644 star_lib.h create mode 100644 vecteur_lib.c create mode 100644 vecteur_lib.h diff --git a/box_lib.c b/box_lib.c new file mode 100644 index 0000000..f0327d0 --- /dev/null +++ b/box_lib.c @@ -0,0 +1,91 @@ +#include "box_lib.h" +#include "vecteur_lib.h" +#include "math.h" +#include <stdio.h> +#include <stdlib.h> + +box new_box(double x0, double x1, double y0, double y1) { + + box la_boite; + + la_boite.x0 = x0; + la_boite.x1 = x1; + la_boite.y0 = y0; + la_boite.y1 = y1; + + return la_boite; +} + +box *divide_in_four(box b) { + + box* box_array = malloc(4 * sizeof(box)); + + double x0 = b.x0; + double x1 = b.x1; + double y0 = b.y0; + double y1 = b.y1; + + box haut_gauche = new_box(x0, (x1 /2.0), (y1 / 2.0), y1); + box haut_droite = new_box((x1 /2.0), x1, (y1 / 2.0), y1); + box bas_gauche = new_box(x0, (x1 /2.0), y0, (y1 /2)); + box bas_droite = new_box((x1 /2.0), x1, y0, (y1 /2)); + + box_array[0] = haut_gauche; + box_array[1] = haut_droite; + box_array[2] = bas_gauche; + box_array[3] = bas_droite; + + return box_array; + +} + +bool is_inside(box b, vec v){ + + if ((v.x >= b.x0 && v.x <= b.x1) && ((v.y >= b.y0 && v.y <= b.y1))) { + return true; + } + else { + return false; + } + +} + +double compute_length(box b) { + + double largeur = (b.x1 - b.x0); + double longueur = (b.y1 - b.y0); + + if (longueur < largeur) { + return largeur; + } + else { + return longueur; + } +} + +void print_box(box b) { + printf("x0 : {%f, %f} et x1 : {%f, %f}\n", b.x0, b.y0, b.x1, b.y1); +} + + +void tests_de_box() { + + printf("hellox box\n"); + + box boite = new_box(0.0,20.0,0.0,30.0); + + box* tab_de_boxes = divide_in_four(boite); + + for (int i = 0; i < 4; i++) { + print_box(tab_de_boxes[i]); + } + + vec* point = new_vec(15.0, 22.0); + bool dedans = is_inside(boite, *point); + + printf("dedans ou pas ? (1 = vrai et 0 = faux) : %d\n", dedans); + + printf("longue dist : %f\n", compute_length(boite)); + + +} \ No newline at end of file diff --git a/box_lib.h b/box_lib.h new file mode 100644 index 0000000..0ebf6b2 --- /dev/null +++ b/box_lib.h @@ -0,0 +1,31 @@ +#include "vecteur_lib.h" + +#include <stdbool.h> + +#if !defined(__BOX_LIB__H__) + + #define __BOX_LIB__H__ + + typedef struct __box { + double x0, x1, y0, y1; + } box; + + // Création d’une nouvelle box + box new_box(double x0, double x1, double y0, double y1); + + // Division d’une box en quatre parties égales + box *divide_in_four(box b); + + // Déterminer si une position est à l’intérieur de la box + bool is_inside(box b, vec v); + + //Déterminer la taille maximale d’un des côtés de la box + double compute_length(box b); + + // Affiche la box (utile pour le débogage) + void print_box(box b); + + + void tests_de_box(); + +#endif \ No newline at end of file diff --git a/corbeille.txt b/corbeille.txt new file mode 100644 index 0000000..876cb42 --- /dev/null +++ b/corbeille.txt @@ -0,0 +1,56 @@ +all: box + + + + +box: box.o vecteur.o + gcc -o box box.o vecteur.o + +vecteur.o : vecteur_lib.c vecteur_lib.h + gcc -o vecteur.o -c vecteur_lib.c -lm -W -Wall + +box.o : box_lib.c + gcc -o box.o -c box_lib.c -W -Wall + + + + + + +star: + gcc -o star star_lib.c + + + + + +bon + + + +all: gal +.PHONY : all + + +gal : galaxy.o box.o vecteur.o star.o + gcc -o gal galaxy.o box.o vecteur.o star.o -lm + + + +vecteur.o : vecteur_lib.c + gcc -o vecteur.o -c vecteur_lib.c -lm -W -Wall + +box.o : box_lib.c + gcc -o box.o -c box_lib.c -W -Wall -lm + +star.o : star_lib.c + gcc -o star.o -c star_lib.c -W -Wall -lm + +galaxy.o : galaxy_lib.c + gcc -o galaxy.o galaxy_lib.c -W -Wall -lm + + +clean: + rm gal box.o vecteur.o star.o galaxy.o + + diff --git a/galaxy_lib.c b/galaxy_lib.c new file mode 100644 index 0000000..1c15864 --- /dev/null +++ b/galaxy_lib.c @@ -0,0 +1,160 @@ +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> +#include <string.h> + +#include "galaxy_lib.h" +#include "star_lib.h" +#include "box_lib.h" +#include "box_lib.c" // cest nimporte quoi +#include "vecteur_lib.h" + + +#include <math.h> +#include <time.h> + + +#define G 6.67E-11 + + +// Generer un nombre aléatoire (de type double) +double randFrom(double min, double max) { + double range = (max - min); + double div = RAND_MAX / range; + return min + (rand() / div); +} + +galaxy *create_and_init_galaxy(int num_bodies, box b, double dt) { + + star** stars = malloc(num_bodies * sizeof(star*)); + + // Initialization super star: + vec* zero_vec = new_vec(0.0, 0.0); + stars[0] = new_star_vel( + *zero_vec, // init pos + *zero_vec, // init velocity + *zero_vec, // init acceleration + (m_solar * pow(10.0, 6.0)), // mass + 0.0 // init dt + ); + + for(int i = 1; i < num_bodies; i++) { + // Randomize a position + vec* r_i_prototype = new_vec(0.5 - randFrom(0.0, 1.0), 0.5 - randFrom(0.0, 1.0)); + double alpha = R * (log10(1.0 - randFrom(0.0, 1.0))) / 1.8; + vec* r_i = mul_vec(alpha, r_i_prototype); + //print_vec(r_i_prototype); + //printf("alpha = %g\n", alpha); + //print_vec(r_i); + + free(r_i_prototype); + + // Find mass + double m_i = m_min + (randFrom(0.0, 10.0) * m_solar); + + // Calculate initial speed + double phi = atan2(r_i->y, r_i->x); + vec* v_i_prototype = new_vec(-sin(phi), cos(phi)); + vec* v_i = mul_vec(sqrt((G * (m_i + stars[0]->mass)) / norm(r_i)), v_i_prototype); + + free(v_i_prototype); + + // Add the star to the list + stars[i] = new_star_vel(*r_i, *v_i, *zero_vec, m_i, dt); + + // Calculate acceleration + update_acceleration(stars[i], stars[0]); + } + + galaxy* g = malloc(sizeof(galaxy)); + g->num_bodies = num_bodies; + g->b = b; + g->stars = stars; + + return g; +} + +// m_i = m_min + m_i' m_i' = random(10.0) * m_solar +// r_i = R * ( (log(1 - random(1.0)) / 1.8) ) (0.5 - random(1.0)x, 0.5 - random(1.0 y)) +// R = pow(10,18) +// m_0 = pow(10, 6) * m_solar, position = (0, 0), speed = (0, 0) +// Other stars have initial speed of: +// v_i = sqrt( (G(m_i + m_0)) / ||r_i|| ) * (-sin(phi), cos(phi)) +// phi = atan2(r_iy / r_ix) + +void reset_accelerations(galaxy* g) { + vec* zero_vec = new_vec(0.0, 0.0); + for(int i = 0; i < g->num_bodies; i++) { + if(g->stars[i] != NULL) { + g->stars[i]->acc = *zero_vec; + } + } + free(zero_vec); +} + +void update_positions(galaxy *g, double dt) { + for(int i = 0; i < g->num_bodies; i++) { + update_position(g->stars[i], dt); + } +} + +void free_galaxy(galaxy *g) { // NEED TO FREE THE VECTORS!!! + for(int i = 0; i < g->num_bodies; i++) { + //vec_free(&g->stars[i]->pos_t); + //vec_free(&g->stars[i]->pos_t_dt); + //vec_free(&g->stars[i]->acc); + free(g->stars[i]); + + } + free(g->stars); + free(g); +} + +void resize_galaxy(galaxy *g) { + // If a star pos vector is outside of the box-allowed boundaries, it needs to be: + // destroyed, freed, moved. + + // Check whether a vector is out of the boundaries -> put the pointer the NULL + int q_2_rem = 0; + star** tmp = malloc(g->num_bodies * sizeof(star*)); + for(int i = 0; i < g->num_bodies; i++) { + if(!is_inside(g->b, g->stars[i]->pos_t)) { + q_2_rem++; + } else { + tmp[i] = g->stars[i]; + //print_star(g->stars[i]); + } + //print_star(g->stars[i]); + } + + g->num_bodies = g->num_bodies - q_2_rem; + g->stars = realloc(g->stars, g->num_bodies * sizeof(star*)); + + if(g->num_bodies == 1) { + EXIT_SUCCESS; + } + + for(int i = 0; i < g->num_bodies; i++) { + if(is_inside(g->b, + g->stars[i]->pos_t)) { + g->stars[i] = tmp[i]; + //print_star(g->stars[i]); + } + } + + free(tmp); +} + +void test_de_galaxy(){ + // Initialize seed for random random generation (seeder needs to be just outside the function) + + galaxy* g = create_and_init_galaxy(5, new_box(-1.0, 2.0, -2.0, 1.0), 1.0); + + for(int i = 1; i < 10; i++) { + update_acceleration(g->stars[1], g->stars[0]); + update_positions(g, (double)i * time_unit); + print_star(g->stars[1]); + } + + +} \ No newline at end of file diff --git a/galaxy_lib.h b/galaxy_lib.h new file mode 100644 index 0000000..1dc1cc2 --- /dev/null +++ b/galaxy_lib.h @@ -0,0 +1,35 @@ + +#include "star_lib.h" +#include "box_lib.h" +#include "vecteur_lib.h" + +#define time_unit 10000000000.0 +#define R 1000000000000000000.0 +#define m_solar 198892000000000000000.0 +#define m_min 100000000000000000000.0 + +#include "math.h" +#include <stdio.h> +#include <stdlib.h> + +#if !defined(__GALAXY_LIB__H__) + + #define __GALAXY_LIB__H__ + + typedef struct __galaxy { + int num_bodies; + star **stars; + box b; + } galaxy; + + + galaxy *create_and_init_galaxy(int num_bodies, box b, double dt); + void reset_accelerations(galaxy *g); + void update_positions(galaxy *g, double dt); + void free_galaxy(galaxy *g); + void resize_galaxy(galaxy *g); + + void test_de_galaxy(); + + +#endif \ No newline at end of file diff --git a/gfx.c b/gfx.c new file mode 100644 index 0000000..59664d3 --- /dev/null +++ b/gfx.c @@ -0,0 +1,94 @@ +/// @file gfx.c +/// @author Florent Gluck +/// @date November 6, 2016 +/// Helper routines to render pixels in fullscreen graphic mode. +/// Uses the SDL2 library. + +#include "gfx.h" + +/// Create a fullscreen graphic window. +/// @param title Title of the window. +/// @param width Width of the window in pixels. +/// @param height Height of the window in pixels. +/// @return a pointer to the graphic context or NULL if it failed. +struct gfx_context_t* gfx_create(char *title, uint width, uint height) { + if (SDL_Init(SDL_INIT_VIDEO) != 0) goto error; + SDL_Window *window = SDL_CreateWindow(title, SDL_WINDOWPOS_CENTERED, + SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_RESIZABLE); + SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, 0); + SDL_Texture *texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, + SDL_TEXTUREACCESS_STREAMING, width, height); + uint32_t *pixels = malloc(width*height*sizeof(uint32_t)); + struct gfx_context_t *ctxt = malloc(sizeof(struct gfx_context_t)); + + if (!window || !renderer || !texture || !pixels || !ctxt) goto error; + + ctxt->renderer = renderer; + ctxt->texture = texture; + ctxt->window = window; + ctxt->width = width; + ctxt->height = height; + ctxt->pixels = pixels; + + SDL_ShowCursor(SDL_DISABLE); + gfx_clear(ctxt, COLOR_BLACK); + return ctxt; + +error: + return NULL; +} + +/// Draw a pixel in the specified graphic context. +/// @param ctxt Graphic context where the pixel is to be drawn. +/// @param x X coordinate of the pixel. +/// @param y Y coordinate of the pixel. +/// @param color Color of the pixel. +void gfx_putpixel(struct gfx_context_t *ctxt, int x, int y, uint32_t color) { + if (x < ctxt->width && y < ctxt->height) + ctxt->pixels[ctxt->width*y+x] = color; +} + +/// Clear the specified graphic context. +/// @param ctxt Graphic context to clear. +/// @param color Color to use. +void gfx_clear(struct gfx_context_t *ctxt, uint32_t color) { + int n = ctxt->width*ctxt->height; + while (n) + ctxt->pixels[--n] = color; +} + +/// Display the graphic context. +/// @param ctxt Graphic context to clear. +void gfx_present(struct gfx_context_t *ctxt) { + SDL_UpdateTexture(ctxt->texture, NULL, ctxt->pixels, ctxt->width*sizeof(uint32_t)); + SDL_RenderCopy(ctxt->renderer, ctxt->texture, NULL, NULL); + SDL_RenderPresent(ctxt->renderer); +} + +/// Destroy a graphic window. +/// @param ctxt Graphic context of the window to close. +void gfx_destroy(struct gfx_context_t *ctxt) { + SDL_ShowCursor(SDL_ENABLE); + SDL_DestroyTexture(ctxt->texture); + SDL_DestroyRenderer(ctxt->renderer); + SDL_DestroyWindow(ctxt->window); + free(ctxt->pixels); + ctxt->texture = NULL; + ctxt->renderer = NULL; + ctxt->window = NULL; + ctxt->pixels = NULL; + SDL_Quit(); + free(ctxt); +} + +/// If a key was pressed, returns its key code (non blocking call). +/// List of key codes: https://wiki.libsdl.org/SDL_Keycode +/// SDL_PumpEvents() must be called before. +/// @return 0 if escape was not pressed. +SDL_Keycode gfx_keypressed() { + const Uint8 *state = SDL_GetKeyboardState(NULL); + if (state && state[SDL_SCANCODE_ESCAPE]) { + return SDLK_ESCAPE; + } + return 0; +} diff --git a/gfx.h b/gfx.h new file mode 100644 index 0000000..92f9f87 --- /dev/null +++ b/gfx.h @@ -0,0 +1,37 @@ +#ifndef _GFX_H_ +#define _GFX_H_ + +#include <stdint.h> +#include <SDL2/SDL.h> + +#define MAKE_COLOR(r,g,b) ((uint32_t)b|((uint32_t)g<<8)|((uint32_t)r<<16)) + +#define COLOR_BLACK 0x00000000 +#define COLOR_RED 0x00FF0000 +#define COLOR_GREEN 0x0000FF00 +#define COLOR_BLUE 0x000000FF +#define COLOR_WHITE 0x00FFFFFF +#define COLOR_YELLOW 0x00FFFF00 + +typedef unsigned int uint; +typedef unsigned long ulong; +typedef unsigned char uchar; + +struct gfx_context_t { + SDL_Window *window; + SDL_Renderer *renderer; + SDL_Texture *texture; + uint32_t *pixels; + int width; + int height; +}; + +extern void gfx_putpixel(struct gfx_context_t *ctxt, int x, int y, uint32_t color); +extern void gfx_clear(struct gfx_context_t *ctxt, uint32_t color); +extern struct gfx_context_t* gfx_create(char *text, uint width, uint height); +extern void gfx_destroy(struct gfx_context_t *ctxt); +extern void gfx_present(struct gfx_context_t *ctxt); +extern SDL_Keycode gfx_keypressed(); +extern SDL_EventType poll_event(); + +#endif diff --git a/main.c b/main.c new file mode 100644 index 0000000..d29cd79 --- /dev/null +++ b/main.c @@ -0,0 +1,64 @@ +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> +#include <string.h> + +#include "galaxy_lib.h" +#include "star_lib.h" +#include "box_lib.h" +#include "vecteur_lib.h" + + +#include <math.h> +#include <time.h> + + +int main(int argc, char** argv) { + printf("boooms\n"); + + vec* hey_vec = new_vec(2.0,1.5); + box hey_box = new_box(-1.0, 1.0, -1.0, 1.0); + + // star + vec* pos_t = new_vec(5.0, 5.0); + double dt = 2.0; + + vec* vel = new_vec(1.5, 1.5); + + double mass = 2.0; + vec* acc = new_vec(1.0,1.0); + + star* etoiletest = new_star_vel(*pos_t, *vel, *acc, mass, dt); + + // galaxy + star** tab_de_stars = malloc(2 * sizeof(star*)); + + tab_de_stars[0] = etoiletest; + tab_de_stars[1] = etoiletest; + + galaxy* gal = create_and_init_galaxy(2, hey_box, 15.0); + + free(hey_vec); + free(pos_t); + free(vel); + free(acc); + free(etoiletest); + + + // free(tab_de_stars[0]); + // free(tab_de_stars[1]); + + + free(tab_de_stars); + + free_galaxy(gal); + + test_de_galaxy(); + + + printf("\nfin de testzer\n"); + + + + +} \ No newline at end of file diff --git a/quad_tree.c b/quad_tree.c new file mode 100644 index 0000000..0f56964 --- /dev/null +++ b/quad_tree.c @@ -0,0 +1,173 @@ +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> +#include <string.h> + +#include "quad_tree.h" +#include "galaxy_lib.h" +#include "star_lib.h" +#include "box_lib.h" +#include "box_lib.c" // cest nimporte quoi +#include "vecteur_lib.h" + + +#include <math.h> +#include <time.h> + + +void insert_star(node* n, star* s) { + if( (is_inside(n->b, s->pos_t) == true) && (n)) { + if(!n->children[0] && !n->children[1] && !n->children[2] && !n->children[3]) { + if(n->is_empty) { + n->is_empty = 0; + n->s = s; + + } else { + box* kids = divide_in_four(n->b); + + for(int i = 0; i < 4; i++) { + n->children[i] = malloc(sizeof(node)); + if(!n->children[i]) { + fprintf(stderr, "\nmalloc failed\n"); + EXIT_FAILURE; + } + n->children[i]->b = kids[i]; + n->children[i]->is_empty = 1; + n->children[i]->s = malloc(sizeof(star)); + n->children[i]->super_s = malloc(sizeof(star)); + //vec* zero = new_vec(0.0, 0.0); + //n->children[i]->super_s = new_star_vel(*zero, *zero, *zero, 0.0, 0.0); + + for(int j = 0; j < 4; j++) { + n->children[i]->children[j] = NULL; + } + + insert_star(n->children[i], n->s); + + } + + for(int i = 0; i < 4; i++) { + insert_star(n->children[i], s); + } + n->s = NULL; + n->is_empty = 1; + } + } else { + // Increment super star mass + n->super_s->mass += s->mass; + + // Increment Center of mass coordinates + n->super_s->pos_t_dt = n->super_s->pos_t; + n->super_s->pos_t = *mul_vec((1.0 / n->super_s->mass), mul_vec(s->mass, add_vec(&n->super_s->pos_t, &s->pos_t))); + + + for(int i = 0; i < 4; i++) { + insert_star(n->children[i], s); + } + } + } +} + +quad_tree *create_quad_tree_from_galaxy(const galaxy *const g) { + // Initialization quad-tree + box boundaries = g->b; + node* top = malloc(sizeof(node)); + top->s = NULL; + top->super_s = g->stars[0]; + top->is_empty = 1; + top->b = boundaries; + for(int j = 0; j < 4; j++) { + top->children[j] = NULL; + } + quad_tree* qt = malloc(sizeof(quad_tree)); + qt->root = top; + + // Populate the tree + for(int i = 1; i < g->num_bodies; i++) { + insert_star(qt->root, g->stars[i]); + } + + return qt; +} + +void free_node(node* n) { + if(!n) return; + + for(int i = 0; i < 4; ++i) { + free_node(n->children[i]); + } + free(n); +} + +void free_quad_tree(quad_tree* qt) { + free_node(qt->root); + free(qt); +} + +void update_acceleration_from_node(const node *const n, star *s, double theta) { + //1. Si le nœud est une feuille non-vide et que l’étoile n’est pas dans le sousdomaine du nœud, on met à jour l’accélération entre l’étoile et l’étoile + //contenue dans le nœud. + if((!n->children[0]) && (!n->children[1]) && (!n->children[2]) && (!n->children[3]) + && (!n->is_empty) && !is_inside(n->b, s->pos_t)) { + update_acceleration(s, n->s); + } else if (compute_length(n->b) / (norm(sub_vec(&(n->super_s->pos_t), &(s->pos_t)))) < theta) { + update_acceleration(s, n->super_s); + } else { + for (int i = 0; i < 4; i++) { + if (n->children[i] != NULL) { + update_acceleration_from_node(n->children[i], s, theta); + } + } + } + + + //2. Sinon, si n est assez éloigné de s (si la taille du sous-domaine de n divisée + //par la distance entre la position de la super étoile de n et s est plus petite + //que theta) on met à jour l’accélération de s à l’aide de la super étoile de + //n. + //3. Sinon, pour tous les enfants de n, on rappelle + //update_acceleration_from_node(n, s, theta); +} + +void update_accelerations_of_all_stars(const node *const n, galaxy *g, double theta) { + for(int i = 0; i < g->num_bodies; i++) { + update_acceleration_from_node(n, g->stars[i], theta); + } +} + +void test_quad_tree_lib() { + + box boundaries = new_box(-15.0, 15.0, -15.0, 15.0); + star** my_stars = malloc(30 * sizeof(star*)); + for(int i = 0; i < 30; i++) { + my_stars[i] = malloc(sizeof(star)); + my_stars[i]->pos_t = *new_vec(0.5 + (double)i, 0.5 + (double)i); + my_stars[i]->pos_t_dt = *new_vec(0.5 + (double)i, 0.5 + (double)i); + my_stars[i]->mass = 20.0; + my_stars[i]->acc = *new_vec(0.5 + (double)i, 0.5 + (double)i); + } + + + // Initialization node + node* top = malloc(sizeof(node)); + top->s = NULL; + top->super_s = my_stars[0]; + top->is_empty = 1; + top->b = boundaries; + for(int j = 0; j < 4; j++) { + top->children[j] = NULL; + } + + + // Stars to be inserted + for(int i = 0; i < 30; i++) { + printf("\nATTEMPT TO INSERT --------------------------------------------\n"); + insert_star(top, my_stars[i]); +// print_star(my_stars[i]); + } + + galaxy* g = create_and_init_galaxy(10, new_box(-100000000000000000000000.0, 100000000000000000000000.0, -100000000000000000000000.0, 100000000000000000000000.0), 1.0 * time_unit); + quad_tree* qt = create_quad_tree_from_galaxy(g); + update_accelerations_of_all_stars(qt->root, g, 0.1); + printf("\nEND\n"); +} diff --git a/quad_tree.h b/quad_tree.h new file mode 100644 index 0000000..fba735d --- /dev/null +++ b/quad_tree.h @@ -0,0 +1,43 @@ + +#include "star_lib.h" +#include "box_lib.h" +#include "vecteur_lib.h" +#include "galaxy_lib.h" + +#include "math.h" +#include <stdio.h> +#include <stdlib.h> + +#if !defined(__QUAD_TREE__H__) + + #define __QUAD_TREE__H__ + + typedef struct __quad_tree { + node *root; + } quad_tree; + + typedef struct __node { + struct __node *children[4]; + box b; + star *s; + star *super_s; + bool is_empty; + } node; + + // Création du quad_tree: + quad_tree *create_quad_tree_from_galaxy(const galaxy *const g); + + void insert_star(node *n, star *s); + + // Libération de la mémoire du quad_tree + void free_quad_tree(quad_tree *t); + + // Mise à jour de l’accélération d’une étoile: + void update_acceleration_from_node(const node *const n, star *s, double theta); + + // Mise à jour de l’accélération de toutes les étoiles: + void update_accelerations_of_all_stars(const node *const n, galaxy *g, double theta); + + + +#endif \ No newline at end of file diff --git a/star_lib.c b/star_lib.c new file mode 100644 index 0000000..08e92a5 --- /dev/null +++ b/star_lib.c @@ -0,0 +1,113 @@ +#include "star_lib.h" +#include "box_lib.h" +#include "vecteur_lib.h" +#include "math.h" +#include <stdio.h> +#include <stdlib.h> + +star *new_star_vel(vec pos, vec vel, vec acc, double mass, double dt) { + star* etoile = malloc(sizeof(star)); + + etoile->pos_t = pos; + + vec* vitesse = new_vec(vel.x, vel.y); + vec* position = new_vec(pos.x, pos.y); + vec* position_t_dt = sub_vec(position, mul_vec(dt, vitesse)); + + etoile->pos_t_dt = *sub_vec(position, mul_vec(dt, vitesse)); //*new_vec(position_t_dt->x, position_t_dt->y); + + etoile->acc = acc; + etoile->mass = mass; + + return etoile; + +} + +void reset_acceleration(star *s) { + s->acc = *new_vec(0.0, 0.0); +} + +void update_acceleration(star *s, const star *const s2) { + //qudn on met a jour cest += pas = + //acc += (Fij /mi) + + double G = 6.67E-11; + double m_s = s->mass; + double m_s2 = s2->mass; + + vec* r_s2_moins_r_s = sub_vec(&(s2->pos_t), &(s->pos_t)); // + + double mod_r_s_s2 = norm(sub_vec(&(s->pos_t), &(s2->pos_t))); // + + double epsilon = 3E4; + + double denominateur = pow((mod_r_s_s2 + epsilon), 3); + printf("test 2 ^ 3 = %f (huit) \n" , pow(2,3)); + + vec* numerateur = mul_vec((G * m_s * m_s2), r_s2_moins_r_s); + + vec* force = mul_vec((1.0/denominateur), numerateur); + + s->acc = *add_vec(&(s->acc), force); // +} + + +void update_position(star *s, double dt) { + vec* the_pos_t = &(s->pos_t); + vec* the_pos_dt = &(s->pos_t_dt); + + vec* dt_foix_acc = mul_vec(dt*dt, &(s->acc)); + + s->pos_t = *(add_vec(( sub_vec(mul_vec(2.0, the_pos_t), the_pos_dt)), dt_foix_acc)); +} + +void print_star(const star *const s) { + + printf("Star { pos_t : {%f, %f}, post_t_dt : {%f, %f}, acc : {%f, %f}, mass : %f}\n", s->pos_t.x, s->pos_t.y, s->pos_t_dt.x, s->pos_t_dt.y, s->acc.x, s->acc.y, s->mass); +} + +void tests_de_stars(){ + printf("hey salut a tous \n"); + vec* vecteur_test = new_vec(0.0, 0.0); + + vec* pos_t = new_vec(5.0, 5.0); + double dt = 2.0; + + vec* vel = new_vec(1.5, 1.5); + + double mass = 2.0; + vec* acc = new_vec(1.0,1.0); + + star* etoiletest = new_star_vel(*pos_t, *vel, *acc, mass, dt); + + printf("pos_t_dt x : %f et y : %f\n", etoiletest->pos_t_dt.x, etoiletest->pos_t_dt.y); + printf("\n\n\n"); + print_star(etoiletest); + printf("\n\n\n"); + + + + + printf("test & et *\n"); + + vec* test_pointeur = new_vec(1.4,2.5); + vec le_test_pointeur = *test_pointeur; + + printf("x : %f et y : %f\n", test_pointeur->x, test_pointeur->y); + printf("x : %f et y : %f\n", le_test_pointeur.x, le_test_pointeur.y); + + vec addr_test_pointeur; + addr_test_pointeur.x = 5.2; + addr_test_pointeur.y = 3.8; + vec* adr_le_test_pointeur = &addr_test_pointeur; + + printf("x : %f et y : %f\n", addr_test_pointeur.x, addr_test_pointeur.y); + printf("x : %f et y : %f\n", adr_le_test_pointeur->x, adr_le_test_pointeur->y); + + + + printf("\ntest box is inside\n"); + + + +} \ No newline at end of file diff --git a/star_lib.h b/star_lib.h new file mode 100644 index 0000000..83721cf --- /dev/null +++ b/star_lib.h @@ -0,0 +1,37 @@ +#include "vecteur_lib.h" +#include "math.h" +#include <stdio.h> +#include <stdlib.h> + +#if !defined(__STAR_LIB__H__) + + #define __STAR_LIB__H__ + + typedef struct __star { + vec pos_t, pos_t_dt, acc; + double mass; + } star; + + + // Création d’une nouvelle étoile à la position pos_t, vitesse vel, accélération acc, masse mass et dt la discrétisation temporelle: + star *new_star_vel(vec pos, vec vel, vec acc, double mass, double dt); + + // On initialisera pos_t_dt à l’aide de la relation (en pseudo-code) pos_t_dt = pos_t - dt * vel + + + // Remise à zéro de l’accélération d’une étoile: + void reset_acceleration(star *s); + + // Mise à jour de l’accélération d’une étoile, s , à cause de l’attraction gravitationnelle d’une autre étoile, s2 : + void update_acceleration(star *s, const star *const s2); + + // Mise à jour de la position d’une étoile, avec dt la discrétisation temporelle: + void update_position(star *s, double dt); + + // En pseudo-code cette mise à jour est de la forme: pos_t = 2*pos_t - pos_t_dt + acc * dt * dt + + + // Affichage des champs d’une étoile pour aider au débogage: + void print_star(const star *const s); + +#endif \ No newline at end of file diff --git a/vecteur_lib.c b/vecteur_lib.c new file mode 100644 index 0000000..e5fa302 --- /dev/null +++ b/vecteur_lib.c @@ -0,0 +1,105 @@ +#include "vecteur_lib.h" +#include "math.h" +#include <stdio.h> +#include <stdlib.h> + +vec *new_vec(double x, double y) { + vec* le_vecteur = malloc(sizeof(vec)); + + le_vecteur->x = x; + le_vecteur->y = y; + + return le_vecteur; + +} + +vec *add_vec(const vec *const v1, const vec *const v2) { + + double le_x = (v1->x + v2->x); + double le_y = (v1->y + v2->y); + + vec* result_vec = new_vec(le_x, le_y); + + return result_vec; + +} + +vec *sub_vec(const vec *const v1, const vec *const v2) { + + double le_x = (v1->x - v2->x); + double le_y = (v1->y - v2->y); + + vec* result_vec = new_vec(le_x, le_y); + + return result_vec; +} + +vec *mul_vec(double alpha, const vec *const v2) { + + double le_x = (v2->x * alpha); + double le_y = (v2->y * alpha); + + vec* result_vec = new_vec(le_x, le_y); + + return result_vec; + +} + +double norm(const vec *const v1) { + return sqrt((v1->x * v1->x) + (v1->y * v1->y)); +} + +double distance(const vec *const v1, const vec *const v2) { + return sqrt(( (v2->x - v1->x) * (v2->x - v1->x) ) + ((v2->y - v1->y) * (v2->y - v1->y))); +} + +void print_vec(const vec *const v) { + + printf("{%f, %f}", v->x, v->y); +} + + +void tests_vecteurs() { + printf("hey salut a tous \n"); + + vec* the_vec = new_vec(3.0,2.0); + + printf("x = %f et y = %f \n", the_vec->x, the_vec-> y); + + printf("test add \n"); + vec* v1 = new_vec(3.0,2.0); + vec* v2 = new_vec(5.0,-4.5); + + vec* result_add = add_vec(v1, v2); + + printf("x = %f et y = %f \n", result_add->x, result_add-> y); + + + printf("test sub \n"); + vec* v3 = new_vec(3.0,2.0); + vec* v4 = new_vec(5.0,-4.5); + + vec* result_sub = sub_vec(v3, v4); + + printf("x = %f et y = %f \n", result_sub->x, result_sub-> y); + + printf("test mul \n"); + vec* v5 = new_vec(3.0,2.0); + double multiplicateur = 5.34; + + vec* result_mul = mul_vec(multiplicateur, v5); + + printf("x = %f et y = %f \n", result_mul->x, result_mul-> y); + + + printf("test norme \n"); + + vec* v6 = new_vec(4.0,3.0); + + double norme = norm(v6); + printf("x = %lf \n", norme); + + print_vec(v6); + +} + diff --git a/vecteur_lib.h b/vecteur_lib.h new file mode 100644 index 0000000..4319b12 --- /dev/null +++ b/vecteur_lib.h @@ -0,0 +1,32 @@ + +#if !defined(__VECTEUR_LIB__H__) + + #define __VECTEUR_LIB__H__ + + typedef struct __vec { + double x, y; + } vec; + + // Creer et initialiser un vecteur + vec *new_vec(double x, double y); + + // Additionner deux vecteurs + vec *add_vec(const vec *const v1, const vec *const v2); + + // Soustraire deux vecteurs + vec *sub_vec(const vec *const v1, const vec *const v2); + + // Multiplier un vecteur par un scalaire + vec *mul_vec(double alpha, const vec *const v2); + + // Calculer la norme d’un vecteur + double norm(const vec *const v1); + + // Calculer la distance entre deux vecteurs + double distance(const vec *const v1, const vec *const v2); + + // Afficher un vecteur (ça vous aidera pour le débogage) + void print_vec(const vec *const v); + + +#endif \ No newline at end of file -- GitLab