【问题标题】:Trying to animate a circle along an arc path in D3.js (v3)尝试在 D3.js (v3) 中沿圆弧路径为圆设置动画
【发布时间】:2020-11-03 02:56:31
【问题描述】:

我正在尝试沿弧形路径为圆设置动画。下面的链接给出了我正在尝试做的一个很好的例子(除了例子中的路径不是弧线)。

http://bl.ocks.org/JMStewart/6455921

我有以下代码块,它构建了我想将圆附加到的弧。

function renderOne(innerRadius) {

  var width = 1250,
    height = 1250,
    colors = d3.scale.category20();

  var svg = d3.select("#arcOne").append("svg")
    .attr("height", height)
    .attr("width", width);

  var dataArc = [
    {startAngle: -0.5 * Math.PI, endAngle: 0.5 * Math.PI},
  ];


  var arc = d3.svg.arc().outerRadius(625).innerRadius(innerRadius);
    svg.select("g").remove();
    svg.append("g")
      .attr("transform", "translate(625,625)")
      .selectAll("path.arc")
        .data(dataArc)
        .enter()
        .append("path")
        .attr("class", "arc")
        .style("stroke", "rgb(53,154,204))")
        .style("stroke-width", 5)
        .style("fill", "black") //"none"
        .style("opacity", .7)
        .transition().duration(2000)
        .attrTween("d", function (d) {
            var start = {startAngle: -0.5 * Math.PI, endAngle: -0.5 * Math.PI} // <-A
            var interpolate = d3.interpolate(start, d); // <-B
            return function (t) {
                return arc(interpolate(t)); // <-C
            };
        })
}

renderOne(1250);
#arcOne {
  position: absolute;
  top: 50px;
  left: 25px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.min.js"></script>
<div id="arcOne"></div>

任何帮助将不胜感激。我觉得我需要以某种方式使用 d3.svg.arc() 但我无法正确解决它。

【问题讨论】:

  • 我刚刚尝试了您的代码,但对我不起作用
  • @A. RAZIK 如果这改变了任何东西,我只是添加了 css。您正在运行 d3 第 3 版吗?
  • 是的,我包括 D3v3 请参阅:jsfiddle.net/mq7Lfwju
  • 只需添加一个像“黑色”这样的填充属性,然后你就会看到你的补间动画:我编辑了你的问题和来自@A.RAZIK 的小提琴:jsfiddle.net/alexander_L/y2vscpx1/1 - 到目前为止你还没有追加任何圆圈,所以路径本身是补间/动画而不是任何圆圈。您需要将补间添加到附加的圆圈中才能获得该效果。

标签: javascript d3.js svg data-visualization


【解决方案1】:

这是你想要的吗?

请参阅下面和此处的代码以实现此目的:https://jsfiddle.net/alexander_L/y2vscpx1/2/

function renderOne(innerRadius) {
  
  var dbl = innerRadius * 2;
  var width = "100%", //1250,
    viewbox = `0 0 ${dbl} ${dbl}`,
    height = "100%", //1250,
    colors = d3.scale.category20();

  var svg = d3.select("body").append("svg")
    //.attr("height", height)
    .attr("width", width)
    .attr('viewBox', viewbox);

  var dataArc = [
    {startAngle: -0.5 * Math.PI, endAngle: 0.5 * Math.PI},
  ];


  var arc = d3.svg.arc().outerRadius(625).innerRadius(innerRadius);
  
  svg.select("g").remove();
    
  var path = svg.append("g")      
      .selectAll("path.arc")
        .data(dataArc);
        
      path.enter()
        .append("path")
          .attr("transform", `translate(${innerRadius},${innerRadius})`) //625,625
          .attr("class", "arc")
          .style("stroke", "rgb(53,154,204))")
          .style("stroke-width", 5)
          .style("fill", "black") //"none"
          .style("opacity", .7)
          .attr('d', arc)
          .transition().delay(250).duration(2000).ease("linear")
          .attrTween("d", function (d) {
              var start = {startAngle: -0.5 * Math.PI, endAngle: -0.5 * Math.PI} // <-A
              var end = d // {startAngle: -0.5 * Math.PI, endAngle: 0.5 * Math.PI}
              var interpolate = d3.interpolate(start, end); // <-B
              return function (t) {
                  return arc(interpolate(t)); // <-C
              };
          })
          
    path.enter()
      .append('circle')
        .attr("transform", `translate(${innerRadius},${innerRadius})`) //625,625
        //.attr("cx", d => arc.centroid(d)[0]) // Set the cx
                //.attr("cy", d => arc.centroid(d)[1])
        .attr('r', 20)
        .attr('fill', 'black')
        .transition()
        .delay(250)
        .duration(2000)
        .ease("linear")
        .attrTween("pathTween", function (d) {
            const startAngle = d.startAngle;
            const endAngle = d.endAngle;
            const start = {startAngle, endAngle: startAngle} // <-A
            const end = {startAngle: endAngle, endAngle}
            //console.log(start,end)
            const interpolate = d3.interpolate(start, end); // <-B
            const circ = d3.select(this) // Select the circle
            return function (t) {
                const cent = arc.centroid(interpolate(t)); // <-C         
                //return cent[0]
                circ
                  .attr("cx", cent[0]) // Set the cx
                  .attr("cy", cent[1]) // Set the cy                
            };
        })        
}

renderOne(750);
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.min.js"&gt;&lt;/script&gt;

【讨论】:

  • 这正是我所需要的。谢谢!!
  • 太棒了,太棒了! ??
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 2018-02-15
  • 2018-04-21
相关资源
最近更新 更多