从另一个网站看这个问题。
如果我们从另一面来看问题(算法),情况就会变得非常简单。
这意味着我们不会回答问题:“矩形是否重叠?”,而是回答问题:“矩形是否不重叠?”。
最后,两个问题都解决了同一个问题,但第二个问题的答案更容易实现,因为矩形不会重叠仅当一个在另一个下方或一个在另一个更左侧时(对于一个就足够了)在这些情况下会发生,但当然可能会发生两者同时发生 - 这里对逻辑条件“或”的良好理解很重要)。这减少了许多需要在第一个问题上考虑的情况。
整个问题也通过使用适当的变量名来简化:
const areRectanglesOverlap = (rect1, rect2) => {
let [left1, top1, right1, bottom1] = [rect1[0], rect1[1], rect1[2], rect1[3]],
[left2, top2, right2, bottom2] = [rect2[0], rect2[1], rect2[2], rect2[3]];
// The first rectangle is under the second or vice versa
if (top1 < bottom2 || top2 < bottom1) {
return false;
}
// The first rectangle is to the left of the second or vice versa
if (right1 < left2 || right2 < left1) {
return false;
}
// Rectangles overlap
return true;
}
即使我们有一个不同的矩形表示,也很容易通过仅修改定义变量更改的部分来使上述函数适应它。函数的后面部分保持不变(当然,这里不需要注释,但我添加了它们,以便大家可以快速理解这个简单的算法)。
上述函数的等效但可能不太可读的形式可能如下所示:
const areRectanglesOverlap = (rect1, rect2) => {
let [left1, top1, right1, bottom1] = [...rect1],
[left2, top2, right2, bottom2] = [...rect2];
return !(top1 < bottom2 || top2 < bottom1 || right1 < left2 || right2 < left1);
}