【发布时间】:2016-11-11 05:10:25
【问题描述】:
我正在通过我从 api 接收的一些数据构建一个 Canvas,这一切都很好。无论如何,我坚持使用以下代码 `canvas.addEventListener('wheel', (event: MouseWheelEvent) => { event.preventDefault();
let coords = Positioning.transformedPoint(
event.pageX - canvas.offsetLeft,
event.pageY - canvas.offsetTop
);
canvasMethods.clear();
canvasMethods.translate(coords.x, coords.y);
if (event.wheelDeltaY > 0) {
canvasMethods.scale(ZoomDirection.ZOOM_IN);
} else if (event.wheelDeltaY < 0) {
canvasMethods.scale(ZoomDirection.ZOOM_OUT);
}
canvasMethods.translate(-coords.x, -coords.y);
this._renderFn();
}, false);
canvas.addEventListener('mousedown', (event: MouseEvent) => {
event.preventDefault();
this._dragging = true;
this._dragStart = Positioning.transformedPoint(
event.clientX - canvas.offsetLeft,
event.clientY - canvas.offsetTop
);
}, false);
canvas.addEventListener('dblclick', (event: MouseEvent) => {
let coords = Positioning.transformedPoint(
event.clientX - canvas.offsetLeft,
event.clientY - canvas.offsetTop
);
this._clickFn(coords);
});
canvas.addEventListener('mousemove', (event: MouseEvent) => {
if (this._dragging) {
event.preventDefault();
this._dragEnd = Positioning.transformedPoint(
event.pageX - canvas.offsetLeft,
event.pageY - canvas.offsetTop
);
let coords = Positioning.transformedPoint(
event.clientX - canvas.offsetLeft,
event.clientY - canvas.offsetTop
);
canvasMethods.translate(coords.x - this._dragStart.x, coords.y - this._dragStart.y);
canvasMethods.clear();
this._renderFn();
this._dragStart = this._dragEnd;
}
}, false);
canvas.addEventListener('mouseup', (event: MouseEvent) => {
event.preventDefault();
this._dragging = false;
this._dragStart = null;
this._dragEnd = null;
})
}`
当它处于正常比例时,我得到了正确的坐标,但是当我缩放时,我得到一个增量错误(基本上实际点和鼠标光标之间的距离越来越大),我不知道为什么。为了计算矩阵中的坐标,我使用 SVG 方法作为包装器,方法如下 `export class Positioning { 静态 svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); 私有静态 xform = Positioning.svg.createSVGMatrix();
static transformedPoint(x: number, y: number): SVGPoint {
let coords = Positioning.svg.createSVGPoint();
coords.x = x;
coords.y = y;
return coords.matrixTransform(Positioning.xform.inverse());
}
}`
我知道这在某种程度上与校准有关,但我真的无法弄清楚如何获得缩放比例并进行适当的操作以获得比例。我还检查了这个答案Zoom Canvas to Mouse Cursor,这非常准确,但实际上他以某种我无法理解的方式得到了它的说明。有其他人遇到过同样的问题吗?
【问题讨论】:
-
你有正确的想法:通过transformation matrix 路由所有变换,然后使用矩阵在变换坐标和未变换坐标之间进行转换。
-
是的,我已经很接近了,但我无法弄清楚拼图的最后一块,你的意思是通过反转矩阵在转换和未转换之间进行转换?因为你可以看到我的服务已经反转了矩阵。
标签: javascript html canvas