xxxxxxxxxx
// By Roni Kaufman
// https://ronikaufman.github.io
// Made for Genuary 2025
// Day 2: Layers upon layers upon layers.
function setup() {
createCanvas(500, 500);
noLoop();
}
function draw() {
background(5);
let margin = 60;
let nLayers = 10;
let u = (width-2*margin)/(2*nLayers-1);
let s = nLayers*u;
strokeWeight(1.5);
strokeCap(SQUARE);
for (let i = 0; i < nLayers; i++) {
let z = margin + i*u;
fill(rainbow(i/(nLayers-1), "b0"));
noStroke();
square(z, z, s);
stroke("#fffbe6");
noFill();
truchet(z, z, s, nLayers);
stroke(5);
square(z, z, s);
}
}
function truchet(x0, y0, s, n) {
let u = s/n;
for (let i = 0; i < n; i++) {
let x = x0+i*u;
for (let j = 0; j < n; j++) {
let y = y0+j*u;
if (random() < 1/2) {
arc(x, y, u, u, 0, PI/2);
arc(x+u, y+u, u, u, PI, 3*PI/2);
} else {
arc(x+u, y, u, u, PI/2, PI);
arc(x, y+u, u, u, 3*PI/2, TAU);
}
}
}
}
function rainbow(t, alpha) {
let palette = ["#ef562f", "#fc8405", "#f9d531", "#abcd5e", "#62b6de"];
let i = floor((palette.length-1)*t);
let amt = fract((palette.length-1)*t);
return lerpColor(color(palette[i%palette.length]+alpha), color(palette[(i+1)%palette.length]+alpha), amt);
}