最近利用OpenGL实现了一个简单的四叉树,对窗口进行分割。
数据结构:
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可以到我的资源里下载。