矩形交叉代码 - 这是对的吗?

时间:2011-05-21 15:12:55

标签: c++

有人能告诉我,我的矩形是否与代码相符?

bool checkCollide(int x, int y, int oWidth, int oHeight,
                  int x2, int y2, int o2Width, int o2Height) {

   bool collide = false;

   if (x >= x2 && x <= x2+o2Width && y >= y2 && y <= y2+o2Height)
      collide = true;

   if (x+oWidth >= x2 && x+oWidth <= x2+o2Width && y >= y2 && y <= y2+o2Height)
      collide = true;

   if (x >= x2 && x<= x2+o2Width && y+oHeight >= y2 && y+oHeight <= y2+o2Height)
      collide = true;

   if (x+oWidth >= x2 && x+oWidth <= x2+o2Width && y+oHeight >= y2 && y+oHeight <= y2+o2Height)
      collide = true;

   return collide;
}

4 个答案:

答案 0 :(得分:6)

不,矩形的一角不必在另一个矩形中,矩形会碰撞。你想要做的是找到不相交的逻辑,并使用否定的逻辑。下图显示了两个明显相互交叉的矩形,但只有两侧相交,而不是角落。

enter image description here

只需按如下方式制定逻辑:蓝色与红色不相交需要什么?好吧,它要么完全向右,完全向左,向上或向下。为此制定一个if语句并否定它。 让我一开始就帮助你:

if (!(x2 > x+oWidth || x2+o2Width < x || ..))
      collide = true;

答案 1 :(得分:2)

继Magnus的回答之后,我采取了略微不同的方法。

正如他所说,如果两个没有相交,那么一个将完全离开,完全正确,等等。但是对于性能,你可以在任何这些条件下立即停止测试被发现是假的,例如:

if (x2 + owidth2 < x) 
    return false;  // box 2 is left of box 1

if (x + owidth < x2)
    return false;  // box 1 is left of box 2

// etc...

答案 2 :(得分:1)

首先实现间隔交叉(即一维)。 然后,您可以通过首先将间隔交点应用于x坐标,然后将间隔交点应用于y坐标来实现矩形交点。

答案 3 :(得分:0)

checkCollide(0, 0, 3, 3, 1, 1, 1, 1) == false

我猜这不是你想要的。