5 static void putpixel(struct SDL_Surface *screen, const int x, const int y,
6 const unsigned char r, const unsigned char g,
9 int offset = y * screen->pitch + x * 4;
10 unsigned char *buf = screen->pixels;
17 void init_planet(const SDL_Surface *screen, struct planet *p)
21 p->pos.x = get_random() % screen->w;
22 p->pos.y = get_random() % screen->h;
23 p->mass = get_random() % 1000 + 100;
24 p->size = p->mass / 100;
25 p->r = get_random() % 256;
26 p->g = get_random() % 256;
27 p->b = get_random() % 256;
29 INIT_LIST_HEAD(&p->list);
32 void draw_planet(SDL_Surface *screen, struct planet *p)
34 int size = p->size / 2;
35 int x, x_start, y, x_end, y_end;
37 x_start = MAX(p->pos.x - size, 0);
38 y = MAX(p->pos.y - size, 0);
40 x_end = MIN(p->pos.x + size, screen->w);
41 y_end = MIN(p->pos.y + size, screen->h);
43 for (; y < y_end; y++)
44 for (x = x_start; x < x_end; x++)
45 putpixel(screen, x, y, p->r, p->g, p->b);
48 void gravitize_planets(struct planet *a, struct planet *b, const double time)
50 struct vector distance, sum;
53 vector_sub(&a->pos, &b->pos, &distance);
55 dist = vector_abs(&distance);
56 vector_div(&distance, dist, &distance);
58 f = a->mass * b->mass / (dist * dist + 5) * time;
61 vector_scale(&distance, acc, &sum);
62 vector_add(&b->speed, &sum, &b->speed);
65 vector_scale(&distance, acc, &sum);
66 vector_sub(&a->speed, &sum, &a->speed);
69 void move_planet(struct planet *p, const double time)
72 vector_scale(&p->speed, time, &tmp);
73 vector_add(&p->pos, &tmp, &p->pos);
76 void print_planet(const struct planet *p)
78 printf("pos: (%f,%f), speed: (%f,%f), mass: %f, size %f\n",
79 p->pos.x, p->pos.y, p->speed.x, p->speed.y, p->mass, p->size);