📌  相关文章
📜  检查两个矩形是否重叠 (1)

📅  最后修改于: 2023-12-03 15:40:32.277000             🧑  作者: Mango

检查两个矩形是否重叠

在开发游戏或者其他应用程序时,经常需要判断两个矩形是否有重叠部分。下面介绍几种判断方法。

方法一:重叠判定法

该方法基于以下事实:如果矩形 A 和矩形 B 有重叠部分,则矩形 A 的最左边的 x 坐标一定小于矩形 B 的最右边的 x 坐标,同时矩形 A 的最右边的 x 坐标一定大于矩形 B 的最左边的 x 坐标,同理,矩形 A 的最上边的 y 坐标一定小于矩形 B 的最下边的 y 坐标,同时矩形 A 的最下边的 y 坐标一定大于矩形 B 的最上边的 y 坐标。因此,我们可以使用简单的比较运算符来检查两个矩形是否重叠。

public static boolean overlap(Rectangle r1, Rectangle r2) {
    if (r1.x < r2.x + r2.width && r1.x + r1.width > r2.x && r1.y < r2.y + r2.height && r1.y + r1.height > r2.y) {
        return true;
    }
    return false;
}

上述方法中,r1r2 分别为两个矩形,代码判断的结果为布尔型,返回 true 则表示两个矩形有重叠部分。

方法二:左下角和右上角坐标法

该方法首先将矩形的位置表示为左下角和右上角坐标,然后通过比较坐标来判断两个矩形是否有重叠部分。

public static boolean overlap(Rectangle r1, Rectangle r2) {
    int r1x1 = r1.x;          // r1 左下角 x 坐标
    int r1y1 = r1.y;          // r1 左下角 y 坐标
    int r1x2 = r1.x + r1.width;   // r1 右上角 x 坐标
    int r1y2 = r1.y + r1.height;  // r1 右上角 y 坐标
    int r2x1 = r2.x;          // r2 左下角 x 坐标
    int r2y1 = r2.y;          // r2 左下角 y 坐标
    int r2x2 = r2.x + r2.width;   // r2 右上角 x 坐标
    int r2y2 = r2.y + r2.height;  // r2 右上角 y 坐标
 
    if (r1x1 <= r2x2 && r1x2 >= r2x1 && r1y1 <= r2y2 && r1y2 >= r2y1) {
        return true;
    }
    return false;
}

上述代码中,r1r2 分别为两个矩形,代码判断的结果为布尔型,返回 true 则表示两个矩形有重叠部分。

方法三:分别比较各坐标法

该方法分别比较两个矩形的四个坐标(左下角和右上角坐标),从而判断两个矩形是否有重叠部分。

public static boolean overlap(Rectangle r1, Rectangle r2) {
    if ((r1.x < r2.x + r2.width) && (r1.x + r1.width > r2.x) &&
        (r1.y < r2.y + r2.height) && (r1.y + r1.height > r2.y)) {
        return true;
    }
    return false;
}

上述代码中,r1r2 分别为两个矩形,代码判断的结果为布尔型,返回 true 则表示两个矩形有重叠部分。

以上是三种检查两个矩形是否重叠的方法,其中第一种方法最为常用,推荐使用。