fractalkitty looking for math? fractalkitty.com

Mathober 2025

Reye Configuration

#random#trig#3d#interactive#animation#math#geometry#mathober

planes


let t = 0;
let planes = [];
function setup() {
  createCanvas(500, 500, WEBGL);
  background(255);
  describe(
    "A Levi graph of a reye configuration with 4 planes rotating in the center that obstruct part of the view of the graph. The graph has 4 different tones of the same grey to show the colors with 16 points on an outer circle and 12 on an inner. The sketch is on radial graph paper. If the user tries to rotate the sketch, they will see it from the side.  "
  );
  noFill();
  rectMode(CENTER);
  background(245, 250, 255);
  planes = [];
  for (let i = 0; i < 4; i++) {
    planes[i] = {
      tx: random(-50, 50),
      ty: random(-50, 50),
      tz: random(-50, 50),
      rx: random((-2 * PI) / 3, (2 * PI) / 3),
      ry: random((-2 * PI) / 3, (2 * PI) / 3),
      rz: random((-2 * PI) / 3, (2 * PI) / 3)
    };
  }
}

function draw() {
  ambientLight(255);
  background(245, 250, 255);
  t += 0.005;
  orbitControl();
  rotateX(0);
  rotateY(0.01);
  n = 25;
  d = width / n;

  push();
  translate(0, 0, -100);
  stroke(100, 110, 120, 40);

  for (let i = 0; i < n; i++) {
    push();
    rotate(((2 * PI) / n) * i);
    strokeWeight(0.5);
    line(-width / 1.5, 0, width / 1.5, 0);

    circle(0, 0, (width / n) * 2 * i);
    pop();
  }

  stroke(75, 85, 95, 20);

  strokeWeight(1);
  stroke(100, 110, 120, 30);
  rect(0, 0, width / 1.02, width / 1.02);
  rect(0, 0, width / 1.04, width / 1.04);
  pop();
  push();
  fill(10, 20, 30, 15);
  noStroke();
  push();
  rotateX(t / 5);
  rotateY(t / 4);
  rotateZ(t / 6);
  for (let i = 0; i < planes.length; i++) {
    push();
    translate(planes[i].tx, planes[i].ty, planes[i].tz);
    rotateX(planes[i].rx - 2 * PI * cos(t / 4));
    rotateY(planes[i].ry + 2 * PI * sin(t / 5));
    rotateZ(planes[i].rz - 2 * PI * cos(t / 2));
    plane(width / 6, width / 6);
    pop();
  }

  pop();

  pop();
  r1 = (width / 25) * 10;
  r2 = (width / 25) * 1.5;
  t1 = PI / 8;
  t2 = PI / 6;
  fill(100, 110, 120);
  noStroke();
  for (let i = 0; i < 16; i++) {
    push();
    rotate(t1 / 2 + t1 * i);
    translate(r1, 0, 0);
    sphere(5, 20);
    pop();
  }

  for (let i = 0; i < 12; i++) {
    push();
    rotate(t2 * i);
    translate(r2, 0, 0);
    sphere(5, 20);
    pop();
  }
  noFill();
  strokeWeight(3);
  stroke(10, 20, 30);
  line(
    r1 * cos(t1 / 2 + t1 * 1),
    r1 * sin(t1 / 2 + t1 * 1),
    r2 * cos(t2 * 4),
    r2 * sin(t2 * 4)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 1),
    r1 * sin(t1 / 2 + t1 * 1),
    r2 * cos(t2 * 0),
    r2 * sin(t2 * 0)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 1),
    r1 * sin(t1 / 2 + t1 * 1),
    r2 * cos(t2 * 11),
    r2 * sin(t2 * 11)
  );

  line(
    r1 * cos(t1 / 2 + t1 * 3),
    r1 * sin(t1 / 2 + t1 * 3),
    r2 * cos(t2 * 7),
    r2 * sin(t2 * 7)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 3),
    r1 * sin(t1 / 2 + t1 * 3),
    r2 * cos(t2 * 0),
    r2 * sin(t2 * 0)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 3),
    r1 * sin(t1 / 2 + t1 * 3),
    r2 * cos(t2 * 2),
    r2 * sin(t2 * 2)
  );
  push();
  scale(1, -1);
  line(
    r1 * cos(t1 / 2 + t1 * 1),
    r1 * sin(t1 / 2 + t1 * 1),
    r2 * cos(t2 * 4),
    r2 * sin(t2 * 4)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 1),
    r1 * sin(t1 / 2 + t1 * 1),
    r2 * cos(t2 * 0),
    r2 * sin(t2 * 0)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 1),
    r1 * sin(t1 / 2 + t1 * 1),
    r2 * cos(t2 * 11),
    r2 * sin(t2 * 11)
  );

  line(
    r1 * cos(t1 / 2 + t1 * 3),
    r1 * sin(t1 / 2 + t1 * 3),
    r2 * cos(t2 * 7),
    r2 * sin(t2 * 7)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 3),
    r1 * sin(t1 / 2 + t1 * 3),
    r2 * cos(t2 * 0),
    r2 * sin(t2 * 0)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 3),
    r1 * sin(t1 / 2 + t1 * 3),
    r2 * cos(t2 * 2),
    r2 * sin(t2 * 2)
  );
  pop();
  stroke(100, 110, 120);
  line(
    r1 * cos(t1 / 2 + t1 * 5),
    r1 * sin(t1 / 2 + t1 * 5),
    r2 * cos(t2 * 4),
    r2 * sin(t2 * 4)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 5),
    r1 * sin(t1 / 2 + t1 * 5),
    r2 * cos(t2 * 3),
    r2 * sin(t2 * 3)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 5),
    r1 * sin(t1 / 2 + t1 * 5),
    r2 * cos(t2 * 7),
    r2 * sin(t2 * 7)
  );

  line(
    r1 * cos(t1 / 2 + t1 * 7),
    r1 * sin(t1 / 2 + t1 * 7),
    r2 * cos(t2 * 8),
    r2 * sin(t2 * 8)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 7),
    r1 * sin(t1 / 2 + t1 * 7),
    r2 * cos(t2 * 5),
    r2 * sin(t2 * 5)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 7),
    r1 * sin(t1 / 2 + t1 * 7),
    r2 * cos(t2 * 3),
    r2 * sin(t2 * 3)
  );
  push();
  scale(-1, 1);

  line(
    r1 * cos(t1 / 2 + t1 * 5),
    r1 * sin(t1 / 2 + t1 * 5),
    r2 * cos(t2 * 4),
    r2 * sin(t2 * 4)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 5),
    r1 * sin(t1 / 2 + t1 * 5),
    r2 * cos(t2 * 3),
    r2 * sin(t2 * 3)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 5),
    r1 * sin(t1 / 2 + t1 * 5),
    r2 * cos(t2 * 7),
    r2 * sin(t2 * 7)
  );

  line(
    r1 * cos(t1 / 2 + t1 * 7),
    r1 * sin(t1 / 2 + t1 * 7),
    r2 * cos(t2 * 8),
    r2 * sin(t2 * 8)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 7),
    r1 * sin(t1 / 2 + t1 * 7),
    r2 * cos(t2 * 5),
    r2 * sin(t2 * 5)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 7),
    r1 * sin(t1 / 2 + t1 * 7),
    r2 * cos(t2 * 3),
    r2 * sin(t2 * 3)
  );
  pop();

  stroke(170, 180, 190);
  line(
    r1 * cos(t1 / 2 + t1 * 4),
    r1 * sin(t1 / 2 + t1 * 4),
    r2 * cos(t2 * 4),
    r2 * sin(t2 * 4)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 4),
    r1 * sin(t1 / 2 + t1 * 4),
    r2 * cos(t2 * 1),
    r2 * sin(t2 * 1)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 4),
    r1 * sin(t1 / 2 + t1 * 4),
    r2 * cos(t2 * 6),
    r2 * sin(t2 * 6)
  );

  line(
    r1 * cos(t1 / 2 + t1 * 6),
    r1 * sin(t1 / 2 + t1 * 6),
    r2 * cos(t2 * 3),
    r2 * sin(t2 * 3)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 6),
    r1 * sin(t1 / 2 + t1 * 6),
    r2 * cos(t2 * 5),
    r2 * sin(t2 * 5)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 6),
    r1 * sin(t1 / 2 + t1 * 6),
    r2 * cos(t2 * 6),
    r2 * sin(t2 * 6)
  );
  push();
  scale(1, -1);

  line(
    r1 * cos(t1 / 2 + t1 * 4),
    r1 * sin(t1 / 2 + t1 * 4),
    r2 * cos(t2 * 4),
    r2 * sin(t2 * 4)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 4),
    r1 * sin(t1 / 2 + t1 * 4),
    r2 * cos(t2 * 1),
    r2 * sin(t2 * 1)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 4),
    r1 * sin(t1 / 2 + t1 * 4),
    r2 * cos(t2 * 6),
    r2 * sin(t2 * 6)
  );

  line(
    r1 * cos(t1 / 2 + t1 * 6),
    r1 * sin(t1 / 2 + t1 * 6),
    r2 * cos(t2 * 3),
    r2 * sin(t2 * 3)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 6),
    r1 * sin(t1 / 2 + t1 * 6),
    r2 * cos(t2 * 5),
    r2 * sin(t2 * 5)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 6),
    r1 * sin(t1 / 2 + t1 * 6),
    r2 * cos(t2 * 6),
    r2 * sin(t2 * 6)
  );
  pop();

  stroke(220, 230, 240);
  line(
    r1 * cos(t1 / 2 + t1 * 8),
    r1 * sin(t1 / 2 + t1 * 8),
    r2 * cos(t2 * 4),
    r2 * sin(t2 * 4)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 8),
    r1 * sin(t1 / 2 + t1 * 8),
    r2 * cos(t2 * 5),
    r2 * sin(t2 * 5)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 8),
    r1 * sin(t1 / 2 + t1 * 8),
    r2 * cos(t2 * 9),
    r2 * sin(t2 * 9)
  );

  line(
    r1 * cos(t1 / 2 + t1 * 10),
    r1 * sin(t1 / 2 + t1 * 10),
    r2 * cos(t2 * 7),
    r2 * sin(t2 * 7)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 10),
    r1 * sin(t1 / 2 + t1 * 10),
    r2 * cos(t2 * 8),
    r2 * sin(t2 * 8)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 10),
    r1 * sin(t1 / 2 + t1 * 10),
    r2 * cos(t2 * 9),
    r2 * sin(t2 * 9)
  );
  push();
  scale(-1, 1);
  line(
    r1 * cos(t1 / 2 + t1 * 8),
    r1 * sin(t1 / 2 + t1 * 8),
    r2 * cos(t2 * 4),
    r2 * sin(t2 * 4)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 8),
    r1 * sin(t1 / 2 + t1 * 8),
    r2 * cos(t2 * 5),
    r2 * sin(t2 * 5)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 8),
    r1 * sin(t1 / 2 + t1 * 8),
    r2 * cos(t2 * 9),
    r2 * sin(t2 * 9)
  );

  line(
    r1 * cos(t1 / 2 + t1 * 10),
    r1 * sin(t1 / 2 + t1 * 10),
    r2 * cos(t2 * 7),
    r2 * sin(t2 * 7)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 10),
    r1 * sin(t1 / 2 + t1 * 10),
    r2 * cos(t2 * 8),
    r2 * sin(t2 * 8)
  );
  line(
    r1 * cos(t1 / 2 + t1 * 10),
    r1 * sin(t1 / 2 + t1 * 10),
    r2 * cos(t2 * 9),
    r2 * sin(t2 * 9)
  );
  pop();
}