Project title: Dark Side of the Moon
https://editor.p5js.org/Xiaozao/sketches/eqtX3a2Cv



This week’s assignment is inspired by the surface of the moon. It is covered with craters large and small, and the sand is being blown among the surface.
I wanted to create a more dynamic movement of the boids, that’s why I applied a sine value to the separate, align, and cohere functions and made the distance limitation change over time.
flock(boids) {
time_off += 0.01;
let sin_value = sin(time_off);
let separate_control = map(sin_value, -1, 1, 1, 50);
let align_control = map(sin_value, -1, 1, 30, 0);
let cohere_control = map(sin_value, -1, 1, 50, 500);
let sep = this.separate(boids, separate_control); // Separation
let ali = this.align(boids, align_control); // Alignment
let coh = this.cohere(boids, cohere_control); // Cohesion
To create the craters on the moon’s surface, I placed several “obstacles” around the canvas, and made the boids near the obstacles flee from them. I adjusted the parameters to make some of the boids go across the obstacles while the others bounce back. This creates a more natural feeling.
// main
for (let i = 0; i < obstacles.length; i ++) {
let obstacle = obstacles[i];
// circle(obstacle.x, obstacle.y, 10);
flock.avoid(obstacle);
}
// flock class
avoid(obstacle) {
for (let boid of this.boids) {
let d = p5.Vector.dist(boid.position, obstacle);
if (d > 0 && d < 100) {
boid.avoid(obstacle);
}
}
}
// boid class
avoid(obstacle) {
let desired = p5.Vector.sub(this.position, obstacle);
desired.setMag(this.maxspeed);
// Steering = Desired minus velocity
let steer = p5.Vector.sub(desired, this.velocity);
steer.mult(0.02); // Limit to maximum steering force
this.applyForce(steer);
}

Finally, I set the blend mode to “add” which makes the patterns more aesthetic.
Possible improvements:
Maybe I can draw lines between each pair of boids that are close enough to each other, or try other kinds of blend modes.