2D旋转矩形包含点计算

时间:2018-12-23 21:39:26

标签: c# unity3d math

我的问题是我一直在尝试检查旋转一定角度的矩形是否包含一个点,但是在一些代码示例的帮助下,经过多次尝试,我无法计算出该点我在网上找到的示例。

我得到的是矩形(X,Y,宽度,高度,旋转)和点(X,Y),我一直在尝试创建一个简单的函数,该函数可以让我立即计算出该值,像这样的东西:

public bool Contains(Rect Rectangle, float RectangleRotation, Point PointToCheck);

但是,正如我提到的那样,我无法做到这一点,那些我在网上找到的包含某些公式的数学计算对我来说实在太多了。

有人可以帮我计算一下吗?如果可以用C#代码形式(而不是公式)提供计算,那就太好了!谢谢。

PS:不能使用Unity3D中可用的2D物理引擎,我的矩形没有与可以附加2D碰撞组件的游戏对象相关联,我需要在数学上做到这一点,而无需游戏对象或组件。

编辑:我忘了提一下,矩形正由矩形的中间(中心/原点)旋转。

1 个答案:

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