在d3中是否可以动态改变路径位置开始补间的位置?

时间:2013-05-09 22:00:08

标签: d3.js glyph

to:澄清。画一个圆圈。我们开始从特定坐标绘制圆。现在让我们从另一个坐标开始绘制圆圈。

我正在使用从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工作正常的情况下,它也无法在Chrome移动设备上运行。

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

1 个答案:

答案 0 :(得分:1)

你的例子和Bostock的例子之间的区别在于,在他的例子中,有一条连续的路径可以补充到另一条连续路径中。

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

所以,我的建议是在你目前正在使用的外部路径的顶部始终保持2条路径。只要有任何特殊的数字显示,就给它们适当的尺寸。

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