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




