缩放以适合,画布,JavaScript
Zoom to fit, canvas, javascript
>我得到了一个变化很大的数据集,有时点是[-34343, 343434]
,有时是[10, 20]
。
是否有任何"缩放以适应"的方法,以便画布的内容始终适合数据?
我看过transform
但当我放大时,线条变粗了。我希望无论缩放如何,线条始终保持相同的宽度。
https://jsfiddle.net/s2cfp34n/
在保持渲染线相同的同时进行缩放。
首先找到数据的范围,以便最终得到像素宽度和高度
// what ever data format you have do what you need to fine width and height
var dataWidth = Math.max(...data.x)-Math.min(...data.x);
var dataHeight = Math.max(...data.y)-Math.min(...data.y);
您还需要数据的左上角坐标
var dataX = Math.min(...data.x);
var dataY = Math.min(...data.y);
然后,通过将画布大小除以数据大小,使用您获得的两个比例中的最小比例找到适合所有数据的比例
var scale = Math.min(canvas.width / dataWidth, canvas.height / dataHeight);
现在计算原点需要的位置,以便左上角的数据位置至少接触画布的一个边缘
originX = (canvas.width / 2) - ((dataWidth / 2) + dataX) * scale;
originY = (canvas.height / 2) - ((dataHeight / 2) + dataY) * scale;
因此,您现在拥有创建转换矩阵所需的所有数据。
ctx.setTransform(scale,0,0,scale,originX,originY);
有两种方法可以以固定宽度呈现线条。
获取反比例并乘以所需的线宽
var invScale = 1 / scale;
ctx.lineWidth = 2 * invScale; // the line width will always be 2 pixels
ctx.lineWidth = 1 * invScale; // the line width will always be 1 pixels
... etc
或者,一个不错的技巧是在创建路径之后但在渲染笔画之前重置转换。
设置缩放的转换并创建路径
ctx.setTransform(scale,0,0,scale,originX,originY);
ctx.beginPath();
ctx.moveTo(data[0].x,data]0].y);
ctx.lineTo(data[1].x,data]1].y);
... and so on
在创建所有路径之前,在调用笔触之前,将转换重置为默认比例。渲染器将在当前变换中使用 lineWidth,而路径将保持您添加它们的比例
ctx.setTransform(1,0,0,1,0,0);
ctx.lineWidth = 2; // two pixels
ctx.stroke();
如果要从 arc 函数创建椭圆形,或者执行任何不均匀缩放而不会获得不一致的线宽,这将非常有用。
相关文章:
- JavaScript HTML5画布未显示
- 如何在JavaScript画布中移动此形状
- 绘制(重新加载)具有cors=“”的图像;匿名的“;在画布上(javascript)
- 如何用javascript下载画布图像(base64)
- 画布中的重力/跳跃球,javascript
- 清除画布JavaScript
- 使用键代码移动画布-JAVASCRIPT
- 重新启动画布 JavaScript
- 如何基于文本长度动态居中画布javascript
- 如何居中画布 JavaScript
- 如何将着色器应用于画布(javascript)
- 在2d画布JavaScript游戏中对角移动
- 基于对象的画布javascript事件
- 在HTML画布/Javascript上捕获用户输入,反之亦然
- 上传的图像填充画布Javascript
- HTML5画布/JavaScript(滚动背景/相机)
- 在html5画布(javascript)中不显示图像
- HTML5画布+javascript类=错误
- HTML5画布javascript延迟问题
- 为什么我的画布 JavaScript 没有连接线