矩形相交代码 - 这个正确吗?

4

有人能告诉我我的矩形相交代码是否正确吗?

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

它是否正确地与你的矩形相交?如果是,那么是的。 - Lightness Races in Orbit
3
为什么不编写一些单元测试代码来测试它是否针对不同输入提供了正确的答案? - Jesper
你最好在http://codereview.stackexchange.com上询问这个问题。 - rlc
不要忘记处理空矩形。 - user180326
4个回答

6
不,一个矩形的角不一定要在另一个矩形内部才能发生碰撞。你需要做的是找到它们不相交的逻辑,并使用其否定。下面的图片显示了两个明显相交的矩形,但只有边缘相交,而不是角落。
只需将逻辑公式化如下:蓝色不与红色相交需要什么条件?它完全在右侧、完全在左侧、上方或下方。将其制成if语句并取反即可。 让我帮你开始吧:
if (!(x2 > x+oWidth || x2+o2Width < x || ..))
      collide = true;

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...

实际上,在您的版本中,布尔表达式的短路评估应该产生相同的效果。尽管如此,这种写法更加明确。 - Alnitak

1

首先实现区间交集(即一维)。 然后,通过先将区间交集应用于x坐标,再将区间交集应用于y坐标,可以实现矩形交集。


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

我猜这不是你想要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接