矩形覆盖问题

nandizhu 2008-09-19 02:59:28
在XY坐标系上给定对角线坐标(x1,y1),(x2,y2)确定一个平行XY轴的矩形区域

再在XY坐标系中输入N个矩形区域(均以对角线坐标表示)

判断源矩形区域是否被N个矩形区域覆盖
...全文
777 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangjinpengchina 2008-09-21
  • 打赏
  • 举报
回复
给你一个自己写的矩形求交的程序,希望对你有用
矩形求交
#include <iostream>
using namespace std;

#define MAX(a, b) ((a >= b) ? a : b)
#define MIN(a, b) ((a <= b) ? a : b)

struct INTERVAL //区间
{
float left;
float right;
};

struct RECT //矩形
{
float left;
float right;
float top;
float bottom;
};

bool interval_intersect(INTERVAL t1, INTERVAL t2, INTERVAL &t3) //求区间t1和t2的交(一维)
{
if (t1.right < t2.left || t1.left > t2.right)
return false;
else
{
t3.left = MAX(t1.left, t2.left);
t3.right = MIN(t1.right, t2.right);
return true;
}
}

bool rect_intersect(RECT r1, RECT r2, RECT &r3) //矩形求交(二维)
{
INTERVAL t1, t2, t3, t4, t5, t6;

t1.left = r1.left;
t1.right = r1.right;
t2.left = r2.left;
t2.right = r2.right;
t4.left = r1.top;
t4.right = r1.bottom;
t5.left = r2.top;
t5.right = r2.bottom;
if (interval_intersect(t1, t2, t3) && interval_intersect(t4, t5, t6))
{
r3.left = t3.left;
r3.right = t3.right;
r3.top = t6.left;
r3.bottom = t6.right;
return true;
}
return false;
}

求矩形的交就是区间求交的二维情况,求立方体的交是三维情况,都可以简化为一维情况。
bffeey 2008-09-20
  • 打赏
  • 举报
回复
画个(x1,y1),(x2,y2)的红色矩形

再画N个绿色矩形

然后遍历(x1,y1),(x2,y2)矩形的每个像素点

mathe 2008-09-20
  • 打赏
  • 举报
回复
上面提到的算法基本需要O(N^3)的时间复杂度,不够好。

我们可以检查每个矩形,它落在大矩形内部的边界是不是均被其它矩形覆盖(如果同一个分布在这条边异测的矩形在这条边重合,算覆盖)。
如果是,那么整个大矩形被完全覆盖(唯一的例外是所有小矩形和大矩形不相交)。
上面的思想非常容易用O(N^2)的算法实现。而如果我们事先将所有矩形分别按各边的横众坐标值排序,可能还可以改善算法
  • 打赏
  • 举报
回复
想错了,重复标记状态,是要O(n^3)
  • 打赏
  • 举报
回复
mathe说的“检查每个矩形,它落在大矩形内部的边界是不是均被其它矩形覆盖”很有新意。

另外我前面提的算法O(n^2)就可以实现啊,只是要开辟一个n^2大小的空间来记录网格被覆盖的状态。

nandizhu 2008-09-19
  • 打赏
  • 举报
回复
貌似没弄懂
  • 打赏
  • 举报
回复
假设有n个小矩形,每个小矩形表示为(L[i],T[i])—(R[i],B[i]),1<=i<=n
将所有小矩形的x边界(即L和R)排序得到一个序列:
P1<=P2<=...<=x1<=...<=Pi<=...<=x2<=...<=Pn
同样对小矩形的y边界(T和R)排序也可以得到一个序列:
Q1<=Q2<=...<=y1<=...<=Qi<=...<=y2<=...<=Qn

这就好比拉起了一张大网,大矩形(x1,y1)-(x2,y2)被x=Pi、y=Qi(1<=i<=n)这样的直线分成了很多网格.
每个小矩形都是由若干个相邻的网格拼成的。

下一步就是要遍历所有的小矩形,检查(x1,y1)-(x2,y2)范围内的每个网格是否都被覆盖到了。

medie2005 2008-09-19
  • 打赏
  • 举报
回复
呵呵,叫我干什么啊?
mostovoi1234 2008-09-19
  • 打赏
  • 举报
回复
在平面上有n(n> 3)个点,设其中任意三点被包含在单位圆里,证明:n个点也被包含在单位圆里。
jieao111 2008-09-19
  • 打赏
  • 举报
回复
阿诺快来!mm再次出现

33,010

社区成员

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

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