var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
var totalLineLength = 1;
var currentLineWidth = 2;
var maxLineWidth = 10;
var baseX = 0;
var baseY = 0;
var trunkLength = 0;
var stopGrowing = false;
window.addEventListener('resize', resizeCanvas, false);
function resizeCanvas() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
baseX = canvas.width / 2;
baseY = canvas.height;
trunkLength = canvas.height / 5;
paintFractalTree(baseX, baseY, Math.PI / 2, currentLineWidth, trunkLength, totalLineLength, [79,49,0], [0,150,0], 1);
}
resizeCanvas();
window.setInterval(function() {
if(stopGrowing) return;
totalLineLength++;
currentLineWidth = Math.min(currentLineWidth * 1.005, maxLineWidth);
resizeCanvas();
}, Math.round(1000 / 60));
function paintFractalTree(x, y, direction, lineWidth, lineLength, runningTotalLineLength, startColor, endColor, colorLerp) {
if(lineWidth < 1) {
stopGrowing = true;
return;
}
context.beginPath();
var color = [];
for(var i = 0; i < 3; i++) {
color.push(endColor[i] - Math.round((endColor[i] - startColor[i]) * colorLerp));
}
context.strokeStyle = rgbToHex(color);
context.lineWidth = lineWidth;
context.moveTo(x, y);
var thisLineLength = Math.min(lineLength, runningTotalLineLength);
var newX = Math.cos(direction) * thisLineLength + x;
var newY = -Math.sin(direction) * thisLineLength + y;
runningTotalLineLength -= thisLineLength;
context.lineTo(newX, newY);
context.stroke();
if(runningTotalLineLength == 0) {
return;
}
var actions = [];
var newColorLerp = colorLerp * 0.96;
var leftDirection = direction - Math.PI / 6;
var leftLineWidth = lineWidth * .85;
var leftLineLength = lineLength * 0.8;
actions.push(function() {
paintFractalTree(newX, newY, leftDirection, leftLineWidth, leftLineLength, runningTotalLineLength, startColor, endColor, newColorLerp);
});
var rightDirection = direction + Math.PI / 6;
var rightLineWidth = lineWidth * .85;
var rightLineLength = lineLength * 0.8;
actions.push(function() {
paintFractalTree(newX, newY, rightDirection, rightLineWidth, rightLineLength, runningTotalLineLength, startColor, endColor, newColorLerp);
});
if(Math.random() < 0.5) {
actions[0]();
actions[1]();
} else {
actions[1]();
actions[0]();
}
}
function rgbToHex(rgb) {
var hex = '#';
for(var i = 0; i < 3; i++) {
var part = rgb[i].toString(16);
if(part.length == 1) {
part = '0' + part;
}
hex += part;
}
return hex;
}
<div>
<b>Fractal Tree</b>
</div>
<canvas id="canvas"></canvas>
* { margin:0; padding:0; }
html, body { width:100%; height:100%; }
canvas { display:block; }
div {
position: absolute;
top: 10px;
left: 10px;
font-family: helvetica;
}