Moons
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 = '#F7F6F6';
var squareBackground = '#1B7A99';
var light = '#FFFFFF';
var dark = '#0E2E2B';
var margin = 80;
var cells = intVariable('Grid', 3, 6);
// A half has an even chance of being lit, in shadow, or not there at all.
var phases = [light, dark, null];
s.rect(0, 0, width, height).attr({fill: background});
var pitch = (width - margin * 2) / cells;
var gap = pitch * 0.08;
var size = pitch - gap;
var r = size * 0.32;
function half(cx, cy, vertical, first, fill){
if (!fill) { return; }
var d = vertical
? 'M' + cx + ',' + (cy - r) + ' A' + r + ',' + r + ' 0 0,' + (first ? 0 : 1) + ' ' + cx + ',' + (cy + r) + ' Z'
: 'M' + (cx - r) + ',' + cy + ' A' + r + ',' + r + ' 0 0,' + (first ? 1 : 0) + ' ' + (cx + r) + ',' + cy + ' Z';
s.path(d).attr({fill: fill});
}
for (var row = 0; row < cells; row++){
for (var col = 0; col < cells; col++){
var x = margin + gap / 2 + col * pitch;
var y = margin + gap / 2 + row * pitch;
s.rect(x, y, size, size).attr({fill: squareBackground});
var vertical = getRandomInt(0, 1) == 0;
var cx = x + size / 2, cy = y + size / 2;
var a = phases[getRandomInt(0, 2)];
var b = phases[getRandomInt(0, 2)];
// Matching halves become one circle; two paths leave a hairline seam.
if (a && a == b) {
s.circle(cx, cy, r).attr({fill: a});
} else {
half(cx, cy, vertical, true, a);
half(cx, cy, vertical, false, b);
}
}
}
Copyright © 2014–2026 Logic and Matter. All rights reserved. Questions? Comments? hello@variart.io