// http://bl.ocks.org/mbostock/3916621 function path_tween(d1, precision) { return function() { var path0 = this, path1 = path0.cloneNode(), n0 = path0.getTotalLength() || 0, n1 = (path1.setAttribute("d", d1), path1).getTotalLength() || 0; // Uniform sampling of distance based on specified precision. var distances = [0], i = 0, dt = precision / Math.max(n0, n1); while ((i += dt) < 1) distances.push(i); distances.push(1); // Compute point-interpolators at each distance. var points = distances.map(function(t) { var p0 = path0.getPointAtLength(t * n0), p1 = path1.getPointAtLength(t * n1); return d3.interpolate([p0.x, p0.y], [p1.x, p1.y]); }); return function(t) { return t < 1 ? "M" + points.map(function(p) { return p(t); }).join("L") : d1; }; }; } MG.path_tween = path_tween;