added initial velocity and radius ranges and clear/trace factors
This commit is contained in:
parent
f46f20aa81
commit
eba900d9ef
42
balls.c
42
balls.c
@ -25,10 +25,14 @@ static double delta = 0.01;
|
|||||||
static unsigned int width = 0;
|
static unsigned int width = 0;
|
||||||
static unsigned int height = 0;
|
static unsigned int height = 0;
|
||||||
|
|
||||||
static unsigned int ball_radius = 4;
|
static unsigned int radius_min = 5;
|
||||||
|
static unsigned int radius_max = 10;
|
||||||
|
|
||||||
|
static unsigned int v_max = 100;
|
||||||
|
static unsigned int v_min = 0;
|
||||||
|
|
||||||
struct ball * balls = 0;
|
struct ball * balls = 0;
|
||||||
unsigned int n_balls = 10;
|
unsigned int n_balls = 50;
|
||||||
|
|
||||||
static double g_y = 20;
|
static double g_y = 20;
|
||||||
static double g_x = 0;
|
static double g_x = 0;
|
||||||
@ -38,12 +42,13 @@ void balls_init_state () {
|
|||||||
static const unsigned int border = 10;
|
static const unsigned int border = 10;
|
||||||
unsigned int w = width < 2*border ? 1 : width - 2*border;
|
unsigned int w = width < 2*border ? 1 : width - 2*border;
|
||||||
unsigned int h = height < 2*border ? 1 : height - 2*border;
|
unsigned int h = height < 2*border ? 1 : height - 2*border;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < n_balls; ++i) {
|
for (unsigned int i = 0; i < n_balls; ++i) {
|
||||||
balls[i].x = border + rand() % w;
|
balls[i].x = border + rand() % w;
|
||||||
balls[i].y = border + rand() % h;
|
balls[i].y = border + rand() % h;
|
||||||
balls[i].v_x = rand() % 100;
|
balls[i].v_x = v_min + rand() % (v_max + 1 - v_min);
|
||||||
balls[i].v_y = rand() % 100;
|
balls[i].v_y = v_min + rand() % (v_max + 1 - v_min);
|
||||||
balls[i].radius = ball_radius + rand() % 20;
|
balls[i].radius = radius_min + rand() % (radius_max + 1 - radius_min);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,7 +110,7 @@ static void ball_update_state (struct ball * p) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static GdkPixbuf * pixbuf = 0;
|
static GdkPixbuf * pixbuf = 0;
|
||||||
static double clear_alpha = 1.0;
|
static double clear_factor [3] = { 0.0, 0.0, 0.0 };
|
||||||
|
|
||||||
static void destroy_surface () {
|
static void destroy_surface () {
|
||||||
if (pixbuf)
|
if (pixbuf)
|
||||||
@ -153,26 +158,15 @@ static void do_draw(GtkWidget * widget) {
|
|||||||
int n_channels = gdk_pixbuf_get_n_channels(pixbuf);
|
int n_channels = gdk_pixbuf_get_n_channels(pixbuf);
|
||||||
|
|
||||||
/* clear pixmap */
|
/* clear pixmap */
|
||||||
if (clear_alpha >= 1.0) {
|
|
||||||
for(int y = 0; y < height; ++y) {
|
for(int y = 0; y < height; ++y) {
|
||||||
unsigned char * px = pixels + y*row_stride;
|
unsigned char * px = pixels + y*row_stride;
|
||||||
for(int x = 0; x < width; ++x) {
|
for(int x = 0; x < width; ++x) {
|
||||||
*px++ *= 0.95;
|
for(int i = 0; i < n_channels; ++i)
|
||||||
*px++ *= 0.90;
|
*px++ *= clear_factor[i];
|
||||||
*px++ *= 0.80;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for(int y = 0; y < height; ++y) {
|
|
||||||
unsigned char * px = pixels + y*row_stride;
|
|
||||||
for(int x = 0; x < width; ++x)
|
|
||||||
for(int i = 0; i < n_channels; ++i) {
|
|
||||||
*px = *px * (1.0 - clear_alpha);
|
|
||||||
++px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* draw balls */
|
||||||
for(int i = 0; i < n_balls; ++i) {
|
for(int i = 0; i < n_balls; ++i) {
|
||||||
int x0 = balls[i].x <= balls[i].radius ? 0 : balls[i].x - balls[i].radius;
|
int x0 = balls[i].x <= balls[i].radius ? 0 : balls[i].x - balls[i].radius;
|
||||||
int x1 = balls[i].x + balls[i].radius + 1 >= width ? width : balls[i].x + balls[i].radius + 1;
|
int x1 = balls[i].x + balls[i].radius + 1 >= width ? width : balls[i].x + balls[i].radius + 1;
|
||||||
@ -231,7 +225,7 @@ static void destroy_window(void) {
|
|||||||
|
|
||||||
void print_usage(const char * progname) {
|
void print_usage(const char * progname) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"usage: %s [<width>x<height>] [n=<bumber of balls>] [trace=<tracing factor>] [fx=<x-force>] [fy=<y-force>] [radius=<ball radius>] [delta=<frame-delta-time>]\n",
|
"usage: %s [<width>x<height>] [n=<bumber of balls>] [clear=<clear-red>,<clear-green>,<clear-blue>] [fx=<x-force>] [fy=<y-force>] [radius=<min-radius>-<max-radius>] [delta=<frame-delta-time>]\n",
|
||||||
progname);
|
progname);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -267,13 +261,15 @@ int main(int argc, const char *argv[]) {
|
|||||||
continue;
|
continue;
|
||||||
if (sscanf(argv[i], "n=%u", &n_balls) == 1)
|
if (sscanf(argv[i], "n=%u", &n_balls) == 1)
|
||||||
continue;
|
continue;
|
||||||
if (sscanf(argv[i], "trace=%lf", &clear_alpha) == 1)
|
if (sscanf(argv[i], "clear=%lf,%lf,%lf", clear_factor, clear_factor + 1, clear_factor + 2) == 3)
|
||||||
continue;
|
continue;
|
||||||
if (sscanf(argv[i], "fx=%lf", &g_x) == 1)
|
if (sscanf(argv[i], "fx=%lf", &g_x) == 1)
|
||||||
continue;
|
continue;
|
||||||
if (sscanf(argv[i], "fy=%lf", &g_y) == 1)
|
if (sscanf(argv[i], "fy=%lf", &g_y) == 1)
|
||||||
continue;
|
continue;
|
||||||
if (sscanf(argv[i], "radius=%u", &ball_radius) == 1)
|
if (sscanf(argv[i], "radius=%u-%u", &radius_min, &radius_max) == 2)
|
||||||
|
continue;
|
||||||
|
if (sscanf(argv[i], "v=%u-%u", &v_min, &v_max) == 2)
|
||||||
continue;
|
continue;
|
||||||
if (sscanf(argv[i], "delta=%lf", &delta) == 1)
|
if (sscanf(argv[i], "delta=%lf", &delta) == 1)
|
||||||
continue;
|
continue;
|
||||||
|
Loading…
Reference in New Issue
Block a user