fractalkitty looking for math? fractalkitty.com

codepen challenges

Random Walk Dungeon + Dragon

#random#trig#grid#interactive#animation#accumulates#random-walk#codepen-challenge

Random Walk Dungeon with Random Walk Dragons

wArrayoldxoldyrandomWalkdrawWalkrandomDragongrid

let d, g, img, dd;
let wArray = [];
let oldx = 0,
  oldy = 0;
function setup() {
  b = min(windowWidth, windowHeight);
  cnv = createCanvas(b, b);
  dd = width / random(20, 30);
  np = min(width * 1.5, 1500);
  background(0);
  g = 20;
  d = width / g;
  wArray[0] = [];
  wArray[1] = [];
  wArray[2] = [];
  wArray[3] = [];
  wArray[4] = [];
  wArray[5] = [];
  stroke(255);
  randomWalk();
  frameRate(2);
}

function draw() {
  translate(width / 2, width / 2);
  drawWalk();
}

function randomWalk() {
  for (let t = 0; t < np; t++) {
    p = random(-1, 1);
    s = random(-1, 1);

    if (p > 0) {
      p = dd;
    }
    if (p < 0) {
      p = -dd;
    }
    q = random(-1, 1);
    if (q > 0) {
      q = dd;
    }
    if (q < 0) {
      q = -dd;
    }
    x = oldx + p * cos(p + oldx * t) * cos(t + oldy);
    y = oldy + q * cos(q + oldy * t) * sin(t + oldx);
    if (x > width / 2) {
      oldx = oldx - width;
      x = x - width;
    }
    if (x < -width / 2) {
      oldx = oldx + width;
      x = x + width;
    }
    if (y > width / 2) {
      oldy = oldy - width;
      y = y - width;
    }
    if (y < -width / 2) {
      oldy = oldy + width;
      y = y + width;
    }
    strokeWeight((d * abs(s)) / 2);
    wArray[0][t] = oldy;
    wArray[1][t] = oldx;
    wArray[2][t] = y;
    wArray[3][t] = x;
    wArray[4][t] = (d * abs(s)) / 2;
    if (s > 0.93) {
      wArray[5][t] = 1;
    }

    line(oldy, oldx, y, x);

    oldx = x;
    oldy = y;
  }
}

function drawWalk() {
  background(0);
  for (let t = 0; t < np; t++) {
    strokeWeight(wArray[4][t]);
    line(wArray[0][t], wArray[1][t], wArray[2][t], wArray[3][t]);
  }
  for (let t = 0; t < np; t++) {
    if (wArray[5][t] === 1) {
      push();
      stroke(200, 0, 0);
      translate(oldy, oldx);
      randomDragon(width / 1500);
      pop();
    }
  }
  push();
  translate(-width / 2, -height / 2);
  grid();
  pop();
}

function randomDragon(dd) {
  oldx1 = 0;
  oldy1 = 1;
  for (let t = 0; t < 200; t++) {
    p = random(-1, 1);
    s = random(-1, 1);

    if (p > 0) {
      p = dd;
    }
    if (p < 0) {
      p = -dd;
    }
    q = random(-1, 1);
    if (q > 0) {
      q = dd;
    }
    if (q < 0) {
      q = -dd;
    }
    x1 = oldx1 + p * cos(p + oldx1 * t) * cos(t + oldy1);
    y1 = oldy1 + q * cos(q + oldy1 * t) * sin(t + oldx1);
    if (x > width / 2) {
      oldx1 = oldx1 - width;
      x1 = x1 - width;
    }
    if (x1 < -width / 2) {
      oldx1 = oldx1 + width;
      x = x1 + width;
    }
    if (y1 > width / 2) {
      oldy1 = oldy1 - width;
      y1 = y1 - width;
    }
    if (y1 < -width / 2) {
      oldy1 = oldy1 + width;
      y1 = y1 + width;
    }
    strokeWeight(width / 5000);
    line(oldy1, oldx1, y1, x1);
    oldx1 = x1;
    oldy1 = y1;
  }
}

function grid() {
  fill(0);
  noStroke();
  rect(0, 0, width, d / 3);
  rect(0, height - d / 3, width, d / 3);
  rect(0, 0, d / 3, height);
  rect(width - d / 3, 0, d / 3, height);
  strokeWeight(0.5);
  stroke(0);
  for (let i = 0; i < g; i++) {
    for (let j = 0; j < 5; j++) {
      line(i * d + (j * d) / 5, 0, i * d + (j * d) / 5, width);
      line(0, i * d + (j * d) / 5, width, i * d + (j * d) / 5);
    }
  }
}

function keyPressed() {
  if (keyCode === 32) {
    save(cnv, "RandomDungeon.jpg");
  }
  if (keyCode === 78) {
    setup();
    draw();
  }
}

function windowResized() {
  setup();
  draw();
}