-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbouncing_balls.c
67 lines (56 loc) · 1.89 KB
/
bouncing_balls.c
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
#include "bouncing_balls.h"
#include "lights.h"
#include <math.h>
#include <stdbool.h>
#include <time.h>
long millis()
{
static struct timespec t1;
clock_gettime(CLOCK_MONOTONIC, &t1);
return t1.tv_nsec / (1000 * 1000);
}
extern volatile bool running;
void BouncingBalls(uint8_t red, uint8_t green, uint8_t blue, uint8_t BallCount)
{
float Gravity = -9.81;
int StartHeight = 1;
float Height[BallCount];
float ImpactVelocityStart = sqrt( -2 * Gravity * StartHeight );
float ImpactVelocity[BallCount];
float TimeSinceLastBounce[BallCount];
int Position[BallCount];
long ClockTimeSinceLastBounce[BallCount];
float Dampening[BallCount];
for (int i = 0 ; i < BallCount ; i++)
{
ClockTimeSinceLastBounce[i] = millis();
Height[i] = StartHeight;
Position[i] = 0;
ImpactVelocity[i] = ImpactVelocityStart;
TimeSinceLastBounce[i] = 0;
Dampening[i] = 0.90 - ((float) i)/pow(BallCount, 2);
}
while (running)
{
for (int i = 0 ; i < BallCount ; i++)
{
TimeSinceLastBounce[i] = millis() - ClockTimeSinceLastBounce[i];
Height[i] = 0.5 * Gravity * pow( TimeSinceLastBounce[i]/1000 , 2.0 ) + ImpactVelocity[i] * TimeSinceLastBounce[i]/1000;
if ( Height[i] < 0 )
{
Height[i] = 0;
ImpactVelocity[i] = Dampening[i] * ImpactVelocity[i];
ClockTimeSinceLastBounce[i] = millis();
if ( ImpactVelocity[i] < 0.01 )
{
ImpactVelocity[i] = ImpactVelocityStart;
}
}
Position[i] = round( Height[i] * (LED_COUNT - 1) / StartHeight);
}
for (int i = 0 ; i < BallCount ; i++)
set_pixel(Position[i], red, green, blue);
show_strip();
set_all(0, 0, 0);
}
}