【问题标题】:Rectangle intersect code - Is this right?矩形相交代码 - 这是对的吗?
【发布时间】:2011-05-22 00:04:07
【问题描述】:

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

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

【问题讨论】:

  • 它是否正确地与您的矩形相交?如果是这样,是的。
  • 为什么不写一些单元测试代码来测试它是否为不同的输入提供了正确的答案?
  • 你最好在codereview.stackexchange.com上问这个人
  • 别忘了是否需要处理空矩形。

标签: c++


【解决方案1】:

不,矩形的角不必位于另一个矩形中,矩形就会发生碰撞。您要做的是找到它们不相交时的逻辑并使用它的否定。下图显示了两个明显相交的矩形,但只有边相交,而不是角。

只需将逻辑表述如下:蓝色不与红色相交需要什么?好吧,它要么完全在右边,要么完全在左边,要么在上面,要么在下面。对此制定一个 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...
    

    【讨论】:

    • 实际上,您的版本中布尔表达式的短路评估应该会产生相同的效果。不过,这更明确。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      checkCollide(0, 0, 3, 3, 1, 1, 1, 1) == false
      

      我猜这不是你想要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-05
        • 2012-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-07
        • 2013-03-31
        相关资源
        最近更新 更多