fractalkitty looking for math? fractalkitty.com

Genuary 2024

iris

#random#trig#interactive#animation#genuary

friendsseparationattractionborder

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");
  }
}