【发布时间】:2020-04-02 08:08:43
【问题描述】:
执行旋转后,我正在使用以下函数在画布上获取鼠标坐标。
function getWindowToCanvas(canvas, x, y) {
const ctx = canvas.getContext("2d");
var transform = ctx.getTransform();
var rect = canvas.getBoundingClientRect();
var screenX = (x - rect.left) * (canvas.width / rect.width);
var screenY = (y - rect.top) * (canvas.height / rect.height);
if (transform.isIdentity) {
return {
x: screenX,
y: screenY
};
} else {
console.log(transform.invertSelf());
const invMat = transform.invertSelf();
return {
x: Math.round(screenX * invMat.a + screenY * invMat.c + invMat.e),
y: Math.round(screenX * invMat.b + screenY * invMat.d + invMat.f)
};
}
}
阅读html5-canvas-transformation-algorithm和best-way-to-transform-mouse-coordinates-to-html5-canvass-transformed-context后我使用了逆变换矩阵
我让用户用鼠标绘制矩形,我需要在转换后获取鼠标的 x,y 坐标,但是一旦画布旋转(比如 90 度),矩形就不再跟随鼠标指针。
有谁知道我做错了什么?
【问题讨论】:
-
你画的部分在哪里?如果您实际上使坐标相对于整个窗口,则跟踪鼠标的方法不会发生意外行为
-
嗨 Youssef,我正在尝试找到一种更好的方法来制作相对于整个窗口的坐标,但我不知道比
var rect = canvas.getBoundingClientRect();然后var relativeToWindowX = (event.clientX - rect.left) * (canvas.width / rect.width)更好的方法 -
event.clientX 来自于用户在画布上单击和拖动时画布的 onmousedown 和 onmousemove 事件。
-
一次做一步。查看jsfiddle.net/60map523 将鼠标点击转换为画布坐标。第二步是将画布坐标转换为转换后的坐标。
-
您“真正”想要做什么?你能建立一个完整的例子吗?听起来会有更简单的方法,例如在绘制之前将转换重置为身份,甚至将转换存储在每个对象中:jsfiddle.net/en8df6o0/2
标签: javascript matrix canvas transform mouse-coordinates