Facets
to generate a new and unique variation
Every variart piece is a small program. This is the one that drew what you're looking at.
var background = '#FFFFFF';
var dark = '#4A4A4C';
var light = '#FFFFFF';
var margin = 60;
var cells = intVariable('Grid', 3, 7);
var wobble = intVariable('Wobble', 0, 30);
s.rect(0, 0, width, height).attr({fill: background});
var size = (width - margin * 2) / cells;
var jitter = size * wobble / 100;
// Jittered lattice. Points on the border move less, so its ragged edge stays
// clear of the canvas wrap.
var edgeJitter = Math.min(jitter, 15);
var points = [];
for (var r = 0; r <= cells; r++){
points.push([]);
for (var c = 0; c <= cells; c++){
var dx = getRandomArbitary(-1, 1) * ((c == 0 || c == cells) ? edgeJitter : jitter);
var dy = getRandomArbitary(-1, 1) * ((r == 0 || r == cells) ? edgeJitter : jitter);
points[r].push([margin + c * size + dx, margin + r * size + dy]);
}
}
function triangle(a, b, c){
var fill = getRandomInt(0, 9) < 4 ? dark : light;
s.polygon(a[0], a[1], b[0], b[1], c[0], c[1])
.attr({fill: fill, stroke: dark, strokeWidth: 1, strokeLinejoin: 'round'});
}
// Each cell fans out from a point somewhere inside it into four triangles.
for (var r = 0; r < cells; r++){
for (var c = 0; c < cells; c++){
var tl = points[r][c], tr = points[r][c + 1];
var br = points[r + 1][c + 1], bl = points[r + 1][c];
var u = getRandomArbitary(0.2, 0.8), v = getRandomArbitary(0.2, 0.8);
var top = [tl[0] + (tr[0] - tl[0]) * u, tl[1] + (tr[1] - tl[1]) * u];
var bottom = [bl[0] + (br[0] - bl[0]) * u, bl[1] + (br[1] - bl[1]) * u];
var centre = [top[0] + (bottom[0] - top[0]) * v, top[1] + (bottom[1] - top[1]) * v];
triangle(tl, tr, centre);
triangle(tr, br, centre);
triangle(br, bl, centre);
triangle(bl, tl, centre);
}
}
Copyright © 2014–2026 Logic and Matter. All rights reserved. Questions? Comments? hello@variart.io