Moons

to generate a new and unique variation

Source Code

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);
    }
  }
}