• 全部
  • 问答

【求算法】 求一组重叠矩形区域,对应的非重叠矩形组

god_fish 2008-04-14 04:53:57
设有一组矩形R1~Rn,可能重叠,求出对应的非重叠矩形组T1~Tm

例如:

输入:矩形组R1(0,0,100,100),R2(50,50,100,100)
对应输出:T1(0,0,100,50),T2(0,50,150,50),T1(50,100,100,50)

P.S.矩形用R(x,y,w,h)表示
...全文
103 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
K_s_G 2009-06-16
?
回复
tailzhou 2008-07-14
计算不重合部分可以这样;

若要添加的矩形 跟某已添加矩形有重叠;
1)某已添加矩形 完全包含 要添加的矩形;不用再添加;
2)要添加的矩形 完全包含 某已添加矩形 ;将要添加的矩形 分解成4个新的矩形,分别添加;
3)其他情况 ;将要添加的矩形 分解成2个新的矩形,分别添加;
回复
tailzhou 2008-07-14
如果只要求结果不重合;
那么有一个比较简单的方法;

依次添加矩形;
计算“要添加的矩形”跟“已添加矩形集合”的不重合部分;
每一个不重合的部分都当作一个矩形添加到“已添加矩形集合”里去;

回复
tailzhou 2008-07-14
不过结果可以不唯一;

T1(0,0,100,50),T2(0,50,150,50),T3(50,100,100,50) 可以

T1(0,0,100,100),T2(100,50,50,50),T1(50,100,50,100) 也可以

甚至分成7个50*50的都可以;

任意一个输出都可以?
回复
tailzhou 2008-07-14
看错,原来是w,h
回复
tailzhou 2008-07-14
"输入:矩形组R1(0,0,100,100),R2(50,50,100,100)
对应输出:T1(0,0,100,50),T2(0,50,150,50),T1(50,100,100,50) "

怎么会出来150的坐标的?
回复
god_fish 2008-07-14
UP还未解决
回复
hyram 2008-05-21
mark
回复
踩个脚印,有空帮你想想,要是得到一个rgn还好整
回复
UltraBejing 2008-05-01
以后需再关注,现在先帮你顶一下
回复
好像没那么简单,呵呵.
回复
meiZiNick 2008-05-01
没遇到过这种情况.
回复
用扫描的方法可以很好地解决这个问题,想像一条垂直扫描线从左往右移动,途中经过了所有的矩形。

首先把矩形的表示方式改一下,改成(l,t.r.b)的形式,其中:
l=x;
t=y;
r=x+w;
b=y+h
其实就是改成了(左,上,右,下)的形式,这样更方便判断矩形是否相交,也便于描述一些。

然后将n个矩形中的l和r值(一共2*n个数据)混合在一起由低到高排序(如果出现值相等的情况,那就根据y值或b值小到大的顺序来判断谁前谁后)。注意这里用的是结构数据,不但要记录l和r的数值,还要记清楚这个值来自哪个矩形。
排序之后,将这2*n个值看作是“事件点”,后面的算法就是基于“事件点”来进行调度的。

我们用一个集合S来记录目前这条垂直扫描线穿过了哪些矩形,初始化的时候S是个空集。
遍历所有的事件点,有两种情况:
1)如果事件点是左边界l,则将对应的矩形插入S;
2)如果事件点是右边界r,则将对应的矩形从S中删除。
整个遍历的过程就好比是扫描线从左往右扫描了一遍,经过了所有的矩形。
两个相邻事件点之间,如果这时S不为空的话,就切出了一个个小矩形,当然纵向上还有一个判断矩形是否交叉去除重复的过程。

整个算法的复杂度是O(n^2),如果对S做一些优化(主要是便于优化和查找),还有进一步优化的余地。
不够完善的地方是最后出来的结果可能并不是最“简洁”的,也就是说,结果中有些矩形还可以合并成一个。如果想追求完美的话,最后再把最终结果(出来之后就是已经排好序的小矩形集合)扫描处理一遍就可以了。
回复
god_fish 2008-04-15
UP
回复
相关推荐
发帖
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-04-14 04:53
社区公告
暂无公告