简体   繁体   English

HTML5 Canvas中旋转矩形内的鼠标位置

[英]Mouse position within rotated rectangle in HTML5 Canvas

Rotation of rectangles within an html5 canvas is being stored in radians. html5画布中矩形的旋转以弧度形式存储。 In order to find whether subsequent mouse clicks are within any given rectangle, I am translating the mouse x and y to the origin of rotation for the rectangle, applying the reverse of the rotation to the mouse coordinates, and then translating the mouse coordinates back. 为了找出后续鼠标是否在任何给定矩形内,我将鼠标x和y平移到矩形的旋转原点,将旋转的反转应用于鼠标坐标,然后将鼠标坐标平移回来。

This simply isn't working - mouse coordinates are not being transformed as expected (that is, not within the bounds of the original rectangle when clicking within the visible bounds of the rotated rectangle), and testing against the rectangle's bounds is failing. 这根本不起作用 - 鼠标坐标没有按预期转换(也就是说,当在旋转的矩形的可见边界内单击时,不在原始矩形的边界内),并且对矩形的边界进行测试失败。 Detection of mouse clicks works only within the centre-most area of the rectangle. 鼠标点击的检测仅在矩形的最中心区域内起作用。 Please see the code snippet below and tell me if you can see what's wrong here. 请参阅下面的代码段,告诉我你是否能看到这里的错误。

 // Our origin of rotation is the center of the rectangle
 // Our rectangle has its upper-left corner defined by x,y, its width
 // defined in w, height in h, and rotation(in radians) in r.  
var originX = this.x + this.w/2, originY = this.y + this.h/2, r = -this.r;

 // Perform origin translation
mouseX -= originX, mouseY -= originY;
// Rotate mouse coordinates by opposite of rectangle rotation
mouseX = mouseX * Math.cos(r) - mouseY * Math.sin(r);
mouseY = mouseY * Math.cos(r) + mouseX * Math.sin(r);
// Reverse translation
mouseX += originX, mouseY += originY;

// Bounds Check
if ((this.x <= mouseX) && (this.x + this.w >= mouseX) && (this.y <= mouseY) && (this.y + this.h >= mouseY)){
    return true;
}

After some further work, came to the following solution, which I thought I'd transcribe here for anyone who might need it in the future: 经过一些进一步的工作后,得出了以下解决方案,我认为我会在这里转录给未来可能需要它的人:

// translate mouse point values to origin
    var dx = mouseX - originX, dy = mouseY - originY;
    // distance between the point and the center of the rectangle
    var h1 = Math.sqrt(dx*dx + dy*dy);
    var currA = Math.atan2(dy,dx);
    // Angle of point rotated around origin of rectangle in opposition
    var newA = currA - this.r;
    // New position of mouse point when rotated
    var x2 = Math.cos(newA) * h1;
    var y2 = Math.sin(newA) * h1;
    // Check relative to center of rectangle
    if (x2 > -0.5 * this.w && x2 < 0.5 * this.w && y2 > -0.5 * this.h && y2 < 0.5 * this.h){
        return true;
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM