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

时间:2013-06-16 17:51:49

标签: c# math graphics xna geometry

我知道这个问题之前曾被问过几次,我已经阅读过有关此问题的各种帖子。但是,我正在努力让这个工作。

    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;
    }

2 个答案:

答案 0 :(得分:8)

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

  • 计算△APD△DPC△CPB△PBA的区域总和。

  • 如果此总和大于矩形的面积:

    • 然后点P(x,y) 矩形之外。
    • 否则它是 in <或em 矩形。

每个三角形的面积只能使用此公式的坐标计算:

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

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

答案 1 :(得分:1)

我假设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;
}

此外,如果将鼠标按到方法的开头,您可能需要移动检查。如果没有按下,则不必计算转换等。

相关问题