blob: 6e31a6d1a9be036d1abebfc18a40e9f3a9796182 (
plain)
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define WIDTH 800
#define HEIGHT 400
#define MAX_VELOCITY WIDTH / 2
#include "kinetics.h"
void
generate_color (double *color)
{
int i;
for (i = 0; i <= 3; i++)
color[i] = (int) (drand48 () * 2) / 2.0;
}
void
kinetics_destroy (kinetics_t *kinetics)
{
free(kinetics);
}
void
kinetics_init (kinetics_t *kinetics)
{
kinetics->angle = drand48 () * 2 * M_PI;
kinetics->velocity = MAX_VELOCITY / 8.0 * 7 * drand48 () + MAX_VELOCITY / 8.0;
kinetics->x = WIDTH / 2;
kinetics->y = HEIGHT / 2;
generate_color (kinetics->color);
kinetics->x_radius = drand48 () * 10 + 5;
kinetics->y_radius = drand48 () * 10 + 5;
kinetics->x_offset = drand48 () * 10;
kinetics->y_offset = drand48 () * 10;
kinetics->width = drand48 () * 120 + 30;
kinetics->height = drand48 () * 120 + 30;
generate_color (kinetics->shadow_color);
kinetics->rotation = drand48 () * 2 * M_PI;
kinetics->line_width = 20; //drand48() * 20;
/* inset shadow */
kinetics->shadow_color[0] = 0;
kinetics->shadow_color[1] = 0;
kinetics->shadow_color[2] = 0;
kinetics->shadow_color[3] = 1;
kinetics->shadow_x_blur = 5;
kinetics->shadow_y_blur = 2;
kinetics->x_offset = 6;
kinetics->y_offset = 1;
/* spread */
kinetics->spread_color[0] = 1;
kinetics->spread_color[1] = 1;
kinetics->spread_color[2] = 1;
kinetics->spread_color[3] = 1;
kinetics->spread_x_blur = 5;
kinetics->spread_y_blur = 2;
kinetics->spread_line_width = 3;
/* drop shadow */
kinetics->drop_color[0] = 0;
kinetics->drop_color[1] = 0;
kinetics->drop_color[2] = 0;
kinetics->drop_color[3] = 0.5;
kinetics->drop_x_blur = 10;
kinetics->drop_y_blur = 8;
kinetics->drop_x_offset = -30;
kinetics->drop_y_offset = -5;
kinetics->drop_line_width = kinetics->line_width;
}
void
kinetics_update (kinetics_t *kinetics, double delta)
{
double x = kinetics->x + cos (kinetics->angle) * kinetics->velocity * delta;
double y = kinetics->y + sin (kinetics->angle) * kinetics->velocity * delta;
double w = kinetics->width/2;
double height = kinetics->height/2;
if (x + w > WIDTH) {
if (kinetics->angle >= 0 && kinetics->angle < M_PI / 2)
kinetics->angle = M_PI - kinetics->angle;
else if (kinetics->angle > M_PI / 2 * 3)
kinetics->angle -= (kinetics->angle - M_PI /2 * 3) * 2;
x = WIDTH - w;
}
if (x - w < 0) {
if (kinetics->angle > M_PI / 2 && kinetics->angle < M_PI)
kinetics->angle = M_PI - kinetics->angle;
else if (kinetics->angle > M_PI && kinetics->angle < M_PI / 2 * 3)
kinetics->angle += (M_PI / 2 * 3 - kinetics->angle) * 2;
x = w;
}
if (y + w > HEIGHT) {
if (kinetics->angle > 0 && kinetics->angle < 2 * M_PI)
kinetics->angle = M_PI * 2 - kinetics->angle;
y = HEIGHT - w;
}
if (y - w < 0) {
if (kinetics->angle > M_PI && kinetics->angle < M_PI * 2)
kinetics->angle = kinetics->angle - (kinetics->angle - M_PI) * 2;
y = w;
}
kinetics->x = x;
kinetics->y = y;
kinetics->rotation += M_PI / 9;
if (kinetics->rotation > 2 * M_PI)
kinetics->rotation -= 2 * M_PI;
}
|