百思不得其解,如何判断两个长方形是否有部分重叠呢?

leogriv 2010-04-01 12:33:43
在一本书的练习题上看到了一个题目,要求在一个类中创建一个方法,通过长方形的中心点的坐标和长宽来和已经创建好的一个长方形(中心点坐标,长和宽都已知)进行比较,返回一个Boolean值,判断是否这两个长方形有部分重叠的情况?

比如新创建的长方形的信息是(3, 5, 3, 6),分别代表(x, y, width, height)
已知的长方形是(2, 2, 6, 5)

想了很久也不知道该怎么利用上中心点这个条件来判断两个长方形是否部分重叠,总感觉是利用什么长度互相减看是否超出什么个范围来判断的,但是研究了很久都没发现有什么规律,求解,谢谢了!
...全文
1332 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
eggno8 2010-04-08
  • 打赏
  • 举报
回复

嗯嗯,试下发图。一画图其实很明了。
windforce9811 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 eggno8 的回复:]
引用 11 楼 windforce9811 的回复:
判断两个长方形对角线长度和的一半是否大于两个中心点之间的距离即可。

楼上这位说的方法成判断两个矩形的外接圆是否相交了。但实际情况很可能外接圆相交,矩形还差很远哦。
[/Quote]
---------------------
如果是两个固定位置的矩形,那直接计算坐标不就有结果了吗?
Dazzlingwinter 2010-04-08
  • 打赏
  • 举报
回复
这样做有很严重的问题。。。
没考虑清楚
Dazzlingwinter 2010-04-08
  • 打赏
  • 举报
回复
LZ的意思已经很明白了:两个矩形都平行于XY轴

public class RectangleCrash extends Frame{
private Rectangle rectangleA, rectangleB;
public RectangleCrash(Rectangle rectangleA, Rectangle rectangleB) {
this.rectangleA = rectangleA;
this.rectangleB = rectangleB;
this.setBackground(Color.BLACK);
this.setBounds(100, 100, 800, 600);
this.setVisible(true);
}

public boolean isCrash() {
Point[] points = new Point[4];
points[0] = new Point(rectangleB.x, rectangleB.y);
points[1] = new Point(rectangleB.x, rectangleB.y + rectangleB.height);
points[2] = new Point(rectangleB.x + rectangleB.width, rectangleB.y);
points[3] = new Point(rectangleB.x + rectangleB.width, rectangleB.y + rectangleB.height);
for(int i=0; i<points.length; i++) {
if(isContains(points[i])) {
return true;
}
}
return false;
}

public boolean isContains(Point point) {
if(point.x >= rectangleA.x && point.y >= rectangleA.y && point.x <= rectangleA.x + rectangleA.width && point.y <= rectangleA.y + rectangleA.height) {
return true;
}
return false;
}


public void paint(Graphics g) {
Color c = g.getColor();
g.setColor(Color.RED);
g.drawRect(rectangleA.x, rectangleA.y, rectangleA.width, rectangleA.height);
g.setColor(Color.ORANGE);
g.drawRect(rectangleB.x, rectangleB.y, rectangleB.width, rectangleB.height);
g.setColor(Color.WHITE);
g.drawString(isCrash() ? "Crash!" : "Not Crash!", 10, 200);
g.setColor(c);
}


public static void main(String[] args) {
Rectangle rectangleA = new Rectangle(100, 100, 200, 300);
Rectangle rectangleB = new Rectangle(301, 200, 300, 300);
RectangleCrash rectangleCrash = new RectangleCrash(rectangleA, rectangleB);
}
}

效果图就不贴了,用B生成四个点也就是矩形B的四个角了,依次判断矩形A是否包含矩形B的四个角,有一个包含则为碰撞
其实Rectangle2D已经有更好的方法来判断是否碰撞了,可以研究一下~~~
zoeg 2010-04-08
  • 打赏
  • 举报
回复
设,两个矩形(X,Y,宽,高):
(x1,y1,w1,h1),(x2,y2,w2,h2)
其宽、高的一半,分别定义为该矩形在相应轴上的触角
当两个矩形相交时在任意轴上的中心点间距应小于该轴上的触角之和
w1/2+w2/2>|x1-x2|且h1/2+h2/2>|y1-y2|
铁匠梁老师 2010-04-01
  • 打赏
  • 举报
回复
有道理,学到了些什么东东。
Altman2010 2010-04-01
  • 打赏
  • 举报
回复 1
引用 11 楼 windforce9811 的回复:
判断两个长方形对角线长度和的一半是否大于两个中心点之间的距离即可。
leogriv 2010-04-01
  • 打赏
  • 举报
回复
不好意思,忘了说了,矩形的边都是和XY轴是平行的

我画了很多图了,但是感觉知道点什么,但是又找不到真正的方法
eggno8 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 windforce9811 的回复:]
判断两个长方形对角线长度和的一半是否大于两个中心点之间的距离即可。
[/Quote]
楼上这位说的方法成判断两个矩形的外接圆是否相交了。但实际情况很可能外接圆相交,矩形还差很远哦。
windforce9811 2010-04-01
  • 打赏
  • 举报
回复
判断两个长方形对角线长度和的一半是否大于两个中心点之间的距离即可。
eggno8 2010-04-01
  • 打赏
  • 举报
回复 1
两个矩形都是边与x,y轴平行的,看两个中点的x差是否小于(x边长和)/2或者x差是否小于(y边长和)/2就可以了哟,画个图很直观
keeya0416 2010-04-01
  • 打赏
  • 举报
回复
if (2 * Math.Abs(x1 - x2) < width1 + width2 && 2 * Math.Abs(y1 - y2) < height1 + height2)
{
return true;
}
else
{
return false;
}
king_jw 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zoeg 的回复:]

矩形的长、宽是否与坐标轴平行,这个条件很重要!
[/Quote]
对是这样的 两个中心的连线在和一条水平一条垂直的线组成的直角三角形,比较它的直角边与两个长方形的长和宽
钱不是问题 2010-04-01
  • 打赏
  • 举报
回复
x1<=x2+width2 && x1+width1>=x2 && y1<=y2+height2 && y1+heigth1 >=y2
hjh811 2010-04-01
  • 打赏
  • 举报
回复
如果长方形不会是斜放的,3楼就是正解了
ZRBRZB 2010-04-01
  • 打赏
  • 举报
回复
你可以根据给出的中心点、长和宽创建Rectangle对象,然后rect.intersects(double x,double y, double w,double h)来判断两个矩形是否相交
ineedaname 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bao110908 的回复:]
这个长方形旋转么?
[/Quote]
问到了重点~
宅男小何 2010-04-01
  • 打赏
  • 举报
回复
恩,题目意思要一定弄清楚lz,碰撞其实就是看着两个长方形的中心连接起来是否小于了这两个长方形的长或者高,呵呵!
  • 打赏
  • 举报
回复
这个长方形旋转么?
zoeg 2010-04-01
  • 打赏
  • 举报
回复
矩形的长、宽是否与坐标轴平行,这个条件很重要!

62,624

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧