矩形相交的快速算法

xxfyath 2006-08-08 11:39:02

typedef struct MAPINFO_ENTITYORDER
{
char szAttrib[50]; //实体为文本时,是文本内容,否则是属性值
RECT entyrect; //实体大小
int nID; //实点编号
int ncnt; //在JDT文件的具体位置
}MAPENTITY;

typedef CTypedPtrList<CPtrList, MAPENTITY*> CEntSearchList;
CEntSearchList m_entIndex ;
MAPENTITY成员中的矩形entyrect大小所属的范围都在m_rectMap内,其中m_rectMap已知。

作一个队列m_entIndex,添加MAPENTITY成员,现在有个指定的矩形m_rectChs,与m_rectMap有相交 ;
现在要求能快速判断m_rectMap矩形内的所有矩形entyrect哪些与m_rectChs有相交。

要求作个算法,如何在添加MAPENTITY入队时按entyrect作一定的排序(如何排序是关键),使能
快速判断哪些矩形与m_rectChs相交。

顺序遍历可行,但速度最慢,队列中的每一个都要与m_rectChs比较,时间上没有节省。

能否作个算法,先以入队的矩形作个排序,比较到一定位置时,若无相交了,则后面就无需再作比较了,
这样就可节省时间。这种算法要求最坏的比较是全部(每一个都比较),最好是比较一个或几个。
[主要是队列中的内容比较多,另外还要与其它几个队列中的内容比较,有没有与m_rectChs相交,所以要作个算法]

本人想过把每个成员中的entyrect的topleft与m_rectMap的topleft的距离大小进行排序,再得到m_rectChs与
m_rectMap的相交矩形m_rectInter,但这样的排序后,与m_rectInter比较,无法判断到哪种状态后,
矩形entyrect就一定在矩形m_rectInter的外面,并且此矩形entyrect后面的一定也在m_rectInter外面。

提供算法思路的都有分,能提供代码最好。xxf_yath@163.com
...全文
558 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
梧桐168 2006-08-09
  • 打赏
  • 举报
回复
R不过RTree比较复杂,简单一点的用四叉树也可以
RTree是动态的数据结构,而四叉树是静态的
梧桐168 2006-08-09
  • 打赏
  • 举报
回复
你说得问题正是RTree的经典运用,也就是那本书里讲的窗口选择
xxfyath 2006-08-09
  • 打赏
  • 举报
回复
因为考虑到地图的加密,不想让其它人得到后再重新利用,所以把mapinfo做的地图通过转化,以自定义的格式,将每个地图内容写入文件中,载入时,通过选择的地图,再从文件中取,载入内存。若选择的地图多时,载入内存就多了,现想做的是通过选择区域大小(m_rectChs)来判断图层中哪些实体在范围内,再载入内存(选择地图时,不载入实体,待放大时,才载入实体,缩小后释放),每个实体都属于一定的范围(现把每个实体各自有个所属矩形范围entyrect,如:一条线,由点组成,全部的点在entyrect内),所以在选择要载入实体时,能过行快速筛选。

IT_Fly() ,你说的GIS中的RTree在我这种情况下能用吗?RTree这个我没用过。
MITSMI 2006-08-09
  • 打赏
  • 举报
回复
也就是将需要进行比较的矩形集合分解成各个不相交但是包含的矩形.如果矩形A与矩形B相交,则将矩形B分成A内的矩形部分和A外的矩形部分,分别构成小的矩形后进行。
MITSMI 2006-08-09
  • 打赏
  • 举报
回复
你的抽象表达不是很好,看得有点吃力,不过基本上看明白了你的问题

源代码没有,以前有过
这种问题在图形学里面是一个很常见的问题
基本的解决思路是将各个矩形构造成一棵树,从上往下遍历比较,这样可以将复杂度从O(n)降为O(log(n))
梧桐168 2006-08-09
  • 打赏
  • 举报
回复
建议你看看http://www.china-pub.com/computers/common/info.asp?id=27655
这本书,里有一章专门讲这个问题
梧桐168 2006-08-09
  • 打赏
  • 举报
回复
GIS中的RTree专门解决这种问题
yjukh 2006-08-08
  • 打赏
  • 举报
回复
我这有一本书叫《矢量图形系统开发与编程》,在第332页有讲
上面有各种图形相交的情况的算法,包括不规则多边形的都有
ayqlj 2006-08-08
  • 打赏
  • 举报
回复
帮你顶顶

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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