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
96let flock = [];
let quadtree;
let fps = 0;
function setup() {
const width = Math.min(800, windowWidth);
const canvas = createCanvas(width, width);
canvas.parent("sketch");
reset();
}
function reset() {
window.debug = 0; // 0, 1, 2, 3
window.pause = false;
flock = [];
for (let i = 0; i < 300; i++) {
const boid = new Boid()
flock.push(boid);
}
}
function draw() {
background(20);
quadtree = new QuadTree(new Rect(width / 2, height / 2, width / 2, height / 2), 4);
for (let boid of flock) {
quadtree.insert(boid);
}
for (let i = 0; i < flock.length; i++) {
let boid = flock[i];
let range = new Rect(boid.position.x, boid.position.y, boid.perception, boid.perception);
let localFlock = quadtree.query(range);
if (!window.pause)
boid.update(localFlock);
boid.render();
if (window.debug === 1 && i === 0) {
stroke(0, 0, 255);
fill(0, 0, 0, 0);
rectMode(CENTER);
rect(range.x, range.y, range.w * 2, range.h * 2);
}
}
if (window.debug === 1) {
quadtree.render();
}
setInterval(() => {
fps = frameRate();
}, 100);
fill(fps >= 60 ? "green" : "red");
stroke(0);
text(fps.toFixed(2), 10, 20);
}
debugButton.onclick = () => {
window.debug = (window.debug + 1) % 2;
}
function keyReleased() {
if (key === "d") {
window.debug = (window.debug + 1) % 3;
}
else if (key === "r") {
reset();
}
else if (key === "p") {
window.pause = !window.pause;
}
return false; // prevent any default behavior
}
function mousePressed() {
window.mouse = {
x: mouseX,
y: mouseY
}
}
function mouseDragged() {
window.mouse = {
x: mouseX,
y: mouseY
}
}
function mouseReleased() {
window.mouse = null;
}