let SCL = 4, N, NX, NY, S, pal, grid, ENTROPY = 4;
createCanvas(297*SCL, 210*SCL);
describe("grid of cells");
SZ = min(windowWidth, windowHeight)
NX = ~~(windowWidth / S);
NY = ~~(windowHeight / S);
grid = new Array(NX * NY).fill(~~random(ENTROPY));
for (let i = 0; i < CT; i++) {
const val = ~~random(ENTROPY);
const clr = ~~random(pal.length);
const w = ~~random(1, min(~~(M / 2 + 1), NX - x));
const h = ~~random(1, min(~~(M / 2 + 1), NY - y));
setGrid(x, y, w, h, S, val, clr);
function setGrid(x, y, w, h, S, val, clr) {
for (let j = y; j < y + h; j++) {
for (let i = x; i < x + w; i++) {
setCell(x, y, S, val, clr);
function setCell(x, y, S, val, clr) {
grid[y*NX+x] = val + clr * 10;
svgGrps = new Array(pal.length).fill(``);
for (let y = 0; y < NY; y++) {
for (let x = 0; x < NX; x++) {
function drawCell(x, y, S) {
svgLine(x+S/3, y+S/2, x+S-S/3, y+S/2, clr);
svgLine(x+S/2, y+S/3, x+S/2, y+S-S/3, clr);
for (let i = 0; i < S; i += S/val) {
svgLine(x, y + i, x + S, y + i, clr);
function svgLine(x1, y1, x2, y2, clr, prec = 2) {
svgGrps[clr] += `<line x1="${nf(x1,0,prec)}" y1="${nf(y1,0,prec)}" x2="${nf(x2,0,prec)}" y2="${nf(y2,0,prec)}" />\n`;
function mouseClicked() {
if (mouseButton != RIGHT) setup();
saveSvg("epi_grid.svg.txt");
function saveSvg(file_name) {
let svgAll = `<svg width="${width}" height="${height}" xmlns="http://www.w3.org/2000/svg">\n`;
for (let i = 0; i < svgGrps.length; i++) {
const svgGr = svgGrps[i];
svgAll += `<g id="${pal[i]}" stroke="${pal[i]}" stroke-width="1" fill="none">\n` + svgGr + `</g>\n`;
save(svgAll.split("\n"), file_name);