javascript – 在d3.js中从一个圆圈到另一个圆圈绘制一条线

前端之家收集整理的这篇文章主要介绍了javascript – 在d3.js中从一个圆圈到另一个圆圈绘制一条线前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我将解释我在实际项目中遇到的问题.我正在使用一个Web服务,这会给我返回点x,y.我正在使用settimeout模拟Web服务.我想在这些坐标中放一个圆圈,对于每个圆圈,我想画一条连接它们的线.像这样:

enter image description here

我想在圆圈之间添加一条线但显示动画.像这样:

http://bl.ocks.org/duopixel/4063326

例如这个动画,但一点一点

当我运行我的应用程序时,我希望该行具有从初始循环到结束的动画.如果我添加一个新的圆圈,我想要创建一条线并为圆圈制作动画.我该怎么做?

http://jsfiddle.net/2rv0o8da/

  1. var svg = d3.select('svg');
  2. var dataSet = [10,20,30,40];
  3. function display(data){
  4. var circle = svg.selectAll('circle')
  5. .data(data)
  6. .enter()
  7. .append('circle')
  8. .attr({
  9. r:function(d){ return d },cx:function(d,i){ return i * 100 + 50 },cy:50,fill: 'red'
  10. });
  11. }
  12. display(dataSet);
  13. setTimeout(function(){
  14. display([5]);
  15. },2000)
最佳答案
回答如何连接点:

要创建连接圆圈的路径,您只需创建一个使用相同数据的线生成器.

例如,这将创建一个包含10个对象的数组,每个对象具有x和y位置:

  1. var dataSet = d3.range(10).map(function(d) {
  2. return {x: someValue,y: someValue}
  3. });

因此,由于我们使用这些属性来定位圆,我们只在行生成器中使用相同的属性

  1. var lineGenerator = d3.svg.line()
  2. .x(function(d) {return d.x})
  3. .y(function(d) {return d.y})
  4. .interpolate("monotone")

然后,使用您链接的bl.ocks中的函数

  1. var totalLength = path.node().getTotalLength();
  2. path.attr("stroke-dasharray",totalLength + " " + totalLength)
  3. .attr("stroke-dashoffset",totalLength)
  4. .transition()
  5. .duration(2000)
  6. .ease("linear")
  7. .attr("stroke-dashoffset",0);

这是演示:

  1. var svg = d3.select('svg');
  2. var backLayer = svg.append("g");
  3. var frontLayer = svg.append("g");
  4. var dataSet = d3.range(10).map(function(d) {
  5. return {
  6. x: d * 30 + 10,y: Math.random() * 130 + 10
  7. }
  8. });
  9. var lineGenerator = d3.svg.line()
  10. .x(function(d) {
  11. return d.x
  12. })
  13. .y(function(d) {
  14. return d.y
  15. })
  16. .interpolate("monotone")
  17. function displayCircles(data) {
  18. var circle = frontLayer.selectAll(null)
  19. .data(data)
  20. .enter()
  21. .append('circle')
  22. .attr({
  23. r: 6,cx: function(d) {
  24. return d.x
  25. },cy: function(d) {
  26. return d.y
  27. },fill: 'white',stroke: "black","stroke-width": "3px"
  28. });
  29. };
  30. function displayLine(data) {
  31. var line = backLayer.append("path")
  32. .datum(data)
  33. .attr({
  34. d: lineGenerator(data),fill: 'none',stroke: "red","stroke-width": "3px","shape-rendering": "geometricPrecision"
  35. });
  36. var totalLength = line.node().getTotalLength();
  37. line.attr("stroke-dasharray",0);
  38. }
  39. displayCircles(dataSet);
  40. setTimeout(function() {
  41. displayLine(dataSet)
  42. },1000)

猜你在找的JavaScript相关文章