【问题标题】:Collision detection of two rectangles that can be rotated两个可旋转矩形的碰撞检测
【发布时间】:2018-12-18 04:12:30
【问题描述】:

我正在使用 c#(单游戏引擎)制作 2d 游戏。我需要一个函数,它会根据旋转的矩形是否与其他也可以旋转的矩形发生碰撞而返回 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;
}

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

谢谢。

【问题讨论】:

标签: c# collision-detection monogame


【解决方案1】:

对旋转的矩形进行碰撞检测比轴对齐的矩形更具挑战性,但也不是特别难:

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

但是,我们可以使事情变得更简单,因为我们正在处理矩形:这些潜在的分割线之一将平行于矩形的边之一。这留下了 4 个可能的轴(每个矩形两个)。我们只知道这条线是平行的,并不确切在哪里,但有一个技巧:

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

如果他们知道,我们什么都不知道,但如果他们不知道,我们知道矩形肯定不相交。

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

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

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

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

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

【讨论】:

    【解决方案2】:

    您可以构建两个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);
    }
    

    【讨论】:

    • 我认为这行不通,因为 Rectangle 不存储任何旋转。 IntersectsWith() 和他已有的代码是一样的。
    • 在这种情况下,他可以围绕旋转应用一些矩阵逻辑docs.microsoft.com/en-us/dotnet/api/…
    • 好的,再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2012-09-23
    • 1970-01-01
    • 2013-04-06
    相关资源
    最近更新 更多