检查一个点是否在旋转的矩形内
本文关键字:旋转 是否 一个 检查 | 更新日期: 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;
}
另外,如果将鼠标按到方法的开始处,您可能希望移动复选框。如果未按下,则不必计算转换等