-
Notifications
You must be signed in to change notification settings - Fork 0
/
Flock.pde
99 lines (92 loc) · 2.38 KB
/
Flock.pde
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
// The Flock (a list of Boid objects)
class Flock {
ArrayList<Boid> boids; // An ArrayList for all the boids
PVector flow_dir; // environmental air flow
float flow_rad;
float flow_speed;
float additional_speed; // human control
// system parameters
float N = 85;
float default_size = 10;
float size_multiplier = 1.0;
float minspeed = 0.1;
float maxspeed = 2;
float maxforce = 0.03;
int shape = 0;
float neighbordist = 50;
float seperation_multiplier = 1.75;
Flock() {
boids = new ArrayList<Boid>(); // Initialize the ArrayList
flow_dir = new PVector(0,0);
flow_rad = 0;
flow_speed = 0;
additional_speed = 0;
for(int i = 0; i < N; i++) {
addBoid(0, 0);
}
}
void addBoid(float x, float y) {
boids.add(new Boid(x, y, this));
}
void run() {
// draw wind direction
if(draw_flow_dir) {
pushStyle();
noFill();
strokeWeight(2);
stroke(0, 255, 0);
pushMatrix();
translate(width/2, height/2);
rotate(flow_rad);
line(-flow_dir_stem_len, 0, flow_dir_stem_len, 0);
translate(flow_dir_stem_len, 0);
rotate(PI/4);
line(0, 0, 0, flow_dir_tick_len);
rotate(PI/2);
line(0, 0, 0, flow_dir_tick_len);
popMatrix();
popStyle();
}
for(Boid b : this.boids) {
b.run();
}
}
void changeShape() {
shape = (shape + 1)%3;
println("[Flock] shape", shape);
}
void controlSize(float z) {
if(size_multiplier + z > 0) {
size_multiplier += z;
println("[Flock] size", size_multiplier);
}
}
void controlNeighbor(int n) {
if(neighbordist + n > 0) {
neighbordist += n;
println("[Flock] neighbor dist", neighbordist);
}
}
void controlSpeed(float s) {
maxspeed = (maxspeed + s < minspeed ? minspeed : maxspeed + s);
additional_speed += s;
println("[Flock] maxspeed", maxspeed);
println("[Flock] flow speed", flow_speed, "additional speed", additional_speed);
}
void updateFlowSpeed(float s) {
if(s > 0) {
flow_speed = s*0.01;
println("[Flock] flow speed", flow_speed);
}
}
void updateFlowDirection(int d) {
if(d > 0) {
d = d + NORTH;
flow_rad = radians(d);
flow_dir.x = cos(flow_rad);
flow_dir.y = sin(flow_rad);
flow_dir.mult(0.01);
println("[Flock] flow rad", flow_rad, "dir", flow_dir);
}
}
}