Billy Buttons

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 sky = s.gradient('l(0,0,0,1)#C9C9C8-#ECECEA:55-#F2F2F0');
var stem = '#2F2F2F';
var blooms = ['#E3AC1C', '#E8B420', '#DCA418'];
var margin = 50;

var stems = intVariable('Stems', 6, 16);
var cluster = intVariable('Blooms', 3, 9);

s.rect(0, 0, width, height).attr({fill: sky});

// Stems go in the lower group so every bloom sits over every stem.
var stalks = s.group();
var dots = s.group();
for (var i = 0; i < stems; i++){
  // Stems rise from beyond the bottom edge and lean a little either way, so
  // neighbours cross like grasses in a field.
  var bx = margin + (width - margin * 2) * (i + getRandomArbitary(0.1, 0.9)) / stems;
  var tx = Math.max(margin + 20, Math.min(width - margin - 20, bx + getRandomInt(-70, 70)));
  var ty = getRandomInt(margin + 30, 300);
  stalks.add(s.line(bx, height + 10, tx, ty).attr({stroke: stem, strokeWidth: 4}));

  // The bloom is a loose spike of dots around the top of the stem, thickest
  // at the tip.
  var span = getRandomInt(80, 150);
  var dx = (bx - tx) / (height + 10 - ty);
  for (var d = 0; d < cluster; d++){
    // The first dot caps the tip exactly, so no bare stem shows above it.
    var tip = d == 0;
    var along = tip ? 0 : Math.pow(getRandomArbitary(0, 1), 1.6) * span;
    var r = getRandomArbitary(13, 18);
    var x = tx + dx * along + (tip ? 0 : getRandomArbitary(-15, 15));
    var y = ty + along + (tip ? 0 : getRandomArbitary(-5, 5));
    x = Math.max(margin + r, Math.min(width - margin - r, x));
    y = Math.max(margin + r, y);
    dots.add(s.circle(x, y, r).attr({fill: blooms[getRandomInt(0, blooms.length - 1)]}));
  }
}