【发布时间】:2023-05-13 23:02:01
【问题描述】:
我正在尝试使用 HTML5 画布绘制散点图。我的散点图需要有很多点。当我尝试在画布上绘制大量点时,比如说 (7700000) 个点,它适用于 Firefox 和 Safari。
Very large number of points (JS fiddle)
但由于某种原因,MacOS 上的 Google Chrome 上的画布是空白的。但是它适用于 Windows 和 Linux 的 Google Chrome。如果要绘制的点数较少,它可以在 MacOS 上工作,但当点数增加时就不行。我试图搜索相关问题,但找不到任何问题。是我做错了什么还是 Google Chrome for MacOS 的问题?
Small number of points (JS Fiddle)
我正在使用以下函数在画布上绘图:
function drawPoint(scaleX, scaleY, point, k) {
context.beginPath();
context.fillStyle = pointColor;
const px = scaleX(point[0]);
const py = scaleY(point[1]);
const arc_width = width/1000;
const arc_height = height/1000;
// context.arc(px, py, arc_width * k, 0, 2 * Math.PI, true);
context.strokeRect(px, py, arc_width * k, arc_height * k)
context.stroke();
}
【问题讨论】:
-
您的真实数据点是否真的像您的示例中一样?如果是这样,那么画那么多点是没有意义的。您的网格只能包含 900 x 900 点。过滤掉所有重复项。另外,不要单独绘制每个点,创建一条大路径并在一次调用中绘制它。最后,避免中风,它超级慢,尽可能选择填充。
-
我的真实数据点没有被填充,它可以根据绘图的某些属性是动态的。点也可以是随机的,它可能不在一条路径中。
-
使用填充代替描边解决了我的问题。感谢您的回复。
-
是的,如果您的所有点都使用相同的颜色绘制,您可以将它们绘制在一条路径中。为此,请在循环积分之前在
draw中调用一次context.beginPath(),然后在drawPoint中只调用context.rect(...)(或moveTo(x+radius,y); arc(...),之后,在draw中调用一次@ 987654330@.
标签: javascript html d3.js canvas html5-canvas