Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 两个可旋转矩形的碰撞检测_C#_Collision Detection_Monogame - Fatal编程技术网

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

C# 两个可旋转矩形的碰撞检测,c#,collision-detection,monogame,C#,Collision Detection,Monogame,我正在使用c#(单游戏引擎)制作一个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 + w

我正在使用c#(单游戏引擎)制作一个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;
}
公共布尔冲突(intx1、inty1、intw1、inth1、intx2、inty2、intw2、inth2)
{
如果(x1x2&&
y1y2)
返回true;
返回false;
}
但是我有两个对象来代替所有这些参数

谢谢。

您可以构建两个对象并调用


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

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

然而,我们可以使事情变得简单一些,因为我们处理的是矩形:其中一条潜在的分界线将平行于矩形的一条边。剩下4个可能的轴(每个矩形两个)。我们只知道这条线是平行的,不知道它到底在哪里,但有一个技巧:

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

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

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

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

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

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


复制我认为这不起作用,因为矩形不存储任何旋转。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);
}