使用JavaScript在HTML5画布上绘制大量点

鲍勃·R

我试图在HTML5画布上绘制大量(x,y)点(60k),并在Chrome和Firefox中使用D3.js模拟流数据点,并发现浏览器在大约10秒后冻结并崩溃。

我正在生成具有随机值的数据集,如下所示:

var data = d3.range(60000).map(function() { return Math.random() * 500; });

将数据生成分成几个部分是否有帮助?我觉得这可能是由于尝试一次存储如此大的数据集所致。

有什么办法可以防止这种情况的发生?例如绘制较小的部分并将其保存为平铺图像?

添加的代码:

var margin = {top: 20, right: 20, bottom: 20, left: 40},
    w = 100 - margin.left - margin.right,
    h = 100 - margin.top - margin.bottom;

    var canvas = d3.select("canvas")
      .node();

    var context = canvas.getContext('2d');

    var scale = d3.scale.linear()
    . range([0,w])
    .domain([0,h]);


    data = d3.range(60000).map(function(){return Math.random()*500});
    data.forEach(function(d,i) {
      context.strokeStyle="red";
      context.lineWidth="1";
      context.lineTo(scale(++k),scale(d));
      context.stroke();
    });
西里尔·切里安(Cyril Cherian)

由于您在评论部分提出了一个完全不同的问题,因此我想提出另一个答案。

内联注释和工作代码。

var margin = {top: 20, right: 20, bottom: 20, left: 40},
    w = 100 - margin.left - margin.right,
    h = 100 - margin.top - margin.bottom;

    var canvas = d3.select("canvas")
      .node();

    var context = canvas.getContext('2d');

 var data = d3.range(11).map(function(){return Math.random()*10})
    var x = d3.scale.linear().domain([0, 10]).range([0, 700]);
    var y = d3.scale.linear().domain([0, 10]).range([10, 290]);
    var line = d3.svg.line()
      .interpolate("cardinal")
      .x(function(d,i) {console.log(x(i));return x(i);})
      .y(function(d) {return y(d);})
    //making a dummy SVG
    var path = d3.select("body").append("svg").append("path")
      .attr("d", line(data))
      .attr("stroke", "steelblue")
      .attr("stroke-width", "2")
      .attr("fill", "none").remove();
   d3.select("body svg").remove();

    //going from 0 to the paths total length and storing all the points
    var points = [];
    for(var i =0; i < path.node().getTotalLength(); i++){
        points.push(path.node().getPointAtLength(i));//store point @ that length
    }
    var id = window.setInterval(function(){
      console.log("Doing")
      var point = points.shift();//take each point
      context.strokeStyle="red";
      context.lineWidth="1";
      context.lineTo(point.x,point.y);
      context.stroke();
      if(points.length <= 0){
        console.log("Finished")
        window.clearInterval(id);//clear the interval since the drawing is complete
      }
    }, 10)
    
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" href="style.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.10/d3.js"></script>
    
  </head>

  <body>
    <canvas id="myCanvas" width="500" height="500" style="border:1px solid #000000;">
</canvas>
  <script src="script.js"></script>
  </body>

</html>

Plunker上的工作代码

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

RXJS在HTML5画布上绘制线条

来自分类Dev

无法在html5画布上绘制

来自分类Dev

使用for循环绘制HTML5画布圆

来自分类Dev

在HTML5画布上使用CSS样式绘制SVG

来自分类Dev

使用JavaScript无法绘制到HTML5画布的线条

来自分类Dev

奥运在HTML5画布上使用JavaScript敲响

来自分类Dev

使用原生javascript代码触摸HTML5画布上的区域

来自分类Dev

奥运会在HTML5画布上使用JavaScript响起

来自分类Dev

如何在Javascript和HTML5画布上以2D模式在对象前面绘制圆圈

来自分类Dev

在背景缩放上绘制HTML5画布

来自分类Dev

实时HTML5画布绘制

来自分类Dev

html5画布绘制多个图像

来自分类Dev

HTML5画布图案绘制延迟

来自分类Dev

在背景缩放上绘制HTML5画布

来自分类Dev

连续绘制HTML5画布

来自分类Dev

HTML5画布-绘制环形扇形

来自分类Dev

html5画布部分绘制

来自分类Dev

在HTML5画布上绘制多个圆的问题

来自分类Dev

在html5画布上绘制多个粒子元素而无需渲染终止

来自分类Dev

在HTML5画布上绘制多个图像有时不起作用

来自分类Dev

如何获取在HTML5画布上绘制的图像的X / Y值?

来自分类Dev

在HTML5画布上绘制1像素线的完整解决方案

来自分类Dev

让用户输入图片网址并将其绘制在html5画布上

来自分类Dev

重新加载页面后才能绘制HTML5画布(仅在Google Chrome上)

来自分类Dev

无法在Phonegap中的HTML5画布上绘制图像

来自分类Dev

在HTML5画布上绘制图像

来自分类Dev

在html5画布上绘制多个粒子元素而无需渲染终止

来自分类Dev

如何在HTML5画布上绘制背景图像

来自分类Dev

在HTML5画布上绘制/移动/删除笔划