xxxxxxxxxx
127
let bounds; // vector
let leader; //Vector
let leadSpd; //Vector
let follower = []; //Vector
let followerSpd = []; //vector
let circRed = 50;
let circGreen = 50;
let circBlue = 50;
let springing = 0.01;
let damping = 0.1;
function setup() {
createCanvas(600, 600); // size()
bounds = createVector(400, 400);
strokeWeight(3);
leader = createVector();
console.log(leader);
leadSpd = createVector(random(-1.5, 1.5), random(-1.5, 1.5));
follower[0] = createVector();
followerSpd[0] = createVector();
follower[1] = createVector(-200,200);
followerSpd[1] = createVector();
follower[2] = createVector(200,200);
followerSpd[2] = createVector();
follower[3] = createVector();
followerSpd[3] = createVector();
}
function draw() {
background(255, 255, 255, 20);
translate(width / 2, height / 2);
drawBounds();
makeleader();
follow();
render();
checkEdge();
}
function drawBounds() {
noFill();
stroke(0);
rect(-bounds.x / 2, -bounds.y / 2, bounds.x, bounds.y);
}
function makeleader() {
leadSpd.add(createVector(random(-0.2, 0.2), random(-0.2, 0.2)));
leader.add(leadSpd); // euler integration
}
function follow() {
//move center point
let deltaX = [];
let deltaY=[];
for (let i = 0; i < follower.length; i++) {
deltaX[i] = leader.x - follower[i].x;
deltaY[i] = leader.y - follower[i].y;
// create springing effect
deltaX[i] *= springing;
deltaY[i] *= springing;
followerSpd[i].x += deltaX[i];
followerSpd[i].y += deltaY[i];
// move predator's center Euler
follower[i].x += followerSpd[i].x;
follower[i].y += followerSpd[i].y;
// slow down springing
followerSpd[i].x *= damping;
followerSpd[i].y *= damping;
}
}
function render() {
stroke(150);
noStroke();
ellipse(leader.x, leader.y, 25, 25);
fill(15, 170, 255);
for (let i = 0; i < follower.length; i++) {
ellipse(follower[i].x, follower[i].y, 25, 18);
}
}
function checkEdge() {
//leader
if (leader.x > bounds.x / 2) {
leader.x = bounds.x / 2;
leadSpd.x *= -1;
} else if (leader.x < -bounds.x / 2) {
leader.x = -bounds.x / 2;
leadSpd.x *= -1;
}
if (leader.y > bounds.y / 2) {
leader.y = bounds.y / 2;
leadSpd.y *= -1;
} else if (leader.y < -bounds.y / 2) {
leader.y = -bounds.y / 2;
leadSpd.y *= -1;
}
//follower
if (follower.x > bounds.x / 2) {
follower.x = bounds.x / 2;
followerSpd.x *= -1;
} else if (follower.x < -bounds.x / 2) {
follower.x = -bounds.x / 2;
followerSpd.x *= -1;
}
if (follower.y > bounds.y / 2) {
follower.y = bounds.y / 2;
followerSpd.y *= -1;
} else if (follower.y < -bounds.y / 2) {
follower.y = -bounds.y / 2;
followerSpd.y *= -1;
}
}