#include #include #include #include #include #include #define PROJECT_NAME "vectors-gravity attraction" #define obj_n 10 typedef struct ATTRACTOR { Point pos; float r; float mass; } ATTRACTOR; typedef struct OBJECT_INER { Point pos; Point vel; Point acc; float r; float mass; } OBJECT_INER; typedef struct OBJECT { ATTRACTOR attractor; OBJECT_INER *objs[obj_n]; } OBJECT; #include void constructor(int w, int h, OBJECT_INER *obj, float x, float y, float mass){ obj->pos.x = x; obj->pos.y = y; obj->vel = (Point){RandomFloat(-1, 1),RandomFloat(-1, 1)}; point_mul(&obj->vel,&(Point){5,5}); obj->acc = (Point){0,0}; obj->mass = mass; obj->r = sqrt(obj->mass) * 2; } void attractor_constructor(int w, int h, ATTRACTOR *attractor, float x, float y, float mass){ attractor->pos.x = x; attractor->pos.y = y; attractor->mass = mass; attractor->r = sqrt(attractor->mass) * 2; } void init_stuffs(int w, int h, OBJECT_INER *objs,STUFFS *stuff){ for (int i=0; iobj.attractor,(float)w/2,(float)h/2,100); } void applyForce(OBJECT_INER *obj, Point force){ point_div(&force, &(Point){obj->mass,obj->mass}); point_add(&obj->acc, &force); } void update(STUFFS *stuff, OBJECT_INER *obj){ point_add(&obj->vel,&obj->acc); point_add(&obj->pos, &obj->vel); obj->acc = (Point){0,0}; } void show(SDL_Renderer* renderer,STUFFS *stuff,OBJECT_INER *obj){ Sint16 x = (Sint16)obj->pos.x; Sint16 y = (Sint16)obj->pos.y; circleRGBA(renderer, x, y, obj->r, 190, 90, 255, 255); filledCircleRGBA(renderer, x, y, obj->r, 150, 50, 255, 80); } void attract(ATTRACTOR *attractor, OBJECT_INER *obj){ Point force = {attractor->pos.x - obj->pos.x, attractor->pos.y - obj->pos.y}; float dist = magnitude(force.x, force.y); dist = dist * dist; dist = constrain(dist,100,1000); float G = 2; float strength = G * (attractor->mass * obj->mass) / dist; point_set_mag(&force, strength); applyForce(obj,force); } void atr_show(SDL_Renderer* renderer,STUFFS *stuff,ATTRACTOR *attr){ SDL_RenderFillRect(renderer, &(SDL_Rect){attr->pos.x - attr->r, attr->pos.y - attr->r, attr->r*2, attr->r*2}); } void draw(SDL_Renderer* renderer,SDL_Window* window, STUFFS *stuff){ SDL_SetRenderDrawColor(renderer,0,0,0,5); //SDL_RenderClear(renderer); SDL_RenderFillRect(renderer, &(SDL_Rect){0,0,stuff->width,stuff->height}); for (int i=0; iobj.objs[i]); show(renderer,stuff,stuff->obj.objs[i]); attract(&stuff->obj.attractor, stuff->obj.objs[i]); } SDL_SetRenderDrawColor(renderer, 100,20,20,180); atr_show(renderer,stuff,&stuff->obj.attractor); SDL_RenderPresent(renderer); } #include