1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
#include <stdbool.h>
#include <vectorlib.c>
#include <SDL2/SDL.h>
#include <SDL2/SDL_video.h>
#include <SDL2/SDL2_gfxPrimitives.h>
#define PROJECT_NAME "vectors-mass accel"
#define obj_n 2
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;
#include <init.h>
void constructor(int w, int h, OBJECT_INER *obj, float x, float y, float mass){
obj->pos.x = (float)w/2 + x;
obj->pos.y = (float)h/2 + 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){
constructor(w, h, &objs[0], 100, 100, 4);
constructor(w, h, &objs[1], -100, 100, 10);
}
Point vec_sub(Point A, Point B){
point_sub(&A, &B);
return A;
}
void applyForce(OBJECT_INER *obj, Point force){
//no need to make a copy. tis not a pointer
point_div(&force, &(Point){obj->mass,obj->mass});
point_add(&obj->acc, &force);
}
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){
SDL_SetRenderDrawColor(renderer,150,50,255,10);
Sint16 x = (Sint16)obj->pos.x;
Sint16 y = (Sint16)obj->pos.y;
filledCircleRGBA(renderer, x, y, obj->r, 150, 50, 255, 255);
}
void draw(SDL_Renderer* renderer,SDL_Window* window, STUFFS *stuff){
SDL_SetRenderDrawColor(renderer,0,0,0,255);
SDL_RenderClear(renderer);
for (int i=0; i<obj_n; i++){
Point gravity = {0, 0.2};
Point weight = {0};
weight.x = gravity.x * stuff->obj.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);
update(stuff,stuff->obj.objs[i]);
edges(stuff,stuff->obj.objs[i]);
show(renderer,stuff,stuff->obj.objs[i]);
}
SDL_RenderPresent(renderer);
}
#include <init.c>
|