forked from mbostock's block: Branched Random Walk
forked from anonymous's block: Branched Random Walk
license: gpl-3.0 |
forked from mbostock's block: Branched Random Walk
forked from anonymous's block: Branched Random Walk
<!DOCTYPE html> | |
<meta charset="utf-8"> | |
<canvas width="960" height="500"></canvas> | |
<script src="https://d3js.org/d3.v4.min.js"></script> | |
<script> | |
var count = 1000; | |
var stepsToNextBranch = 2; | |
var branchlength = 10; | |
var colorInterpolator = d3.interpolateCool; | |
var randomX = d3.randomNormal(0.3), | |
randomY = d3.randomNormal(0); | |
var canvas = document.querySelector("canvas"), | |
context = canvas.getContext("2d"), | |
width = canvas.width, | |
height = canvas.height, | |
color = d3.scaleSequential(colorInterpolator).domain([0, count]); | |
render(); | |
canvas.onclick = render; | |
function render() { | |
var x0 = width / 20, | |
y0 = height / 2, | |
mainWalk = randomWalk(x0, y0, count); | |
context.clearRect(0, 0, width, height); | |
context.lineJoin = "round"; | |
context.lineCap = "round"; | |
context.lineWidth = 1.5; | |
context.strokeStyle = "black"; | |
renderWalk(mainWalk); | |
context.globalCompositeOperation = "multiply"; | |
context.lineWidth = 1; | |
for (var i = 0; i < mainWalk.length; i += stepsToNextBranch) { | |
var branchStart = mainWalk[i], | |
x0 = branchStart[0], | |
y0 = branchStart[1]; | |
for (var j = 0; j < 1; ++j) { | |
context.strokeStyle = color(i + (Math.random() - 0.5) * 50); | |
var x1 = x0, y1 = y0; | |
for (var k = 0, m = 10; k < m; ++k) { | |
context.globalAlpha = (m - k - 1) / m; | |
var pieceWalk = randomWalk(x1, y1, branchlength), | |
pieceEnd = pieceWalk[pieceWalk.length - 1]; | |
renderWalk(pieceWalk); | |
x1 = pieceEnd[0]; | |
y1 = pieceEnd[1]; | |
} | |
context.globalAlpha = 1; | |
} | |
} | |
} | |
function renderWalk(walk) { | |
var i, n = walk.length; | |
context.beginPath(); | |
context.moveTo(walk[0][0], walk[0][1]); | |
for (i = 1; i < n; ++i) { | |
context.lineTo(walk[i][0], walk[i][1]); | |
} | |
context.stroke(); | |
} | |
function randomWalk(x0, y0, n) { | |
var points = new Array(n), i; | |
points[0] = [x0, y0]; | |
for (i = 1; i < n; ++i) { | |
points[i] = [ | |
x0 += randomX() * 2, | |
y0 += randomY() * 2 | |
]; | |
} | |
return points; | |
} | |
</script> |