我看到你的问题包含“数学”标签但不包含代码,所以我会给你一个叙述性数学解决方案。
问题
正如您所发现的,浏览器的鼠标事件在未旋转的空间中返回 clientX 和 clientY 值,而不是在旋转的画布坐标中。
一个潜在的解决方案
要跟踪画布的当前旋转状态,您可以使用仿射变换矩阵。仿射矩阵使用 3x3 矩阵的 9 个元素中的 6 个来保存有关所有画布变换的累积信息:旋转、平移、缩放等。矩阵可以简单地用6个元素的数组来表示。
var matrix=[ 1, 0, 0, 1, 0, 0 ];
canvas 元素保留了这样一个转换矩阵,但不幸的是(并且出乎意料地)它的转换矩阵被隐藏了。
有效的解决方案
因此,或者,每次您在上下文中发出转换命令时,都可以将该更改镜像到您自己维护的转换矩阵。这样,无论您对画布进行多少次旋转等,您的矩阵都会“保存”当前的旋转状态。
然后,当您在未旋转的空间中定义鼠标 [x,y] 时,您可以使用该变换矩阵将该未旋转的鼠标坐标转换为旋转的画布空间。
// convert mouse coordinates to transformed canvas coordinates
function tmPoint(matrix, mouseX, mouseY){
return({
canvasX: mouseX*matrix[0] + mouseY*matrix[2] + matrix[4],
canvasY: mouseX*m[1] + mouseY*matrix[3] + matrix[5]
};
}
操作方法...
您可以在此处“学习”转换矩阵:
https://blog.safaribooksonline.com/2012/04/26/html5-canvas-games-tracking-transformation-matrices/