let friends;
let separation;
let attraction;
function setup() {
c = constrain(min(windowWidth, windowHeight) * 0.8, 400, 1000);
cnv = createCanvas(c, c);
rectMode(CENTER);
angleMode(DEGREES);
nFriends = int(random(20, 100));
nRot = floor(random(2, 14));
friends = [];
separation = random(1, 2);
attraction = random(20, 50);
r1 = random(180, 225);
g1 = random(180, 245);
b1 = random(180, 245);
background(r1 - 180, g1 - 180, b1 - 180);
for (let i = 0; i < nFriends; i++) {
friends[i] = {
r: random(width / 10, width / 4),
angle: random(0, 360),
vr: random(-0.5, 0.5),
va: random(-0.5, 0.5),
fill: 255
};
}
cnt = 0;
}
function draw() {
translate(width / 2, height / 2);
t = frameCount;
fill(255);
noStroke();
if (keyIsPressed && keyCode != 32) {
background(r1 - 180, g1 - 180, b1 - 180, 10);
}
for (i in friends) {
fill(friends[i].fill);
for (let k = 0; k < nRot; k++) {
fill(
r1 - abs(friends[i].r) / 1.2,
g1 - abs(friends[i].r) / 1.2,
b1 - abs(friends[i].r) / 1.2
);
push();
rotate((k * 360) / nRot);
circle(
friends[i].r * cos(friends[i].angle),
friends[i].r * sin(friends[i].angle),
0.5
);
pop();
}
friends[i].r += friends[i].vr;
friends[i].angle += friends[i].va;
if (abs(friends[i].r) > width / 2.5) {
friends[i].vr = -friends[i].vr;
}
for (j in friends) {
if (i != j) {
d = sqrt(
friends[i].r * friends[i].r +
friends[j].r * friends[j].r -
2 *
friends[i].r *
friends[j].r *
cos(friends[j].angle - friends[i].angle)
);
if (d < attraction && d > separation) {
friends[i].r += friends[j].vr / 4;
friends[i].angle += friends[j].va / 4;
}
if (d < separation) {
friends[i].r -= friends[j].vr / 6;
friends[i].angle -= friends[j].va / 6;
}
}
}
}
border();
}
function border() {
noFill();
stroke(0);
strokeWeight(4);
rect(0, 0, width - 20, height - 20);
}
function mousePressed() {
loop();
frameCount = 0;
setup();
draw();
}
function keyPressed() {
if (keyCode === 32) {
save(cnv, "centered", "jpg");
}
}