碰撞检测两个可以旋转的矩形

时间:2018-12-17 19:45:36

标签: c# collision-detection monogame

我正在使用c#(monogame引擎)制作2D游戏。而且我需要一个函数,该函数将根据旋转后的矩形是否与其他也可以旋转的矩形发生碰撞而返回true或false。

现在,我有一个函数返回true或false,这取决于两个矩形是否碰撞。但是没有旋转。

类似这样的东西

public bool Collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2)
{
    if (x1 < x2 + w2 &&
        x1 + w1 > x2 &&
        y1 < y2 + h2 &&
        h1 + y1 > y2)
        return true;
    return false;
}

但是所有这些参数我都有两个对象。

谢谢。

2 个答案:

答案 0 :(得分:1)

对旋转的矩形执行碰撞检测要比对轴对齐的矩形更具挑战性,但这并不困难:

基本思想是,当且仅当您不能在它们之间绘制直线时,两个矩形才相交。这听起来很明显,实际上对于任何凸形都是如此。

但是,我们可以简化一些事情,因为我们正在处理矩形:这些可能的分隔线之一将与矩形的一侧平行。剩下四个可能的轴(每个矩形两个)。我们只知道这条线是平行的,而不是确切的位置,但是有一个窍门:

对于每个线方向,让我们创建另一条垂直于该方向的线。然后,我们在这条线上投影两个矩形。现在我们可以检查矩形是否重叠。

如果它们知道,我们什么都不知道,但是如果他们不知道,我们知道这些矩形绝对不会相交。

一旦我们尝试了所有四个可能的方向并且没有找到分隔轴,我们就知道矩形相交。

唯一具有挑战性的部分是将矩形投影到直线上。这是使用点积完成的,但是您可能会在其他地方找到更好的解释。基本思想是将矩形的每个角变成一个数字,该数字表示直线的高度。然后为每个矩形取最小和最大数量,并检查这些区域是否重叠。

很抱歉,我没有提供任何代码,但是应该可以按照以下步骤获得有效的实现。

我的回答基于此(您还可以在其中找到图片):

https://www.gamedev.net/articles/programming/general-and-gameplay-programming/2d-rotated-rectangle-collision-r2604

答案 1 :(得分:-1)

您可以构建两个Rectangle对象并调用IntersectsWith()

public bool Collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2)
{
    var rect1 = new System.Drawing.Rectangle(x1,y1,w1,h1);
    var rect2 = new System.Drawing.Rectangle(x2,y2,w2,h2);
    return rect1.IntersectsWith(rect2);
}