var canvas = document.getElementById('canvas')
//assuming that @param draw is a function where you do your main drawing.
var control = new CanvasManipulation(canvas, draw)
control.init()
control.layout()
//now you can drag, zoom and rotate in canvas
const zoomBy = 1.1; // zoom in amount
scaleAt(mouse.x, mouse.y, zoomBy); // will zoom in at mouse x, y
scaleAt(mouse.x, mouse.y, 1 / zoomBy); // will zoom out by same amount at mouse x,y
恢复默认变换的步骤
ctx.setTransform(1,0,0,1,0,0);
反转
获取点在缩放坐标系中的坐标和点在缩放坐标系中的屏幕位置的步骤
屏幕到世界
function toWorld(x, y) { // convert to world coordinates
x = (x - origin.x) / scale;
y = (y - origin.y) / scale;
return {x, y};
}
屏幕世界
function toScreen(x, y) {
x = x * scale + origin.x;
y = y * scale + origin.y;
return {x, y};
}
6条答案
按热度按时间6rqinv9w1#
简而言之,您需要将画布上下文按偏移量
translate()
,然后按鼠标偏移量的相反方向scale()
缩放,最后按鼠标偏移量的相反方向translate()
返回。注意,您需要将光标位置从屏幕空间转换为转换后的画布上下文。演示:http://phrogz.net/tmp/canvas_zoom_to_cursor.html
我在我的网站上放了一个full working example给你看,支持拖动,点击放大,shift-点击缩小,或者上下滚动滚轮。
aydmsdu92#
我希望,这些JS库将帮助您:(HTML5、联文)
1.放大镜
http://www.netzgesta.de/loupe/
1.画布缩放
https://github.com/akademy/CanvasZoom
1.卷轴
https://github.com/zynga/scroller
至于我,我用放大镜。太棒了!对你来说最好的情况-滚动。
7nbnzgx93#
我最近需要存档与Phrogz已经做过的相同的结果,但我没有使用
context.scale()
,而是基于比率计算每个对象的大小。这是我想出来的。背后的逻辑非常简单。在缩放之前,我计算点到边缘的百分比距离,然后将视口调整到正确的位置。
我花了很长时间才想出来,希望能节省一些人的时间。
cwdobuhd4#
我以@Phrogz的答案为基础,做了一个小的库,使画布能够拖动,缩放和旋转。
您可以在项目的page上找到更详细的示例和文档
krugob8w5#
更快
与多次矩阵调用
ctx.translate
、ctx.scale
、ctx.translate
相比,使用ctx.setTransform
可以提供更高的性能。不需要复杂的转换反演和昂贵的DOM矩阵调用来在缩放和屏幕坐标系之间转换点。
灵活
灵活性,如果您使用不同的转换来渲染内容,则无需使用
ctx.save
和ctx.restore
。返回到使用ctx.setTransform
的转换,而不是使用可能会导致ctx.restore
调用的帧速率易于反转变换并获得(屏幕)像素位置的世界坐标,反之亦然。
示例
使用鼠标和鼠标滚轮在鼠标位置放大和缩小
答案底部的scale page content at a point (mouse) via CSS transform CSS Demo使用此方法的示例也有下一个示例中的demo副本。
并将此方法的一个示例用于scale canvas content at a point using setTransform
如何
给定一个比例和像素位置,你可以得到新的比例如下...
定位画布并绘制内容
如果有鼠标坐标,则使用
恢复默认变换的步骤
反转
获取点在缩放坐标系中的坐标和点在缩放坐标系中的屏幕位置的步骤
屏幕到世界
屏幕世界
ipakzgxi6#
我修改了@Phrogz的解决方案(顺便说一句,这本身就很棒),使其包含以下特性:
1.允许一定范围的缩放级别(不是无限)
1.默认或从最大缩小级别开始
1.允许画布对象分层(同时缩放阵列中的所有画布对象)
1.缩小不会显示原始视图以外的区域。
希望这能帮到什么人。