squares = {
const { rows, cols } = grid;
const [minR, maxR] = radiusExtent;
const rNoiseWindow = 19;
const posThetaNoiseWindow = 1000;
const posRadiusNoiseWindow = 58999;
return d3.range(rows).flatMap((j) =>
d3.range(cols).map((i) => {
const palette = getRandomPalette();
let circles = [
{ fill: palette.paper },
{ fill: palette.hue1, blend: true },
{ fill: palette.hue2, blend: true }
];
circles = circles.map((c, k) => {
const rNoiseFreq = math.lerp(1 / 50, 100, rNoiseFactor);
const rNoise =
0.5 + 0.5 * rnd.noise4D(k, j, i, rNoiseWindow, rNoiseFreq);
const r = minR + rNoise * (maxR - minR);
const posAngleNoise =
0.5 +
0.5 * rnd.noise4D(k, j, i, posThetaNoiseWindow, angleNoiseFactor);
const theta = posAngleNoise * Math.PI * 2;
const posRadiusNoise =
0.5 * rnd.noise4D(k, j, i, posRadiusNoiseWindow, posNoiseFactor);
const posRadius = posRadiusNoise;
const u = 0.5 + Math.cos(theta) * posRadius;
const v = 0.5 + Math.sin(theta) * posRadius;
return { ...c, r, u, v };
});
return {
col: i,
row: j,
circles,
bg: palette.bg
};
})
);
}