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

brk1985 2009-07-09 03:30:35
已知两个矩形的左上点、右上点坐标,即rect1的左上点、右上点坐标(X1,Y1)、(X2,Y2),rect2的左上点、右上点坐标(X3,Y3)、(X4,Y4),怎么判断是否相交(包括一个矩形包含另外一个矩形)?
需要考虑的情况好多呀,我都被搞晕了。
...全文
423 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
matlab 相机标定代码 摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程,也就是求最终的投影矩阵的过程。 [1]基本的坐标系: 世界坐标系; 相机坐标系; 成像平面坐标系; 像素坐标系 [2]一般来说,标定的过程分为两个部分: 第一步是从世界坐标系转为相机坐标系,这一步是三维到三维的转换,包括R,t(相机外参,确定了相机在某个三维空间中的位置和朝向)等参数; 第二部是从相机坐标系转为成像平面坐标系(像素坐标系),这一步是三维到二维的转换,包括K(相机内参,是对相机物理特性的近似)等参数; 投影矩阵 : P=K [ R | t ] 是一个3×4矩阵,混合了内参和外参而成。 P=K[Rt] 二.基本知识介绍及 1、摄像机模型 Pinhole Camera模型如下图所示: 摄像机模型与标定 - 小企鹅 - 企鹅的博客 是一个小孔成像的模型,其中: [1]O表示camera centre,即相机的中心,也是相机坐标系的中心; [2]z轴表示principal axis,即相机的主轴; [3]q所在的平面表示image plane,即相机的像平面,也就是图片坐标系所在的二维平面; [4]O1表示principal point,即主,主轴与像平面相交; [5]O到O1的距离,也就是右边图中的f,即相机的焦距; [6]像平面上的x和y坐标轴是与相机坐标系上的X和Y坐标轴互相平行的; [7]相机坐标系是以X,Y,Z(大写)三个轴组成的且原在O,度量值为米(m); [8]像平面坐标系是以x,y(小写)两个轴组成的且原在O1,度量值为米(m); [9]像素坐标系一般指图片相对坐标系,在这里可以认为和像平面坐标系在一个平面上,不过原是在图片的角上,而且度量值为像素的个数(pixel); 2、相机坐标系→成像平面坐标系 [1]以O为原建立摄像机坐标系。Q(X,Y,Z)为摄像机坐标系空间中的一,该被光线投影到图像平面上的q(x,y,f)。 图像平面与光轴z轴垂直,和投影中心距离为f (f是相机的焦距)。按照三角比例关系可以得出: x/f = X/Z y/f = Y/Z ,即 x = fX/Z y = fY/Z 以图像平面的上角或下角为原建立坐标系。假设像平面坐标系原位于图像下角,水平向右为u轴,垂直向上为v轴,均以像素为单位。 以图像平面与光轴的交O1 为原建立坐标系,水平向右为x轴,垂直向上为y轴。原O1一般位于图像中心处,O1在以像素为单位的图像坐标系中的坐标为(u0, v0)。 像平面坐标系和像素坐标系虽然在同一个平面上,但是原并不是同一个。 摄像机模型与标定 - 小企鹅 - 企鹅的博客 设每个像素的物理尺寸大小为 dx * dy (mm) ( 由于单个像素投影在图像平面上是矩形而不是正方形,因此可能dx != dy), 图像平面上某在成像平面坐标系中的坐标为(x, y),在像素坐标系中的坐标为(u, v),则二者满足如下关系:[即(x, y)→(u, v)] u = x / dx + u0 v = y / dy + v0 用齐次坐标与矩阵形式表示为: 摄像机模型与标定 - 小企鹅 - 企鹅的博客 将等式两边都乘以Q(X,Y,Z)坐标中的Z可得: 摄像机模型与标定 - 小企鹅 - 企鹅的博客 将摄像机坐标系中的(1)式代入上式可得: 则右边第一个矩阵和第二个矩阵的乘积亦为摄像机的内参数矩阵(单位为像素),相乘后可得: (2) 和(1)式相比,此内参数矩阵中f/dx, f/dy, cx/dx+u0, cy/dy+v0 的单位均为像素。令内参数矩阵为K,则上式可写成: 摄像机模型与标定 - 小企鹅 - 企鹅的博客 (3) 三.相机内参K(与棋盘所在空间的3D几何相关) 在计算机视觉中,摄像机内参数矩阵 其中 f 为摄像机的焦距,单位一般是mm;dx,dy 为像元尺寸;u0,v0 为图像中心。 fx = f/dx, fy = f/dy,分别称为x轴和y轴上的归一化焦距. 为更好的理解,举个实例: 现以NiKon D700相机为例进行求解其内参数矩阵: 就算大家身边没有这款相机也无所谓,可以在网上百度一下,很方便的就知道其一些参数—— 焦距 f = 35mm 最高分辨率:4256×2832 传感器尺寸:36.0×23.9 mm 根据以上定义可以有: u0= 4256/2 = 2128 v0= 2832/2 = 1416 dx = 36.0/4256 dy = 23.9/2832 fx = f/dx = 4137.8 fy = f/dy = 4147.3 分辨率可以从显示分辨率与图像分辨率两个方向来分类。 [1]显示分辨率(屏幕分辨率)是屏幕图像的精密度,是指显示器所能显示的像素有多少。由于屏幕上的、线和面都是由像素组成的, 显示器可显示的像素越多,画面就越精细,同样的屏幕区域内能显示的信息也越多,所以分辨率是个非常重要的性能指标之一。 可以把整个图像想象成是一个大型的棋盘,而分辨率的表示方式就是所有经线和纬线交叉的数目。 显示分辨率一定的情况下,显示屏越小图像越清晰,反之,显示屏大小固定时,显示分辨率越高图像越清晰。 [2]图像分辨率则是单位英寸中所包含的像素数,其定义更趋近于分辨率本身的定义。 四.畸变参数(与集如何畸变的2D几何相关。) 采用理想针孔模型,由于通过针孔的光线少,摄像机曝光太慢,在实际使用中均采用透镜,可以使图像生成迅速,但代价是引入了畸变。 有两种畸变对投影图像影响较大: 径向畸变和切向畸变。 1、径向畸变 对某些透镜,光线在远离透镜中心的地方比靠近中心的地方更加弯曲,产生“筒形”或“鱼眼”现象,称为径向畸变。 一般来讲,成像仪中心的径向畸变为0,越向边缘移动,畸变越严重。不过径向畸变可以通过下面的泰勒级数展开式来校正: xcorrected = x(1+k1r2+k2r4+k3r6) ycorrected = y(1+k1r2+k2r4+k3r6) 这里(x, y)是畸变在成像仪上的原始位置,r为该距离成像仪中心的距离,(xcorrected ,ycorrected )是校正后的新位置。 对于一般的摄像机校正,通常使用泰勒级数中的前两项k1和k2就够了;对畸变很大的摄像机,比如鱼眼透镜,可以使用第三径向畸变项k3 2、切向畸变 当成像仪被粘贴在摄像机的时候,会存在一定的误差,使得图像平面和透镜不完全平行,从而产生切向畸变。也就是说,如果一个矩形被投影到成像仪上时, 可能会变成一个梯形。切向畸变可以通过如下公式来校正: xcorrected = x + [ 2p1y + p2 (r2 + 2x2) ] ycorrected = y + [ 2p2x + p1 (r2 + 2y2) ] 这里(x, y)是畸变在成像仪上的原始位置,r为该距离成像仪中心的距离,(xcorrected ,ycorrected )是校正后的新位置。 五.摄像机的外参数 旋转向量(大小为1×3的矢量或旋转矩阵3×3)和平移向量(tx,ty,tz)。 旋转向量:旋转向量是旋转矩阵紧凑的变现形式,旋转向量为1×3的行矢量。 r就是旋转向量,旋转向量的方向是旋转轴 ,旋转向量的模为围绕旋转轴旋转的角度。 通过上面的公式,我们就可以求解出旋转矩阵R。同样的已知旋转矩阵,我们也可以通过下面的公式求解得到旋转向量: 。

33,008

社区成员

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

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