You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Java:求两矩形重叠后分割出的红色子矩形面积

实现思路与代码示例

咱们先把基础逻辑理清楚,首先得统一矩形的表示方式——通常用**左上角坐标(x1, y1)和右下角坐标(x2, y2)**来定义(这里默认是图形系统常用的y轴向下坐标系,要是你用的是y轴向上的坐标系,逻辑只需要微调y方向的判断即可)。

第一步:先确认两个矩形是否重叠

你之前参考的帖子里应该提到过,判断重叠的核心思路是:先找不重叠的情况,反过来就是重叠。当一个矩形完全在另一个的左侧、右侧、上侧、下侧时,两者肯定不重叠,代码实现如下:

public static boolean isOverlapping(Rect rectA, Rect rectB) {
    // 四个明确不重叠的场景:A在B左边、A在B右边、A在B上边、A在B下边
    return !(rectA.x2 <= rectB.x1 || 
             rectA.x1 >= rectB.x2 || 
             rectA.y2 <= rectB.y1 || 
             rectA.y1 >= rectB.y2);
}

这里的Rect是自定义的矩形类,包含x1、y1(左上)、x2、y2(右下)四个属性,你可以根据自己的业务需求调整属性类型(比如用float代替int)。

第二步:计算红色子矩形的坐标(以重叠区域为例)

如果两个矩形重叠,红色子矩形(假设是重叠区域)的坐标可以通过取两个矩形对应坐标的极值得到:

  • 重叠区域左上角x:取两个矩形左上角x的最大值 max(rectA.x1, rectB.x1)
  • 重叠区域左上角y:取两个矩形左上角y的最大值 max(rectA.y1, rectB.y1)
  • 重叠区域右下角x:取两个矩形右下角x的最小值 min(rectA.x2, rectB.x2)
  • 重叠区域右下角y:取两个矩形右下角y的最小值 min(rectA.y2, rectB.y2)

第三步:计算红色子矩形的面积

拿到重叠区域的坐标后,直接用宽乘高计算面积即可。如果两个矩形不重叠,面积直接返回0。

完整代码示例

先定义基础矩形类(顺便做了坐标合法性校验,避免输入顺序颠倒):

class Rect {
    int x1, y1; // 左上角坐标
    int x2, y2; // 右下角坐标

    public Rect(int x1, int y1, int x2, int y2) {
        // 确保x1 < x2,y1 < y2,避免输入坐标顺序错误
        this.x1 = Math.min(x1, x2);
        this.x2 = Math.max(x1, x2);
        this.y1 = Math.min(y1, y2);
        this.y2 = Math.max(y1, y2);
    }

    // 计算矩形自身的面积
    public int getArea() {
        return (this.x2 - this.x1) * (this.y2 - this.y1);
    }
}

然后是计算重叠区域面积的核心方法:

public static int calculateOverlapArea(Rect rectA, Rect rectB) {
    if (!isOverlapping(rectA, rectB)) {
        return 0; // 不重叠时红色区域面积为0
    }

    // 计算重叠区域的坐标
    int overlapX1 = Math.max(rectA.x1, rectB.x1);
    int overlapY1 = Math.max(rectA.y1, rectB.y1);
    int overlapX2 = Math.min(rectA.x2, rectB.x2);
    int overlapY2 = Math.min(rectA.y2, rectB.y2);

    // 计算并返回重叠区域面积
    return (overlapX2 - overlapX1) * (overlapY2 - overlapY1);
}

额外补充:如果红色子矩形是指两个矩形各自的非重叠部分

要是你说的红色子矩形是两个矩形减去重叠区域后的独立部分,那面积计算就很简单了:

  • 矩形A的红色部分面积:rectA.getArea() - calculateOverlapArea(rectA, rectB)
  • 矩形B的红色部分面积:rectB.getArea() - calculateOverlapArea(rectA, rectB)

内容的提问来源于stack exchange,提问作者Pasquale Celardo

火山引擎 最新活动