Billy Buttons
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 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)]}));
}
}
Copyright © 2014–2026 Logic and Matter. All rights reserved. Questions? Comments? hello@variart.io