已知两个矩形的左上点、右上点坐标,怎么判断是否相交?

brk1985 2009-07-09 03:30:35
已知两个矩形的左上点、右上点坐标,即rect1的左上点、右上点坐标(X1,Y1)、(X2,Y2),rect2的左上点、右上点坐标(X3,Y3)、(X4,Y4),怎么判断是否相交(包括一个矩形包含另外一个矩形)?
需要考虑的情况好多呀,我都被搞晕了。
...全文
505 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xinyu391 2009-09-16
  • 打赏
  • 举报
回复
表达错了,想法是对的(相交矩形T的高度和宽度有损失)
纠正如下:

1.找出一个最小的矩形T,使T包含给出的2个矩形A,B
『8个点中,最小的x,y,最大的x,y 来确定』
2.
如果 矩形A,B的高度之和大于T的高度 并且 矩形A,B的宽度度之和大于T的宽度,return相交
reutrn 不相交

[Quote=引用 18 楼 xinyu391 的回复:]
我来结贴:
最简单方法(计算量最少):

1.找出一个最小的矩形T,使T包含给出的2个矩形A,B
『8个点中,最小的x,y,最大的x,y 来确定』
2.
如果矩形A,B的高度之和大于T的高度,return相交
如果矩形A,B的宽度度之和大于T的宽度,return相交
reutrn 不相交
[/Quote]
xinyu391 2009-09-16
  • 打赏
  • 举报
回复
补充一点,我在考虑2个矩形做差集的算法,
欢迎到我的google group来讨论
http://groups.google.com/group/guid
xinyu391 2009-09-16
  • 打赏
  • 举报
回复
我来结贴:
最简单方法(计算量最少):

1.找出一个最小的矩形T,使T包含给出的2个矩形A,B
『8个点中,最小的x,y,最大的x,y 来确定』
2.
如果矩形A,B的高度之和大于T的高度,return相交
如果矩形A,B的宽度度之和大于T的宽度,return相交
reutrn 不相交
brk1985 2009-07-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 donkey301 的回复:]
我觉得没必要这么麻烦的,长方形相交的必要条件是x和y方向的线段都相交。
也就是
C/C++ codeif( (x3<x1&&x1<x4)||(x3<x2&&x2<x4) )
{if( (y3<y1&&y1<y4)||(y3<y2&&y2<y4))
{returntrue;
}
}returnfalse;
[/Quote]

我现在的判断语句
((x_1>=x_3&&x_1<=x_4)||(x_2>=x_3&&x_2<=x_4)||(x_3>=x_1&&x_3<=x_2)||(x_4>=x_1&&x_4<=x_2)) && ((y_2>=y_3&&y_2<=y_4)||(y_1>=y_3&&y_1<=y_4)||(y_3>=y_1&&y_3<=y_2)||(y_4>=y_1&&y_4<=y_2))
jzd8000 2009-07-11
  • 打赏
  • 举报
回复
先确定一个矩形
再判断另一个矩形的四个顶点是不是在这个矩形内
donkey301 2009-07-11
  • 打赏
  • 举报
回复
我觉得没必要这么麻烦的,长方形相交的必要条件是x和y方向的线段都相交。
也就是

if ( (x3 < x1 && x1 < x4)
||(x3 < x2 && x2 < x4) )
{
if ( (y3 < y1 && y1 < y4)
||(y3 < y2 && y2 < y4))
{
return true;
}
}
return false;
showjim 2009-07-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sbwwkmyd 的回复:]
已知条件只能确认线段是否重叠,除非y轴相等且x轴重叠,否则无法确认
[/Quote]
已知条件只能判断是否可能相交,无法判断一定相交.
showjim 2009-07-10
  • 打赏
  • 举报
回复
已知条件只能确认线段是否重叠,除非y轴相等且x轴重叠,否则无法确认
killerlpy 2009-07-10
  • 打赏
  • 举报
回复
我的想法:两个矩形相交,必有一个矩形一边上一点在另一矩形,任取一个为参考,遍历另一个矩形的四边上的点是否在参考矩形之间就可以了,判断程序可以参考六楼……
brk1985 2009-07-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wdgphc 的回复:]
两个正矩形是否相交,只有两种情况,一是全包含,二是有相交。

A的右边与B的右边

这4种情况可以在(1)中把所有的 <>号换成 <=,>=即可表达。所以还有另外12…

比如A的上边与B的左边相交判定就是 if(x1 <=x3 && x3 <=x2 && y1>=y3 && y1 <=y4)
[/Quote]

A的上边与B的左边相交判定写法不一,这个蛮头痛,好像也可以写成 if(x1 <=x3 && x3 <=x2 && y1 <=y4 && y2>=y4)
brk1985 2009-07-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wdgphc 的回复:]
两个正矩形是否相交,只有两种情况,一是全包含,二是有相交。

(1)

if((x1 <x3 && y1 <y3 && x2>x4 && y2>y4) || (x1>x3 && y1>y3 && x2 <x4 && y2 <y4)) //A包含B 或 B包含A

(2)
必定有A矩形某一条边上某点和另一个矩形B的某一条边的某点重合
一共16种可能
A的上边与B的上边
A的下边与B的下边
A的左边与B的左边
A的右边与B的右边

这4种情况可以在(1)中把所有的 <>号换成 <=,>=即可表达。所以还有另外12…
[/Quote]

11楼的回复非常有启发性,考虑的非常全面,非常感谢!!!
我先写一下,如果有问题,再询问下,没问题就结贴了。
xxjjs 2009-07-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xxjjs 的回复:]
很简单啊,两个矩形相交,则必有其中一个矩形的某一个顶点在另一个矩形内部,测试这八个顶点就成。

[/Quote]

错了,错了,我想简单了,除了上述情况外,还是判断四边是否相交:

求线线交点以前我写过一篇文章节选如下:

线-线交点:

你将发现寻找两条线的交点是最普遍的几何问题之一。尽管这个问题很普遍且看起来很简单,但是还是有许多程序员感到无从下手。第一个问题是直线是以什么形式给出的?或者说你希望它是什么形式?理想情况下,每条线都可以写成Ax+By=C的形式。ABC这三个值就可以唯一确定一条直线。然而,经常给我们的直线并不是这样的形式,不过我们总可以很容易地将两个点装换成这种标准形式。例如给出直线上两个点(x1,y1)和(x2,y2),我们可以等到相应的A,B 和C:
A = y2-y1
B = x1-x2
C = A*x1+B*y1 http://www.ccthere.com/article/1982490.html
无论直线是如何描述的,我们总可以有直线上的至少两个点,然后以上述方式得到A,B和C。好现在我们可以假定我们有两条直线:
A1x + B1y = C1 (一)
A2x + B2y = C2 (二)
那么要找这两条直线的交点就变成一个简单的二元一次方程问题。http://www.ccthere.com/article/1982490.html
double det = A1*B2 - A2*B1
if(det == 0){
//Lines are parallel
}else{http://www.ccthere.com/article/1982490.html
double x = (B2*C1 - B1*C2)/det
double y = (A1*C2 - A2*C1)/det
}
复习一下初中数学,将(一)两边乘以B2,(二)两边乘以B1,然后将两式相减得到:http://www.ccthere.com/article/1982490.html
A1B2x - A2B1x = B2C1 - B1C2
那么就得到 x = (B2C1 - B1C2 )/(A1B2 – A2B1) 类似第你可以得到y.
现在你就得到了两条直线的交点。那么在两条线段的情况下又怎样呢?你需要确认我们的到的点在两条线段上。如果线段的两个端点是(x1,y1)和 (x2,y2),那么你只要检查min(x1,x2) ≤ x ≤ max(x1,x2) 和min(y1,y2) ≤ y ≤ max(y1,y2)就可以认为该点在线段上。这里特别提醒一下浮点数的精度问题。如果交点正好在线段的端点或线段是水平/垂直的,简单的比较是可能有问题的。这里你可以定义一个最小的许可误差或是用一个分数的类来进行。
xxjjs 2009-07-10
  • 打赏
  • 举报
回复
很简单啊,两个矩形相交,则必有其中一个矩形的某一个顶点在另一个矩形内部,测试这八个顶点就成。




if ((x1 <= x3 && x1 >= x4 && y1 <= y3 && y1 >= y4) ||
(x1 <= x3 && x1 >= x4 && y2 <= y3 && y2 >= y4) ||
(x2 <= x3 && x2 >= x4 && y1 <= y3 && y1 >= y4) ||
(x2 <= x3 && x2 >= x4 && y2 <= y3 && y2 >= y4) ||
(x3 <= x1 && x3 >= x2 && y3 <= y1 && y3 >= y2) ||
(x3 <= x1 && x3 >= x2 && y4 <= y1 && y4 >= y2) ||
(x4 <= x1 && x4 >= x2 && y3 <= y1 && y3 >= y2) ||
(x4 <= x1 && x4 >= x2 && y4 <= y1 && y4 >= y2) )
{
INTERIOR
}
else
{
EXTERIOR
}

jlp999 2009-07-10
  • 打赏
  • 举报
回复
问题表述不清。
还是表达清除了,再来讨论的好。
wdgphc 2009-07-10
  • 打赏
  • 举报
回复
两个正矩形是否相交,只有两种情况,一是全包含,二是有相交。

(1)

if((x1<x3 && y1<y3 && x2>x4 && y2>y4) || (x1>x3 && y1>y3 && x2<x4 && y2<y4)) //A包含B 或 B包含A

(2)
必定有A矩形某一条边上某点和另一个矩形B的某一条边的某点重合
一共16种可能
A的上边与B的上边
A的下边与B的下边
A的左边与B的左边
A的右边与B的右边

这4种情况可以在(1)中把所有的<>号换成<=,>=即可表达。所以还有另外12种可能,一一写个相应的表达式不是难事
比如A的上边与B的左边相交判定就是 if(x1<=x3 && x3<=x2 && y1>=y3 && y1<=y4)
其他的类推即可。
brk1985 2009-07-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 junyi2003 的回复:]
也没办法确定啊,要是有倾斜的话。

反正这类解题要用2个点形成的直线来画个园吧。
如果这2个圆不相交、包含的话,那肯定是不相交的。
[/Quote]

三楼说了呀,写错了,是已知两个矩形的左上点、右下点。不存在倾斜的情况。

微软的IntersectRect函数貌似也行的,我想自己写,需要考虑的情况好多呀,我都被搞晕了。

CSDN竟不能修改..............。
junyi2003 2009-07-09
  • 打赏
  • 举报
回复
也没办法确定啊,要是有倾斜的话。

反正这类解题要用2个点形成的直线来画个园吧。
如果这2个圆不相交、包含的话,那肯定是不相交的。
brk1985 2009-07-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liyunsheng613 的回复:]
左上点和右上点不能确定一个矩形哦。LZ
[/Quote]

右下点,写错了
neohope 2009-07-09
  • 打赏
  • 举报
回复
要是有倾斜的情况,还是直线方程来的利索
liyunsheng613 2009-07-09
  • 打赏
  • 举报
回复
左上点和右上点不能确定一个矩形哦。LZ

33,025

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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