四叉树原理

来源:互联网 发布:淘宝上买官换机信号差 编辑:程序博客网 时间:2024/06/05 22:42

最近利用OpenGL实现了一个简单的四叉树,对窗口进行分割。

数据结构:


  1. AreaType m_bounds;  rectContainer m_contents;     pointerType m_nodes[4];  

m_bounds是节点的矩形包围盒, m_nodes数组存储四个孩子的节点指针, m_contents存储那些不包含于四个孩子但是包含于当前节点的区域,也就是那些我们插入的区域(假设使用的是矩形)。

如下图:是一个节点的内容:

 

 

 

 

 

写成一般的树状图是:

 

 


算法描述:

插入一个矩形区域到四叉树中

1 将当前节点细分,添加四个孩子节点:

 

m_nodes[LUp] = new QuadTreeNode( TRectanglef(m_bounds.GetPos(),           Vec2f(halfWidth, halfHeight)) );  m_nodes[LDown] = new QuadTreeNode( TRectanglef(Vec2f(m_bounds.m_Left,           m_bounds.m_Top + halfHeight), Vec2f(halfWidth, halfHeight)) );  m_nodes[RUp] = new QuadTreeNode( TRectanglef(Vec2f(m_bounds.m_Left + halfWidth,           m_bounds.m_Top), Vec2f(halfWidth, halfHeight)) );  m_nodes[RDown] = new QuadTreeNode( TRectanglef(           Vec2f(m_bounds.m_Left + halfWidth,           m_bounds.m_Top + halfHeight), Vec2f(halfWidth, halfHeight)) );  


2 如果要插入的矩形属于区域某个孩子节点,则递归深入,继续细分该孩子节点。

3 直到该区域不属于任何孩子节点时候,直接存放到当前节点的content数组中。

 

查询一个矩形区域在四叉树中:

返回所有与该区域相交或者包含的区域,以一个vector的新式。

程序截图:

标左键拖出椭圆,区域同时将这些区域插入到四叉树中:

 

 

右键拖出一个白色框选择区域,进行查询:

查询结果为:

 

 

这里没法上传文件。具体demo可以到我的资源里下载。

原创粉丝点击