]> git.itanic.dy.fi Git - sdl-planets/blob - planet.c
print_planet: Also print the size of the planet
[sdl-planets] / planet.c
1 #include "random.h"
2 #include "planet.h"
3 #include "utils.h"
4
5 static void putpixel(struct SDL_Surface *screen, const int x, const int y,
6                      const unsigned char r, const unsigned char g,
7                      const unsigned char b)
8 {
9         int offset = y * screen->pitch + x * 4;
10         unsigned char *buf = screen->pixels;
11
12         buf[offset++] = b;
13         buf[offset++] = g;
14         buf[offset]   = r;
15 }
16
17 void init_planet(const SDL_Surface *screen, struct planet *p)
18 {
19         p->speed.x = 0;
20         p->speed.y = 0;
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;
28
29         INIT_LIST_HEAD(&p->list);
30 }
31
32 void draw_planet(SDL_Surface *screen, struct planet *p)
33 {
34         int size = p->size / 2;
35         int x, x_start, y, x_end, y_end;
36
37         x_start = MAX(p->pos.x - size, 0);
38         y = MAX(p->pos.y - size, 0);
39
40         x_end = MIN(p->pos.x + size, screen->w);
41         y_end = MIN(p->pos.y + size, screen->h);
42
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);
46 }
47
48 void gravitize_planets(struct planet *a, struct planet *b, const double time)
49 {
50         struct vector distance, sum;
51         double dist, f, acc;
52
53         vector_sub(&a->pos, &b->pos, &distance);
54
55         dist = vector_abs(&distance);
56         vector_div(&distance, dist, &distance);
57
58         f = a->mass * b->mass / (dist * dist + 5) * time;
59
60         acc = f / b->mass;
61         vector_scale(&distance, acc, &sum);
62         vector_add(&b->speed, &sum, &b->speed);
63
64         acc = f / a->mass;
65         vector_scale(&distance, acc, &sum);
66         vector_sub(&a->speed, &sum, &a->speed);
67 }
68
69 void move_planet(struct planet *p, const double time)
70 {
71         struct vector tmp;
72         vector_scale(&p->speed, time, &tmp);
73         vector_add(&p->pos, &tmp, &p->pos);
74 }
75
76 void print_planet(const struct planet *p)
77 {
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);
80 }