我正在尝试学习如何从头开始构建交互式画布,但我在尝试绘制超出画布视口范围的东西(超过canvas.width
和canvas.height
)时遇到了麻烦。目标是拥有类似于无限画布的东西,您可以滚动、缩放并将物品放在任何想要的地方。
我已经弄清楚了当我们缩小视图时正确计算正确插入点的方法,算法如下:
查看是否应该将组件添加到画布的极限范围以外;
如果是,则转换偏移量(x,y),并添加到点和画布边缘之间的距离。
我注意到event.pageX
和event.pageY
的值总是基于画布的宽度和高度给我的,因此,如果我缩小视图,这些值就会比应有的值更小(因为我正在查看更多像素)。以下是JS中的变换算法:
// pageX is 430, pageY is 480
// canvas has width=600 height=600
// scale is 0.6, meaning the canvas actually has size 360x360
var currentSize = canvas.width * scale; // 360
pageX = canvas.width + (pageX - currentSize);
pageY = canvas.width + (pageY - currentSize);
在纸上画这个逻辑似乎是有效的,但问题在于我(显然)无法越过画布限制,因此无法看到结果。问题如下:
- 这个逻辑正确吗?
- 有没有办法实现我的目标?(指导文献将非常感激)
- Canvas是完成任务的正确工具还是应该使用其他工具?
更新
我有另一个解决问题的想法:不是在画布之外绘制东西,而是将我的点按比例缩放以适应画布的限制,然后应用缩放来缩放。类似这样:// canvas is 500x500
var points = [
{text: 'Foo', x: 10, y: 10},
{text: 'Bar', x: 854, y: 552}, // does not fit inside
{text: 'Baz', x: 352, y: 440}
];
// The canvas can't show all these points, the ideal
// would be having a canvas of at least size 900x600,
// so I can use a rule of three to convert all points
// from this imaginary canvas to fit inside my 500x500
// in 900px, x=10
// in 500px, x=?
// hence, the formulas are `newX=x * 500 / 900` and `newY = y * 500 / 600`
var converted_points = [
{text: 'Foo', x: 5.55, y: 8.33},
{text: 'Bar', x: 474.44, y: 460},
{text: 'Baz', x: 195.55, y: 366.66}
];
之后,我认为我只需要对画布进行缩放/变换即可实现缩放。这个逻辑可以吗?