#include #include #include #include #include #include #define PROJECT_NAME "vectors-drag" #define obj_n 10 typedef struct OBJECT_INER { Point pos; Point vel; Point acc; float r; float mass; } OBJECT_INER; typedef struct OBJECT { OBJECT_INER *objs[obj_n]; } OBJECT; float DragC = 0.2; #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){0,0}; obj->acc = (Point){0,0}; obj->mass = mass; obj->r = sqrt(obj->mass) * 10; } void init_stuffs(int w, int h, OBJECT_INER *objs, STUFFS *stuff){ for (int i=0; imass,obj->mass}); point_add(&obj->acc, &force); } void drag(STUFFS *stuff, OBJECT_INER *obj, float c){ // something something velocity is 0 objects goto corner idk why if(magnitude(obj->vel.x, obj->vel.y) != 0){ Point drag = { obj->vel.x, obj->vel.y, }; point_set_mag(&drag, 1.0); point_mul(&drag,&(Point){-1,-1}); float speed = magnitude(obj->vel.x, obj->vel.y); point_set_mag(&drag, c * (speed * speed)); applyForce(obj, drag); } } void edges(STUFFS *stuff, OBJECT_INER *obj) { if (obj->pos.y >= stuff->height - obj->r){ obj->pos.y = stuff->height - obj->r; obj->vel.y = obj->vel.y * -1; } if (obj->pos.x >= stuff->width - obj->r){ obj->pos.x = stuff->width - obj->r; obj->vel.x = obj->vel.x * -1; } else if (obj->pos.x <= obj->r){ obj->pos.x = obj->r; obj->vel.x = obj->vel.x * -1; } } 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 draw(SDL_Renderer* renderer,SDL_Window* window, STUFFS *stuff){ SDL_SetRenderDrawColor(renderer,0,0,0,255); SDL_RenderClear(renderer); //SDL_SetRenderDrawColor(renderer,0,0,0,255); //SDL_RenderFillRect(renderer, &(SDL_Rect){0,0,stuff->width,stuff->height}); SDL_SetRenderDrawColor(renderer,255,255,255,90); SDL_RenderFillRect(renderer, &(SDL_Rect){0,stuff->height/2,stuff->width,stuff->height}); for (int i=0; iobj.objs[i]->mass; weight.y = gravity.y * stuff->obj.objs[i]->mass; if(stuff->mousedown == true){ Point wind = {0.1, 0}; applyForce(stuff->obj.objs[i], wind); } applyForce(stuff->obj.objs[i], weight); if(stuff->obj.objs[i]->pos.y > (float)stuff->height/2){ drag(stuff,stuff->obj.objs[i],DragC); } update(stuff,stuff->obj.objs[i]); edges(stuff,stuff->obj.objs[i]); show(renderer,stuff,stuff->obj.objs[i]); } SDL_RenderPresent(renderer); } void mousePressed(STUFFS *stuff){ } #include /* Exercises * * make a liquid class/object that * describes a density * coefficient * and area of where that liquid or gas is * * Surface Area */