导读:本期聚焦于小伙伴创作的《如何用 Java 实现两个矩形并集面积计算并输出交集与独立区域面积》,敬请观看详情。计算两个矩形并集面积时,直接相加会重复统计重叠部分。正确做法是先判断矩形是否相交,若相交则通过最大最小坐标求出交集矩形,用两矩形面积之和减去交集面积得到并集。独立区域面积则是各自面积减去交集部分。本文给出基于 AxisAlignedBoundingBox 思路的 Java 实现,包含坐标规范化、相交判断、面积拆分输出,可处理完全包含、部分重叠、相离三种情况,代码可直接用于几何计算或碰撞检测前置逻辑。

在几何计算与碰撞检测场景中,经常需要求出两个轴对齐矩形的并集面积,并且把交集部分和各自独立部分的面积分开输出。轴对齐矩形指边分别与坐标轴平行的矩形,用左上角和右下角坐标即可完整描述。实现该计算的核心在于正确识别两矩形是否相交,以及相交时如何推导重叠区域。

如何用 Java 实现两个矩形并集面积计算并输出交集与独立区域面积

矩形数据结构与坐标定义

我们用一个简单的类来描述矩形,包含 x1、y1(左下角)和 x2、y2(右上角)。为了降低后续计算复杂度,可以在构造时自动将坐标规范化为左下角小于右上角的形式,避免调用者传参顺序错误导致面积变负。

坐标规范化后,矩形面积计算公式为 (x2 - x1) * (y2 - y1)。如果两个矩形相离或边相切,交集面积为 0;如果部分重叠或完全包含,则交集是一个新的轴对齐矩形。下面先给出矩形类的定义。

class Rect {
    int x1, y1, x2, y2;

    Rect(int x1, int y1, int x2, int y2) {
        // 自动规范化,保证 x1<=x2, y1<=y2
        this.x1 = Math.min(x1, x2);
        this.y1 = Math.min(y1, y2);
        this.x2 = Math.max(x1, x2);
        this.y2 = Math.max(y1, y2);
    }

    int area() {
        return (x2 - x1) * (y2 - y1);
    }
}

相交判断与交集矩形计算

两个轴对齐矩形相交的充要条件是:在 x 轴方向投影重叠,且在 y 轴方向投影重叠。具体写为 x1_2 <= x2_1 且 x1_1 <= x2_2,y 方向同理。若任一方向不重叠,则两矩形相离或相切,交集为空。

当确认相交后,交集矩形的左下角取两矩形左下角坐标的较大值,右上角取两矩形右上角坐标的较小值。该交集矩形面积即为重叠部分面积。如果一方完全包含另一方,交集矩形就等于被包含的矩形。

static Rect intersect(Rect a, Rect b) {
    // 不相交则返回空矩形(面积为0)
    if (a.x1 > b.x2 || b.x1 > a.x2 || a.y1 > b.y2 || b.y1 > a.y2) {
        return null;
    }
    int ix1 = Math.max(a.x1, b.x1);
    int iy1 = Math.max(a.y1, b.y1);
    int ix2 = Math.min(a.x2, b.x2);
    int iy2 = Math.min(a.y2, b.y2);
    return new Rect(ix1, iy1, ix2, iy2);
}

并集与分离面积输出

并集面积等于 a.area() + b.area() - inter.area()。独立区域面积指去掉交集后各自剩余部分:aOnly = a.area() - inter.area(),bOnly = b.area() - inter.area()。当不相交时,交集为 null,inter.area() 视为 0,此时 aOnly 与 bOnly 就等于各自面积。

下面的方法接收两个矩形,打印并集、交集及独立区域面积。这种分离输出在游戏碰撞响应中很有用,比如计算伤害区域时可区分公共重叠区和单体额外区域。

static void printAreas(Rect a, Rect b) {
    Rect inter = intersect(a, b);
    int interArea = (inter == null) ? 0 : inter.area();
    int unionArea = a.area() + b.area() - interArea;
    int aOnly = a.area() - interArea;
    int bOnly = b.area() - interArea;

    System.out.println("矩形A面积: " + a.area());
    System.out.println("矩形B面积: " + b.area());
    System.out.println("交集面积: " + interArea);
    System.out.println("A独立面积: " + aOnly);
    System.out.println("B独立面积: " + bOnly);
    System.out.println("并集面积: " + unionArea);
}

完整示例与测试

我们构造三组测试用例:部分重叠、完全包含、相离。通过 main 方法调用 printAreas 观察输出是否符合预期。部分重叠时并集应小于两面积和;包含时交集等于小矩形;相离时交集为 0。

该实现时间复杂度为 O(1),仅做常数次算术与比较,空间复杂度也为 O(1)。可轻松改写为接收 double 坐标以支持浮点精度,或扩展为多个矩形并集的扫描线算法基础。

public class Main {
    public static void main(String[] args) {
        Rect a = new Rect(0, 0, 4, 4);
        Rect b = new Rect(2, 2, 6, 6);
        System.out.println("--- 部分重叠 ---");
        printAreas(a, b);

        Rect c = new Rect(0, 0, 10, 10);
        Rect d = new Rect(1, 1, 3, 3);
        System.out.println("--- 完全包含 ---");
        printAreas(c, d);

        Rect e = new Rect(0, 0, 2, 2);
        Rect f = new Rect(3, 3, 5, 5);
        System.out.println("--- 相离 ---");
        printAreas(e, f);
    }

    // 这里粘贴前面定义的 Rect 类、intersect 和 printAreas 方法
}

常见误区与注意点

一个常见错误是直接用 (a.x2 - b.x1) * (a.y2 - b.y1) 之类公式算交集,未先判断相离情况,导致得到负数面积。必须先用投影重叠判定,再取最大最小坐标。

另一个误区是认为并集面积等于两矩形面积和。只有在互斥时成立,一旦有重叠就必须减去交集,否则统计结果偏大。分离输出能帮开发者在日志中快速发现重叠量,便于调试碰撞盒配置。

Java矩形并集交集分离修改时间:2026-08-01 00:00:28

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。