fractalkitty looking for math? fractalkitty.com

Genuary 2024

current of jellies

#random#trig#interactive#animation#sea#animals#genuary

jelliesjellyborder


let jellies;

function setup() {
  createCanvas(600, 600);
  rectMode(CENTER);
  angleMode(DEGREES);
  jellies = [];
  nJellies = int(random(3, 10));
  for (let i = 0; i < nJellies; i++) {
    jellies[i] = {
      r: random(0, width / 1.5),
      angle: random(0, 360),
      scl: random(0.1, 1),
      rot: random(0, 360),
      a: random(40, 80),
      b: random(40, 80),
      c: random(0.8, 5)
    };
  }
  m = 10;
  nRot = int(random(5, 8));
}

function draw() {
  background(2, 106, 224);
  translate(width / 2, height / 2);
  t = frameCount / 3;
  noStroke();
  for (let i = width / 2; i > 0; i--) {
    fill(24 - i, 80 - i, 184 - i);
    circle(0, 0, (i * width) / 100);
  }
  if (keyIsPressed) {
    nRot2 = 1;
  } else {
    nRot2 = nRot;
  }
  for (let j = 0; j < nRot2; j++) {
    push();
    rotate((j * 360) / nRot);
    for (let i = 0; i < jellies.length; i++) {
      push();
      rotate(jellies[i].angle - t / jellies[i].c);
      translate(
        jellies[i].r + (jellies[i].r * sin(t)) / 2,
        jellies[i].r * sin(t)
      );
      rotate((t * jellies[i].c) / 30 + jellies[i].b + jellies[i].a);
      scale(jellies[i].scl, jellies[i].scl);
      jelly(jellies[i].a, jellies[i].b, jellies[i].c);

      pop();
      noFill();
      strokeWeight(0.3);
      stroke(255, 255, 255, 150);
      circle(
        jellies[i].r * cos(jellies[i].angle + t / jellies[i].c - t / 2),
        jellies[i].r * sin(jellies[i].angle + t / jellies[i].c),
        jellies[i].a / 10
      );
      circle(
        (jellies[i].r / 3) * cos(jellies[i].angle + t / jellies[i].c - t / 2),
        jellies[i].r * 1.2 * sin(jellies[i].angle + t / jellies[i].c),
        jellies[i].a / 30
      );
      noStroke();
    }
    pop();
  }

  for (let i = 0; i < jellies.length; i++) {}
  border();
}

function jelly(a, b, c) {
  fill(100, 220, 255, 2);
  for (let i = 0; i < 20; i++) {
    ellipse(0, 0, 80 - i, 160 - i / 2);
  }

  noFill();
  strokeWeight(2);

  beginShape();
  for (let k = 0; k < 50; k += 0.3) {
    stroke(255, 255, 255, k * 2);
    point(
      -20 + k * sin(k * 5 + t / b) * cos((t * 5) / a + b),
      30 + (k * b) / 10
    );
    point(
      20 + k * sin(k * 5 + t / a) * cos((t * 5) / c + a),
      30 + (k * a) / 10
    );
  }
  endShape();

  strokeWeight(1);
  for (let i = 0; i < 180; i += 3) {
    for (let j = 0; j < 2; j++) {
      stroke(
        20 + 124 * abs(sin(i + t * m)),
        60 + 230 * abs(sin(i + t * m)),
        100 + 255 * abs(sin(i + t * m)),
        50
      );
      x = (42 - j * 24) * cos(-90 + i);
      y = 80 * sin(-90 + i);
      circle(x, y, 2);
      circle(-x, y, 2);
    }
  }
}
function border() {
  noFill();
  stroke(20, 50, 60);
  strokeWeight(4);
  rect(0, 0, width - 20, height - 20);
}

function mousePressed() {
  frameCount = 0;
  setup();
  draw();
}

function keyPressed() {}