【问题标题】:How to draw a path smoothly from start point to end point in D3.js如何在 D3.js 中平滑地绘制从起点到终点的路径
【发布时间】:2012-12-03 07:22:36
【问题描述】:

我有以下代码,它根据正弦函数绘制线路径:

var data = d3.range(40).map(function(i) {
  return {x: i / 39, y: (Math.sin(i / 3) + 2) / 4};
});

var margin = {top: 10, right: 10, bottom: 20, left: 40},
    width = 960 - margin.left - margin.right,
    height = 500 - margin.top - margin.bottom;

var x = d3.scale.linear()
    .domain([0, 1])
    .range([0, width]);

var y = d3.scale.linear()
    .domain([0, 1])
    .range([height, 0]);


var line = d3.svg.line()
          .interpolate('linear')
          .x(function(d){ return x(d.x) })
          .y(function(d){ return y(d.y) });

var svg = d3.select("body").append("svg")
    .datum(data)
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)
  .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

svg.append("path")
    .attr("class", "line")
    .attr("d", line);

svg.selectAll('.point')
   .data(data)
   .enter().append("svg:circle")
   .attr("cx", function(d, i){ return x(d.x)})
   .attr("cy", function(d, i){ return y(d.y)})
   .attr('r', 4);

我想要做的是从第一个节点到最后一个节点平滑地绘制它。我还希望在两个连续节点之间进行平滑过渡,而不仅仅是一次放置整条线。就像用铅笔连接点一样。

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript svg d3.js


    【解决方案1】:

    您可以使用 stroke-dashoffsetand path.getTotalLength() 轻松地为路径设置动画

    var totalLength = path.node().getTotalLength();
    
    path
      .attr("stroke-dasharray", totalLength + " " + totalLength)
      .attr("stroke-dashoffset", totalLength)
      .transition()
        .duration(2000)
        .ease("linear")
        .attr("stroke-dashoffset", 0);
    

    http://bl.ocks.org/4063326

    【讨论】:

    • 要直观地解释为什么会这样,请查看jakearchibald.com/2013/animated-line-drawing-svg
    • 这可能与d3.svg.area有关吗?到目前为止,我一直没有成功。
    • 对于必须动态设置路径d 的图形(例如,如果您的轴发生变化),请考虑设置path length,这意味着您不必使用getTotalLength
    • @JasonKao 的建议非常有用。首先设置.attr("pathLength",100),然后你可以将stroke-dasharraystroke-dashoffset props设置为100 100100
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 2015-01-13
    • 2022-01-26
    • 2011-11-28
    • 1970-01-01
    • 2015-04-29
    • 2014-11-19
    相关资源
    最近更新 更多