fractalkitty looking for math? fractalkitty.com

weekly creative coding

travelers

#random#trig#interactive#animation#wcc

pointsnPointstravelers

let points = [];
let nPoints = 100;
let travelers = [];
function setup() {
  createCanvas(windowWidth, windowHeight);
  background(0);
  cnt = 0;
  d = 15;
  p = { x: 0, y: 0 };
  points.push(p);
  angleMode(DEGREES);
  c = 0;
  while (c < 2000) {
    r = random(-min(width, height) / 2.5);
    a = random(360);
    p = {
      x: r * cos(a),
      y: r * sin(a)
    };
    c++;
    b = true;
    for (let i = 0; i < points.length; i++) {
      if (dist(p.x, p.y, points[i].x, points[i].y) < d) {
        b = false;
      }
    }
    if (b) {
      cnt++;
      points[cnt] = p;
    }
  }
  travelers[0] = {
    x: 0,
    y: 0,
    x1: 0,
    y1: 0,
    r: random(20, width / 4),
    centerX: 0,
    centerY: 0,
    a: 0,
    t: 0,
    speed: 0.5,
    d: 30
  };
}

function draw() {
  translate(width / 2, height / 2);
  background(0, 0, 0, 20);
  t = frameCount / 30;
  rotate(t);
  for (let i = 0; i < travelers.length; i++) {
    travelers[i].x = travelers[i].r * cos(travelers[i].a + travelers[i].t);
    travelers[i].y = travelers[i].r * sin(travelers[i].a + travelers[i].t);
    travelers[i].t += travelers[i].speed;
  }

  d2 = 20;
  noStroke();

  for (let i = 0; i < points.length; i++) {
    fill(100, 150, 200);
    circle(points[i].x, points[i].y, 2);
  }

  for (let i = 0; i < points.length; i++) {
    for (let j = 0; j < travelers.length; j++) {
      s = dist(points[i].x, points[i].y, travelers[j].x, travelers[j].y);
      if (s < travelers[j].d) {
        rd = map(travelers[j].x, -width / 2, width / 2, 50, 200);
        gr = map(travelers[j].y, -width / 2, width / 2, 80, 150);
        bl = map(travelers[j].y, -width / 2, width / 2, 100, 250);
        stroke(rd, gr, bl, 50);
        line(points[i].x, points[i].y, travelers[j].x, travelers[j].y);
      }
    }
  }
}

function mousePressed() {
  x = mouseX - width / 2;
  y = mouseY - height / 2;
  if (dist(x, y, 0, 0) < min(width, height) / 2.2) {
    r = sqrt(x * x + y * y);
    if (x >= 0) {
      a = asin(y / r);
    } else if (x < 0 && y > 0) {
      a = acos(x / r);
    } else {
      a = 180 - asin(y / r);
    }
    travelers.push({
      x: 0,
      y: 0,
      x1: x,
      y1: y,
      r: r,
      centerX: 0,
      centerY: 0,
      a: a - t,
      t: 0,
      speed: random(-0.5, 0.5),
      d: randomGaussian(d + 15, 10)
    });
  }
}


function keyPressed() {
  points = [];
  travelers = [];
  setup();
  draw();
}