有人能告诉我,我的矩形是否与代码相符?
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;
}
答案 0 :(得分:6)
不,矩形的一角不必在另一个矩形中,矩形会碰撞。你想要做的是找到不相交的逻辑,并使用否定的逻辑。下图显示了两个明显相互交叉的矩形,但只有两侧相交,而不是角落。
只需按如下方式制定逻辑:蓝色与红色不相交需要什么?好吧,它要么完全向右,完全向左,向上或向下。为此制定一个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
我猜这不是你想要的。