fractalkitty looking for math? fractalkitty.com

all

Spring Folk

#random#trig#interactive#animation#nature#plants#animals

playBvdeltavstepvanglemodeleafvinerandomizerbirbflowertulipside1birdModefoxModefoxside2


let playB = true;
let w;
let t = 0;
let t2 = 0;
let vdelta;
let vstep;
let vangle;
let c1, c2;
let rA = [];
let cnt = 0;
let mode = 1;
function setup() {
  randomizer();
  w = min(windowWidth, windowHeight) * 0.95;
  createCanvas(w, w);
}
function draw() {
  background(c2);
  translate(w / 2, w / 2);
  if (mode === 0) {
    birdMode();
  }
  if (mode === 1) {
    foxMode();
  }
}

function leaf(r) {
  noStroke();
  arc(0, 0, r, r / 5, 0, PI);
  arc(0, 0, r, r / 5, PI, TWO_PI);
}
function vine() {
  noFill();
  stroke(c1);
  strokeWeight(3);
  arc(0, 0, w * 0.8, w * 0.8, PI / 2 + vdelta, (3 * PI) / 2 - vdelta);
  arc(0, 0, w * 0.8, w * 0.8, (3 * PI) / 2 + vdelta, PI / 2 - vdelta);
  fill(c1);
  for (let i = PI / 2 + vdelta; i < (3 * PI) / 2 - vdelta; i += vstep) {
    x = w * 0.41 * cos(i);
    y = w * 0.41 * sin(i);
    push();
    translate(x, y);
    rotate(i + vangle - t / 3);
    leaf(w / 40);
    pop();
    x = w * 0.39 * cos(i + vshift);
    y = w * 0.39 * sin(i + vshift);
    push();
    translate(x, y);
    rotate(i - vangle + t / 3);
    leaf(w / 40);
    pop();
    x = -w * 0.41 * cos(i);
    y = w * 0.41 * sin(i);
    push();
    translate(x, y);
    rotate(-i - vangle + t / 3);
    leaf(w / 40);
    pop();
    x = -w * 0.39 * cos(i + vshift);
    y = w * 0.39 * sin(i + vshift);
    push();
    translate(x, y);
    rotate(-i + vangle - t / 3);
    leaf(w / 40);
    pop();
  }
}
function randomizer() {
  vdelta = random(0.1, 0.6);
  vstep = random(0.03, 0.2);
  vangle = random(PI / 3, PI / 5);
  vshift = random(0, 0.1);
  c1 = color(random(0, 100), random(0, 100), random(0, 100));
  c2 = color(random(200, 250), random(200, 250), random(200, 250));
  rA = [
    int(random(3, 10)),
    int(random(4, 9)),
    int(random(5, 11)),
    int(random(9, 13) * 2),
  ];
  mode = int(random(0, 1.9));
}
function birb(r) {
  noStroke();
  push();
  rotate(t);
  beginShape();
  for (let i = (3 * PI) / 2; i > PI / 2; i -= 0.1) {
    a = r * sin(i);
    b = r * cos(i);
    vertex(-a, -b);
  }
  for (let i = (3 * PI) / 2; i < 3 * PI; i += 0.1) {
    a = 2 * r + r * sin(i);
    b = r * cos(i);
    vertex(-a, -b);
  }
  for (let i = PI / 2; i < (3 * PI) / 2; i += 0.1) {
    a = r + 2 * r * sin(i);
    b = 2 * r * cos(i);
    vertex(-a, -b);
  }
  ellipse(-r, r / 1.5, 3.5 * r, r);
  endShape(CLOSE);
  triangle(-3 * r, 0, -3 * r, w / 40, -3 * r - r / 3, w / 40);
  push();
  fill(c2);
  circle(-2.3 * r, -r / 4, w / 40);
  fill(c1);
  circle(-2.3 * r, -r / 4, w / 150);
  fill(c2);
  pop();
  fill(c2);
  translate(-r * 2, r);
  for (let i = 0; i < TWO_PI; i += TWO_PI / rA[0]) {
    push();
    translate(w / 20, -w / 60);
    rotate(i + t);
    translate(w / 80, 0);
    leaf(w / 60);
    pop();
    push();
    translate(w / 11, -w / 60);
    rotate(i + t2);
    translate(w / 130, 0);
    leaf(w / 90);
    pop();
  }

  stroke(c2);
  noFill();
  arc(r, -r / 3, r * 2, r * 1.5, PI / 12, PI);
  fill(c2);
  push();
  rotate(PI / 4);
  translate(-w / 40, w / 50);
  leaf(w / 60);
  translate(w / 60, -w / 80);
  leaf(w / 60);
  translate(w / 100, w / 70);
  leaf(w / 60);
  pop();
  pop();
  fill(c1);
  stroke(c1);
  line(-r, 3 * r, -r * 1.1 - 1.5 * r * sin(t), 2 * r - 0.7 * r * sin(t));
  line(-r - r / 3, 3 * r, -r - 1.5 * r * sin(t), 2 * r - 0.7 * r * sin(t));
}
function flower(n, r, a, b) {
  push();
  if (rA[0] % 0 === 0) {
    rotate(t2);
  } else {
    rotate(t);
  }

  fill(a);
  noStroke();
  circle(0, 0, r);
  for (let i = 0; i < n; i++) {
    push();
    rotate((TWO_PI / n) * i);
    translate(r / 2, 0);
    circle(0, 0, r / 2.5);
    pop();
  }

  fill(b);
  circle(0, 0, r / 2);
  pop();
}
function tulip() {
  fill(c1);
  n = w / 20;

  for (let i = 0; i < n; i += 0.5) {
    circle((2 * i * i) / 35 + i / 3 + (i / 3) * t, -i * 2, n * 1.5 - i * 1.5);
    if (i % 5 === 0) {
      circle(
        (2 * i * i) / 65 + w / 75 + (t * i) / 2,
        -i * 2 + w / 4,
        w / (110 + i * 5)
      );
      circle(
        (-2 * i * i) / 65 - w / 75 - (t * i) / 2,
        -i * 2 + w / 4,
        w / (110 + i * 5)
      );
    }

    circle((-2 * i * i) / 35 - i / 3 - (i / 3) * t, -i * 2, n * 1.5 - i * 1.5);
  }
  line(0, 0, 0, w / 4);
  line(0, 0, 0, -w / 9);
  fill(c1);
  circle(0, -w / 9, w / 50);
  fill(c2);
  circle(0, -w / 9, (w / 50) * cos(t));

  line(w / 58, 0, w / 58, -w / 11);
  circle(w / 58, -w / 11, w / 90);
  line(-w / 58, 0, -w / 58, -w / 11);
  circle(-w / 58, -w / 11, w / 90);
  fill(c1);
  push();
  rotate(PI / 4);
  translate(w / 20, w / 10);
  leaf(w / 10);
  pop();
  push();
  scale(-1, 1);
  rotate(PI / 4);
  translate(w / 20, w / 10);
  leaf(w / 10);
  pop();
  if (rA[1] % 2 === 0) {
    fill(c2);
    circle(0, w / 60, w / 25 - t * 8);
  }
  fill(c1);
}
function side1() {
  push();
  translate(w / 3.5, 0);
  birb(w / 18);
  push();
  translate(-w / 10, -w / 4);
  flower(rA[1], w / 10 - rA[0], c1, c2);
  pop();
  push();
  translate(-w / 5, -w / 3);
  flower(rA[2] * 2, w / 20, c1, c2);
  pop();
  push();
  translate(-w / 18, w / 4.5);
  fill(c1);
  circle(0, 0, w / (rA[0] * 4));
  flower(rA[0], w / 20, c2, c1);
  for (let i = 0; i < rA[0]; i++) {
    push();
    rotate((TWO_PI / rA[0]) * i + t2 / 2);
    translate(w / 40, 0);
    circle(0, 0, rA[0] - (rA[0] + 1) * cos(t2 / 5));
    pop();
  }
  pop();
  pop();
  push();
  translate(w / 9, w / 5);
  scale(0.5, 0.5);
  tulip();
  pop();
  for (let i = 0; i < PI - PI / rA[0]; i += 0.2) {
    x = (i * w) / 10;
    y = (-w / (10 - rA[0] / 4)) * cos(i - t / 3) - w / 6;
    circle(x, y, w / (100 + rA[3]) - i);
    if (rA[2] % 2 === 0) {
      circle(x / 1.1, y + w / 50, w / (100 + rA[3]) - i * 4);
    }
  }
  if (rA[2] % 2 === 1) {
    push();
    translate(w / 4, -w / 6);
    for (let i = 0; i < round(rA[0] / 2) + 1; i++) {
      push();
      rotate(-PI / 4 + (PI / 10) * i);
      translate(w / 30, w / 20);
      rotate(t / 2);
      leaf(w / 14);
      translate(-w / 35, -w / 20);
      leaf(w / 25);
      pop();
    }

    pop();
  }
}
function mousePressed() {
  setup();
  draw();
}
function keyPressed() {
  playB = !playB;
}
function birdMode() {
  if (playB) {
    t = (PI / 9) * sin(cnt / 50) - PI / 10;
    t2 = cnt / 50;
    cnt++;
  }
  vine();
  if (rA[0] % 2 === 0) {
    push();
    scale(1.1, 1.1);
    vine();
    pop();
  }
  side1();
  push();
  scale(-1, 1);
  side1();
  pop();
  push();
  translate(0, w / 5);
  tulip();
  pop();

  circle(0, -w / 10, w / 9);

  for (let i = 0; i < rA[3]; i++) {
    push();
    translate(0, -w / 10);
    rotate((TWO_PI / rA[3]) * i);
    translate(w / 20, 0);
    leaf(w / 10 + t * 40);
    pop();
  }
  fill(c2);
  circle(0, -w / 10, w / 25);
}

function foxMode() {
  if (playB) {
    t = (PI / 9) * sin(cnt / 50) - PI / 10;
    t2 = cnt / 50;
    cnt++;
  }
  push();
  rotate(PI / 2);
  vine();
  pop();
  fill(c1);
  strokeWeight(2);
  stroke(c1);
  if (rA[0] % 2 === 0) {
    push();
    scale(1.1, 1.1);
    vine();
    pop();
  }
  side2();
  push();
  scale(-1, 1);
  side2();
  pop();
  push();
  translate(0, w / 10);
  tulip();
  pop();
  noStroke();
  circle((w / 25) * cos(t2 / 3), -w / 4, w / 7);
  circle((-w / 25) * cos(t2 / 3), -w / 4, w / 7);
  fill(c2);
  circle(0, -w / 4, w / 7);
  fill(c1);
  for (let i = 0; i < rA[3]; i++) {
    push();
    translate(0, -w / 4);
    rotate((TWO_PI / rA[3]) * i);
    translate(w / 80, 0);
    leaf(w / 16 - t * 10);
    pop();
  }
  fill(c2);
  circle(0, -w / 4, w / 45);
}

function fox() {
  push();
  translate(0, w / 12);
  ellipse(0, 0, w / 20, w / 8);
  triangle(w / 40, -w / 9, w / 150, -w / 11, w / 45, -w / 14);
  triangle(-w / 40, -w / 9, -w / 150, -w / 11, -w / 45, -w / 14);
  noStroke();

  circle(0, -w / 13.5, w / 20);
  push();
  translate(0, w / 28);
  rotate(PI / 3 - t);
  n = w / 25;
  for (let i = 0; i < n; i += 0.5) {
    fill(c1);
    circle((-2 * i * i) / 35 - i / 3 - (i / 3) * t, -i * 2, n * 1.5 - i * 1.5);
    if (i > n - 6) {
      fill(c2);
      noStroke();
      circle(
        (-2 * i * i) / 35 - i / 3 - (i / 3) * t,
        -i * 2,
        n * 1.5 - i * 1.51
      );
    }
  }

  pop();
  fill(c2);
  ellipse(0, w / 90, w / 25, w / 10);
  stroke(c1);
  fill(c1);
  arc(-w / 60, w / 90, w / 70, w / 10, -PI / 2, PI / 2);
  arc(w / 60, w / 90, w / 70, w / 10, PI / 2, -PI / 2);
  pop();
  push();
  translate(-w / 50, w / 35);
  fill(c2);
  stroke(c2);
  strokeWeight(2);
  push();
  line(w / 50, w / 80, -w / 100, -w / 45);
  line(w / 50, w / 80, w / 20, -w / 45);
  pop();


  pop();
  fill(c2);
  noStroke();
  circle(w / 80, w / 180, w / 120);
  circle(-w / 80, w / 180, w / 120);
  fill(c1);
  circle(w / 80, w / 180, w / 300);
  circle(-w / 80, w / 180, w / 300);
  ellipse(w / 50, w / 7, w / 40, w / 80);
  ellipse(-w / 50, w / 7, w / 40, w / 80);
  fill(c2);
  push();
  translate(0, w / 15);
  flower(rA[0], w / 80, c1, c2);
  translate(0, w / 55);
  flower(rA[2], w / 90, c1, c2);
  pop();
}

function side2() {
  push();
  translate(w / 3.5, 0);
  push();
  translate(-w / 10, 0);
  scale(1.2, 1.2);
  fox();
  pop();
  push();
  translate(w / 30, -w / 40);
  flower(rA[2], w / 14, c1, c2);
  pop();
  push();
  translate(-w / 18, -w / 7.5);
  fill(c1);
  circle(0, 0, w / (rA[0] * 4));
  flower(rA[0], w / 20, c2, c1);
  for (let i = 0; i < rA[0]; i++) {
    push();
    rotate((TWO_PI / rA[0]) * i + t2 / 2);
    translate(w / 40, 0);
    circle(0, 0, rA[0] - (rA[0] + 1) * cos(t2 / 5));
    pop();
  }
  pop();
  pop();
  push();
  translate(w / 9, w / 4);
  scale(0.4, 0.4);
  tulip();
  pop();
  push();
  translate(w / 5.5, w / 4);
  scale(0.3, 0.3);
  tulip();

  pop();
  for (let i = 0; i < PI - PI / rA[0]; i += 0.2) {
    x = (i * w) / 10;
    y = (w / (12 - rA[0] / 4)) * cos(i - t / 3) - w / 6;
    circle(x, y, w / (100 + rA[3]) - i);
    if (rA[2] % 2 === 0) {
      circle(x / 1.1, y - w / 50, w / (100 + rA[3]) - i);
      circle(x / 1.1, y - w / 25, w / (100 + rA[3]) - i);
    }
  }
}