我的问题是我一直在尝试检查旋转一定角度的矩形是否包含一个点,但是在一些代码示例的帮助下,经过多次尝试,我无法计算出该点我在网上找到的示例。
我得到的是矩形(X,Y,宽度,高度,旋转)和点(X,Y),我一直在尝试创建一个简单的函数,该函数可以让我立即计算出该值,像这样的东西:
public bool Contains(Rect Rectangle, float RectangleRotation, Point PointToCheck);
但是,正如我提到的那样,我无法做到这一点,那些我在网上找到的包含某些公式的数学计算对我来说实在太多了。
有人可以帮我计算一下吗?如果可以用C#代码形式(而不是公式)提供计算,那就太好了!谢谢。
PS:不能使用Unity3D中可用的2D物理引擎,我的矩形没有与可以附加2D碰撞组件的游戏对象相关联,我需要在数学上做到这一点,而无需游戏对象或组件。
编辑:我忘了提一下,矩形正由矩形的中间(中心/原点)旋转。
答案 0 :(得分:1)
与其检查该点是否在旋转的矩形中,不如将旋转的相反方向应用于该点并检查该点是否在正常的矩形中。换句话说,通过将所有内容旋转-RectangleRotation
来改变视角,以使矩形根本不会旋转。
public bool Contains(Rect rect, float rectAngle, Point point)
{
// rotate around rectangle center by -rectAngle
var s = Math.Sin(-rectAngle);
var c = Math.Cos(-rectAngle);
// set origin to rect center
var newPoint = point - rect.center;
// rotate
newPoint = new Point(newPoint.x * c - newPoint.y * s, newPoint.x * s + newPoint.y * c);
// put origin back
newPoint = newPoint + rect.center;
// check if our transformed point is in the rectangle, which is no longer
// rotated relative to the point
return newPoint.x >= rect.xMin && newPoint.x <= rect.xMax && newPoint.y >= rect.yMin && newPoint.y <= rect.yMax;
}