var frameWidth = canvasWidth / numCols;
var frameHeight = canvasHeight / numRows;
var baseBranchLength = 40;
var angleVariation = 0.5;
var colors = ['#FF6F61', '#6B5B95', '#88B04B', '#F7CAC9', '#92A8D1', '#955251'];
var bgColors = ['#FAF0E6', '#FBEDFD', '#E6E6FA', '#FFFACD', '#E0FFFF', '#EEFFD5'];
createCanvas(canvasWidth, canvasHeight);
var button = createButton('Next Frame');
button.mousePressed(showNextFrame);
var saveButton = createButton('Save Canvas');
saveButton.position(100, 0);
saveButton.mousePressed(function() {
saveCanvas('evolving.pattern', 'jpg');
function drawFrame(frameValues) {
var row = floor(frameValues / numCols);
var col = frameValues % numCols;
var xOffset = col * frameWidth;
var yOffset = row * frameHeight;
var bgColor = random(bgColors);
rect(xOffset + 10, yOffset + 10, frameWidth - 20, frameHeight - 20, cornerRadius);
translate(xOffset + frameWidth / 2, yOffset + frameHeight / 2);
for (var i = 0; i < 6; i++) {
rotate((TWO_PI / 6) * i);
drawBranch(baseBranchLength, frameValues + 1);
function drawBranch(length, depth) {
if (length < minBranchLength || depth <= 0) {
strokeWeight(random(1, 3));
var chosenColor = random(colors);
var randomAngle1 = random(-angleVariation, angleVariation);
var randomAngle2 = random(-angleVariation, angleVariation);
rotate(PI / 4 + randomAngle1);
drawBranch(length * growthFactor, depth - 1);
rotate(-PI / 4 + randomAngle2);
drawBranch(length * growthFactor, depth - 1);
function showNextFrame() {
if (currentFrame < numRows * numCols) {