矩形覆盖问题

IT_worker 2003-08-21 04:26:35
struct rect{
double minx,miny,maxx,maxy;
}
bool is_cover(const rect *p,int n,rect r);
功能:判断p中n个矩形的并是否覆盖矩形r。

请问上述函数该如何实现?
...全文
353 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
寻开心 2003-08-28
  • 打赏
  • 举报
回复
Bluesky2008的办法如果有效的解决多边形加矩形的方案,判断是否覆盖同样可以解决。
只要把多边形和判断是否被覆盖的矩形加起来是否和源多边形相同就可以了(这个相同可以用面积来比较),如果相同就表示覆盖了。

问题是多边形和矩形的加法也不是很好做的,BlueSky2008给的例子是比较简单的,还有很复杂的,比如两个不相交的矩形是如何加成一个多边形的。

印刷排版当中的,矩形和这个问题不一样,因为那个是找位置,如何排列。
这里面的问题是不断的叠加,看覆盖,也许有大量的重复覆盖问题出现,计算量恐怕比找位置还大呐。
IT_worker 2003-08-28
  • 打赏
  • 举报
回复
要找出最少树木的矩形覆盖?!你的同时好牛啊!
就算是简单的情况我想也不容易哟!
问:已知若干区间,求它们中数目最少的一组使得能覆盖一已知区间。

zzwu 2003-08-28
  • 打赏
  • 举报
回复
BlueSky2008()的方法中,面积合并我想可以实现,以前似乎也看到过介绍文章.
但合并图形怎样验证已经覆盖了矩形的工作量仍有不少.
zzwu 2003-08-28
  • 打赏
  • 举报
回复
我有一位同事曾经作过我前面讲的那个工作,他实际作的工作不仅仅是验证是否能覆盖,而且首先是要寻找用来覆盖多边形的那组矩形集(且矩形数目要尽可能少),然后再进行验证是否能覆盖代表需要光刻的版图多边形.
zzwu 2003-08-28
  • 打赏
  • 举报
回复
我有一位同事曾经作过我前面讲的那个工作,他实际作的工作不仅仅是验证是否能覆盖,而且首先是要寻找用来覆盖多边形的那组矩形集(且矩形数目要尽可能少),然后再进行验证是否能覆盖代表需要光刻的版图多边形.
IT_worker 2003-08-27
  • 打赏
  • 举报
回复
to : zzwu(未名)
如你所给的问题,鉴于其复杂度,我想最好用栅格化方法和BlueSky2008() 所给的多边形求并算法了。
其实我的这里希望给出一种相对容易实现的算法,如果用一个写的好的垂直多边形求并的的算法来实现的话,对于大数据量可能会更快一些,只是那种算法写起来非常的繁琐。
zzwu 2003-08-23
  • 打赏
  • 举报
回复
在大规模集成电路版图设计中,有类似的问题: 要检查是否能用一系列的矩形来填满一个可以包含空洞的任意多边形区域. 这里,"任意多边形"可以有斜边,所用的"一系列矩形"也允许倾斜的.
BlueSky2008 2003-08-22
  • 打赏
  • 举报
回复
1、取一个矩形,作为多边形轮廓。
2、取下一个矩形,和多边形相加。
3、生成新的多边形轮廓:
____ ____
| _|_ | |_
| |_ _| -> | _|
|____| |____|

4、重复2、3直到取完所有矩形。
5、判断覆盖。
IT_worker 2003-08-22
  • 打赏
  • 举报
回复
我自己也得到一种算法描述如下:
首先判断是否明显不覆盖,如果是则返回false;
再判断是否明显覆盖,如果是则返回true;
否则按照r的形状将r横向或竖立向分成两半r1,r2,
对r1、r2递归调用is_cover函数,当r1,r2都被覆盖的时候可以判断r被覆盖,否则r不被覆盖,如果递归的深度太深,则采用栅格化方法。

明显不覆盖判别算法为:再不考虑y轴的情况下,如果p中所有和r相交的矩形的x方向不能
明显覆盖判别算法为:选出p中y轴覆盖r的所有矩形,如果他们在x轴上覆盖r则明显覆盖。
当然上面的算法还可以优化,但大义就是如此。
寻开心 2003-08-21
  • 打赏
  • 举报
回复
矩形减法和分隔办法其实很简单
先判断两个矩形的交,交的结果还是矩形
rect(max(rect1.min, rect2.min) min(rect1.max, rect2.max))
如果
rect.min < rect.max 表示相交
需要分割,分隔的时候直接利用rect1和rect的数据构造就出来了
否则不相交
寻开心 2003-08-21
  • 打赏
  • 举报
回复
1 简单的做法就是用非标准网格化(网格间距离不是定长)的方法来做
把输入矩形的顶点的坐标作为网格划分的点
使用二维链表把网格串连起来,网格点的数据就是一个标志:是否被覆盖。
最多是 4×n×n个网格点
和ZZWU的办法相似,不过画的更细。

2 用矩形减法和矩形分割办法
创建一个矩形队列
初始化的时候,矩形队列里面只有一个元素,就是大矩形
对输入矩形进行循环
如果矩形队列是空,break;
对矩形队列进行循环提取矩形
做矩形减法
把剩余部分再分隔成为多个矩形,并且加入到矩形队列的头部
如果矩形队列空,则完全覆盖
zzwu 2003-08-21
  • 打赏
  • 举报
回复
我想可以按下面的想法来进行:

1.n个矩形按top升序排序(假设上小下大,如屏幕图形坐标那样);
2.相同top的按left升序排序;
3.将矩形从上到下,一层一层地布局,每布一层矩形,都要记下它们的最大bottom边界,同时还要
* 检查每个矩形的top是否和上一层的最大bottom边界相接,不能相接,就从矩形系列中,寻找左边和上边都能和已布矩形相连接的矩形,如找不到,即可判定不能覆盖(对第一层,是查矩形的top是否和r的top相接);
* 检查每个矩形的left是否和上一矩形的right相接,如不能相接,则要从矩形系列寻找左边和上边都能和已布矩形相连接的矩形,如找不到,即可判定不能覆盖;
* 对每一层的最后一个矩形,则要查其right是否 > r 的right;
重复以上步骤,直到最后一层,再查它们的最大bottom边界是否 >= r 的bottom, 是就通过,否则仍就不能覆盖.
kbsoft 2003-08-21
  • 打赏
  • 举报
回复
http://202.109.195.141/chenyan/noi/rgreed.pdf
kbsoft 2003-08-21
  • 打赏
  • 举报
回复
王晓东以前发表过一篇求最小覆盖宽度的贪心算法论文...
IT_worker 2003-08-21
  • 打赏
  • 举报
回复
to sjjf(水晶剑锋):
n等于1的化当然很容易了,我的数据中n接近于1000
to zzwu:
你是说栅格化算法吧,非常遗憾此函数要求误差精度在r边长的1万分之一,1万*1万?!!,我可没有这么多的内存哟。
zzwu 2003-08-21
  • 打赏
  • 举报
回复
我想很简单:
1.将r清0
2.把n个矩形用1画上去
3.检查r是否还有0, 还有0,就没有覆盖,否则已被覆盖.
sjjf 2003-08-21
  • 打赏
  • 举报
回复
请问n个小矩形的大小是多少?
不然无法判断, 举个例子,如果n=1,就是p本身,如果p大于r则能覆盖r,
如果p<r,则不能覆盖r

33,008

社区成员

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

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