Java中矩形交集的高度与面积计算错误问题排查
问题原因分析
你的核心错误是对Java的Rectangle构造函数参数理解有误,导致矩形的垂直位置和范围完全偏离需求,进而造成交集高度计算错误。
Java的Rectangle(int x, int y, int width, int height)参数定义明确:
x:矩形左上角的x坐标y:矩形左上角的y坐标width:矩形向右延伸的宽度(允许负数值,会自动调整为正并修正x位置)height:矩形向下延伸的高度(允许负数值,会自动调整为正并修正y位置)
而你的输入坐标是数学坐标系的左下角(x1,y1)和右上角(x2,y2)(y轴向上),直接用y2作为左上角y、y2 - y1作为高度,会导致矩形的垂直范围完全错误:
- 你构造的矩形y范围是从
y2向下延伸y2 - y1长度,覆盖区间为[y2, y2 + (y2 - y1)] - 但题目中实际需要的矩形y范围是
[y1, y2](y轴向上)
这就解释了为什么board的面积计算正确(getWidth()和getHeight()返回绝对值),但交集计算错误——因为两个矩形的垂直位置完全不匹配。
修复方案
将所有矩形的构造参数统一调整为符合Java Rectangle的坐标逻辑,同时匹配题目中的矩形范围,两种可行方式如下:
方式1:反转y轴统一坐标体系
通过反转y值,将题目中y轴向上的坐标转换为Java默认的y轴向下体系:
// 题目中(x1,y1)=左下,(x2,y2)=右上,反转y轴后构造矩形 Rectangle board1 = new Rectangle(b1x1, -b1y2, b1x2 - b1x1, b1y2 - b1y1); Rectangle board2 = new Rectangle(b2x1, -b2y2, b2x2 - b2x1, b2y2 - b2y1); Rectangle truck = new Rectangle(tx1, -ty2, tx2 - tx1, ty2 - ty1);
方式2:直接匹配矩形覆盖范围
忽略坐标系方向,确保所有矩形的构造逻辑一致,让Rectangle的覆盖范围与题目完全对应:
// 直接用题目中的左下(x1,y1)作为Java矩形的左上,高度取题目中矩形的垂直长度 Rectangle board1 = new Rectangle(b1x1, b1y1, b1x2 - b1x1, b2y2 - b1y1); Rectangle board2 = new Rectangle(b2x1, b2y1, b2x2 - b2x1, b2y2 - b2y1); Rectangle truck = new Rectangle(tx1, ty1, tx2 - tx1, ty2 - ty1);
关键注意点:所有矩形(board1、board2、truck)必须使用相同的构造方式,否则intersection方法无法正确计算交集。
验证方法
修复后可以打印矩形参数确认范围是否正确:
System.out.println("board1: x=" + board1.x + ", y=" + board1.y + ", 宽=" + board1.width + ", 高=" + board1.height); System.out.println("交集tb1: x=" + tb1.x + ", y=" + tb1.y + ", 宽=" + tb1.width + ", 高=" + tb1.height);
内容的提问来源于stack exchange,提问作者Dolfinwu
相关产品推荐
相关产品推荐

