Zing, pow
Click it to make it go some more
| <!DOCTYPE html> | |
| <html> | |
| <meta charset="utf-8"> | |
| <style> | |
| body { | |
| margin: 0; | |
| background: #000; | |
| min-width: 960px; | |
| } | |
| </style> | |
| <body> | |
| <script src="http://d3js.org/d3.v3.js"></script> | |
| <script src="main.js"></script> | |
| </body> | |
| </html> |
| var width = Math.max(960, innerWidth), | |
| height = Math.max(500, innerHeight); | |
| var stop = 200; | |
| // TODO: randomly move the nodes! Maybe with smooth transitions | |
| var canvas = d3.select("body").append("canvas") | |
| .attr("width", width) | |
| .attr("height", height) | |
| .on("ontouchstart" in document ? "touchdown" : "mousedown", start); | |
| var context = canvas.node().getContext("2d"); | |
| //context.globalCompositeOperation = "lighter"; | |
| var nodes = d3.range(1, 8) | |
| .map(function() { | |
| return { | |
| x: Math.random * width, | |
| y: Math.random * height, | |
| }; | |
| }); | |
| var linkArray = []; | |
| function populateLinkArray() { | |
| linkArray = []; | |
| for (var i = 0; i < nodes.length; i++) { | |
| for (var j = i + 1; j < nodes.length; j++) { | |
| if (Math.random() > 0.6) { | |
| var source = nodes[i], | |
| target = nodes[j]; | |
| linkArray.push({ | |
| scaleX: d3.scale.linear().range([source.x, target.x]), | |
| scaleY: d3.scale.linear().range([source.y, target.y]), | |
| }); | |
| } | |
| } | |
| } | |
| } | |
| populateLinkArray(); | |
| var stopAfter = 1000; // number of frames before we stop | |
| function start() { | |
| d3.timer(drawBlips); | |
| d3.timer(beat); | |
| stopAfter = 1000; | |
| } | |
| var colorScale = d3.scale.linear() | |
| .domain([0, 0.5, 1]) | |
| .range(["darkblue", "#ffffff", "#ffff22"]); | |
| var jitterX = 0, | |
| jitterY = 0; | |
| var alongLineEase = d3.ease("cubic-in-out"); | |
| //var alongLineEase = d3.ease("linear"); | |
| function drawBlips() { | |
| context.fillStyle = "rgba(0,0,0,0.4)"; | |
| context.fillRect(0, 0, width, height); | |
| context.stroke(); | |
| linkArray.forEach(function(link) { | |
| //jitterX = (Math.random() - 0.5) * 20; | |
| //jitterY = (Math.random() - 0.5) * 20; | |
| var t, x, y, size; | |
| for (var i = 0; i < 5; i++) { | |
| context.beginPath(); | |
| context.fillStyle = colorScale(Math.random()); | |
| t = alongLineEase(Math.random()); | |
| x = link.scaleX(t + Math.random() / 5); | |
| y = link.scaleY(t + Math.random() / 5); | |
| size = Math.random() * 5; | |
| context.fillRect(x + jitterX, y + jitterY, size, size); | |
| context.stroke(); | |
| } | |
| }); | |
| if (--stopAfter < 0) { | |
| return true; | |
| } | |
| } | |
| function choose(ary) { | |
| return ary[Math.floor(Math.random()*ary.length)]; | |
| } | |
| var beatmillis = 100; | |
| function beat() { | |
| verticalSlide = 0; | |
| populateLinkArray(); | |
| for (var i = 0; i < nodes.length; ++i) { | |
| if (Math.random() > 0.3) { | |
| nodes[i].x = Math.random() * width; | |
| nodes[i].y = Math.random() * height; | |
| nodes[i].dy = 0; | |
| } else { | |
| nodes[i].y += 15 + nodes[i].dy; | |
| nodes[i].dy += 15; | |
| } | |
| } | |
| if (--stopAfter < 0) { | |
| return true; | |
| } | |
| d3.timer(beat, beatmillis); | |
| return true; | |
| } | |
| start(); |