检查一个点是否在旋转的矩形内

本文关键字:旋转 是否 一个 检查 | 更新日期: 2023-09-27 18:18:33

我知道这个问题以前已经被问过几次了,我也读过很多关于这个问题的帖子。然而,我正在努力得到这个工作。

    bool isClicked()
    {
        Vector2 origLoc = Location;
        Matrix rotationMatrix = Matrix.CreateRotationZ(-Rotation);
        Location = new Vector2(0 -(Texture.Width/2), 0 - (Texture.Height/2));
        Vector2 rotatedPoint = new Vector2(Game1.mouseState.X, Game1.mouseState.Y);
        rotatedPoint = Vector2.Transform(rotatedPoint, rotationMatrix);
        if (Game1.mouseState.LeftButton == ButtonState.Pressed &&
            rotatedPoint.X > Location.X &&
            rotatedPoint.X < Location.X + Texture.Width &&
            rotatedPoint.Y > Location.Y &&
            rotatedPoint.Y < Location.Y + Texture.Height)
        {
            Location = origLoc;
            return true;
        }
        Location = origLoc;
        return false;
    }

检查一个点是否在旋转的矩形内

设点P(x,y),矩形A(x1,y1), B(x2,y2), C(x3,y3), D(x4,y4)

  • 计算△APD, △DPC, △CPB, △PBA的面积之和

  • 如果这个和大于矩形的面积:

    • 则点P(x,y)在矩形外
    • 否则矩形内或上。

每个三角形的面积可以只使用以下公式的坐标来计算:

假设三个点是:A(x,y), B(x,y), C(x,y)

Area = abs( (Bx * Ay - Ax * By) + (Cx * By - Bx * Cy) + (Ax * Cy - Cx * Ay) ) / 2

我假设Location是矩形的旋转中心。如果没有,请用一个合适的数字更新你的答案。

您要做的是表示鼠标在矩形的本地系统中的位置。因此,您可以执行以下操作:

bool isClicked()
{
    Matrix rotationMatrix = Matrix.CreateRotationZ(-Rotation);
    //difference vector from rotation center to mouse
    var localMouse = new Vector2(Game1.mouseState.X, Game1.mouseState.Y) - Location;
    //now rotate the mouse
    localMouse = Vector2.Transform(localMouse, rotationMatrix);
    if (Game1.mouseState.LeftButton == ButtonState.Pressed &&
        rotatedPoint.X > -Texture.Width  / 2 &&
        rotatedPoint.X <  Texture.Width  / 2 &&
        rotatedPoint.Y > -Texture.Height / 2 &&
        rotatedPoint.Y <  Texture.Height / 2)
    {
        return true;
    }
    return false;
}

另外,如果将鼠标按到方法的开始处,您可能希望移动复选框。如果未按下,则不必计算转换等