2013-05-09 29 views
5

为:澄清。画一个圆圈。我们开始从一个特定的坐标绘制圆。现在让我们从另一个坐标开始绘制圆。在d3中,是否可以动态更改路径位置开始补间的位置?

我正在玩从SVG字形导出的路径数据,然后使用d3js补间动画路径之间的变化。

对于本示例,从1 - > 9,0开始计数,然后重复。

http://jsfiddle.net/chrisloughnane/HL2ET/

正如你可以看到一些转变并不像你一样他人。他们绘制出一条关闭下一条路径的路线。 (我猜测)这种情况发生在路径的开始和结束相隔很远时,新形状的计算已经完成。当它工作,这是非常好的。

有人可以建议一个可能的解决方案,以丑陋的线?

代码,而无需路径数据

svg.append("path") 
    .attr("transform", "translate(150,300)scale(.2,-.2)") 
    .style("stroke", "red") 
    .style("fill", "gray") 
    .style("stroke-width", "9") 
    .attr("d", d0) 
    .call(transition, digits[0], digits[position]); 

function transition(path, d0, d1) { 
    position++; 
    if(position==10) 
    { 
    position=0; 
    } 
    path.transition() 
     .duration(2000) 
     .attrTween("d", pathTween(d1, 4)) 
     .each("end", function() { d3.select(this).call(transition, d1, digits[position]); }); 
} 

function pathTween(d1, precision) { 
    return function() { 
    var path0 = this, 
     path1 = path0.cloneNode(), 
     n0 = path0.getTotalLength(), 
     n1 = (path1.setAttribute("d", d1), path1).getTotalLength(); 

    // 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; 
    }; 
    }; 
} 

遗憾的是它没有对铬的移动也作为地方工作http://bl.ocks.org/mbostock/3081153罚款。

下一步是将此效果应用于句子。

+0

嗯有趣的问题。看起来像需要一个更好的算法来匹配内插中的p0和p1点。你可能想尝试Gale-Shapley来匹配基于欧几里德距离的点。我认为最好的算法是优先考虑两点之间的插值,而不会导致任何交点。不知道该怎么做。 – 2014-02-09 14:12:09

回答

1

您的示例与Bostock's的示例之间的区别在于,在他的示例中,有一条连续路径可以补充到另一条连续路径。

而在您的示例中,可以使用单个连续路径绘制像1,2,3,5,6,7等数字。但是,为了画出像4,6,9和0这样的数字,你需要2条路径 - 一条位于另一条之上。而且,对于数字8,您需要在外部路径上有2条路径。

因此,我的建议是在任何时候都保持2条路径在目前的&的外部路径上,只要显示任何特殊数字就给它们适当的尺寸。

参考图片了解更多详情: enter image description here

+0

srvikram优秀:)谢谢。 – 2014-03-25 13:42:30