八叉树算法的改进

原创 2013年12月06日 10:39:17
1、八叉树的定义(熟悉的直接跳到第二步)
 
你有一个立方体,按照如下方法给它三刀:

横切一刀,竖劈一刀,在与之前竖劈方向垂直的方向再砍一刀,这样就分成八个大小相同的立方体;

对小立方体重复砍劈。。。。。

2、分析
(1) 
构建规则的八叉树 
如果构建规则的八叉树 ,则结构所占的空间将非常大,而且很多情况下这些结构都是无用的;
常规构建方法:
struct OctTreeNode{
    LHLONG tag;//对于叶节点,为统计的颜色数;对于非叶节点,恒为-1。
    struct OctTreeNode *pChild[8];//下一级节点
};

 //创建八叉树
int depth = 6; 
OctTreeNode *pRootNode = NULL;
m_depth = depth;
m_nodeNum = 1;
for(LHINT i=1; i<=m_depth; i++){
    m_nodeNum += (1 << ((i << 2) - i));
}

pRootNode = (OctTreeNode *)LHMalloc((m_nodeNum << 5) + (m_nodeNum << 2));//OctTreeNode的大小为36字节,分解为32(2的5次方)+ 4(2的平方)
if(pRootNode == NULL){
    goto initialize_octTree_fail;
}
memset(pRootNode, 0, sizeof(OctTreeNode));
pRootNode->tag = -1;
ret = createOctTree(1, pRootNode);


//递归函数
int createOctTree(int  depth, OctTreeNode *pParent){

    static LHDWORD _nodeIndex = 1;
    if(depth < (m_depth)){
        for(int  i=0; i<8; i++){
            pParent->pChild[i] = &pRootNode[_nodeIndex];
            memset(pParent->pChild[i], 0, sizeof(OctTreeNode));
            pParent->pChild[i]->tag = -1;

            _nodeIndex ++;
            createOctTree(depth + 1, pParent->pChild[i]);
        }
    }else{
        for(int  i=0; i<8; i++){
            pParent->pChild[i] = &pRootNode[_nodeIndex];
            memset(pParent->pChild[i], 0, sizeof(OctTreeNode));

            _nodeIndex ++;
        }
        if(_nodeIndex >= m_nodeNum){
            _nodeIndex = 1;
        }
    }
    return 0;
} 

(2) 运行上面的程序,你将会发现你的内存狂涨!!!
解决办法:优化。
只使用叶节点,其余的都丢弃!
struct _node{
DWORD num;
};

void Test()
{
DWORD r = 0;
DWORD g = 0;
DWORD b = 0;
DWORD ret = 0;

DWORD size = 400000;
_node *pList = (_node *)malloc(size * sizeof(_node));//这个就是简化之后的八叉树!!!
memset(pList, 0, size * sizeof(_node));

FILE *fd = fopen("data.dat", "wb");
char info[128] = {0};

BYTE depth = 6;
for(r=0; r<256; r++){
for(g=0; g<256; g++){
for(b=0; b<256; b++){
ret = (((r >> (8 - depth)) << (depth << 1)) | ((g >> (8 - depth)) << depth) | (b >> (8 - depth)));
pList[ret].num ++;
}
}
}

for(DWORD i=0; i<size; i++){
if(pList[i].num != 0){
sprintf(info, "%08lu      %lu\n", i, pList[i]);
fwrite(info, 1, strlen(info), fd);
}else{
break;
}
}

fclose(fd);
free(pList);
}  
记录的文件如下:
00000000      64
00000001      64
00000002      64
00000003      64
00000004      64
00000005      64
00000006      64
00000007      64
00000008      64
00000009      64
00000010      64
00000011      64
00000012      64
。。。。 
 
。。。。 
00130949      64
00130950      64
00130951      64
00130952      64
00130953      64
00130954      64
00130955      64
00130956      64
00130957      64
00130958      64
00130959      64 
。。。。  
。。。。 
 
00262131      64
00262132      64
00262133      64
00262134      64
00262135      64
00262136      64
00262137      64
00262138      64
00262139      64
00262140      64
00262141      64
00262142      64
00262143      64
设置的是六级的深度,一共是262144条数据,占用内存为1M!而
构建规则的六级深度的八叉树,一共有299592个节点(不算根节点,只算子节点和叶节点),按照每个叶节点占用32字节,结构内存将达到9.142822265625M,难以接受!
 
至于查找、修改等操作,上面的代码演示的很清楚了。

八叉树算法

Octree的定义是:若不为空树的话,树中任一节点的子节点恰好只会有八个,或 零个,也就是子节点不会有0与8以外的数目。那么,这要用来做什么?想象一个 立方体,我们最少可以切成多少个相同等分的小立...
  • damenhanter
  • damenhanter
  • 2013年10月20日 22:54
  • 1592

用于将真彩色图像降级为索引图像的八叉树算法

用于将真彩色图像降级为索引图像的八叉树算法    本文介绍的内容,是用八叉树法降级一个真彩色图像(BPP=16以上)。这也是某公司在今年校园招聘中的笔试中的最后一道题目。我参考了 Jeff Prosi...
  • Augusdi
  • Augusdi
  • 2014年07月01日 10:42
  • 1967

基于八叉树的拾取算法在游戏中的应用

时间: 2014-02-12 来源:论文在线   摘  要:八叉树结构在游戏的场景渲染中应用十分广泛,本文针对该结构大幅度优化运算效率的特点,将其作了适当改进,使...
  • pizi0475
  • pizi0475
  • 2015年04月16日 10:24
  • 1393

使用八叉树将真彩色颜色进行量化

使用八叉树将真彩色颜色进行量化 项目中有一个小模块要求找到一幅图的主色调,并求出主色调的比例,我想到了颜色量化的方法。 由于前几届师兄的论文中有提到使用八叉树进行颜色量化,所以我也就在...
  • yaopengpeng
  • yaopengpeng
  • 2013年04月27日 19:06
  • 670

八叉树 C++ 基础 源码

http://blog.csdn.net/pizi0475/article/details/6269060四叉树或四元树也被称为Q树(Q-Tree)。四叉树广泛应用于图像处理、空间数据索引、2D中的快...
  • yulinxx
  • yulinxx
  • 2017年06月20日 23:28
  • 1203

场景管理:八叉树算法C++实现

简单实现了场景管理八叉树算法 代码结构: object.h,object.cpp 被管理的对象类octree_node.h,octree_node.cpp 八叉树类main.cpp程序入口...
  • u012234115
  • u012234115
  • 2015年07月30日 21:06
  • 2941

基于八叉树的区域增长点云分割算法

提出的问题 相关工作 提出的方案 粗分割 细化 达到的效果 认为的优点 可能的改进 提出的问题 激光雷达探测到城市环境的物体表面构成三维几何点,相应的点云分割技术常用于建筑物重建。由于建筑物的复...
  • cjx2lxj
  • cjx2lxj
  • 2016年01月16日 20:41
  • 5433

八叉树场景管理

八叉树场景管理上面是我绘制的一张图。        关于八叉树场景管理器主要需要关注两个类,其一是松散八叉树的数据结构Ogre::Octree,其二是八叉树场景管理器Ogre::OctreeScene...
  • Augusdi
  • Augusdi
  • 2014年07月01日 10:20
  • 1956

八叉树Octree

维基释义:八叉树(Octree)是一种用于描述三维空间的树状数据结构。八叉树的每个节点表示一个正方体的体积元素,每个节点有八个子节点,这八个子节点所表示的体积元素加在一起就等于父节点的体积。一般中心点...
  • Augusdi
  • Augusdi
  • 2014年06月30日 16:41
  • 12778

KNN及其改进算法的python实现

一、 马氏距离 我们熟悉的欧氏距离虽然很有用,但也有明显的缺点。它将样品的不同属性(即各指标或各变量)之间的差别等同看待,这一点有时不能满足实际要求。例如,在教育研究中,经常遇到对人的分析和判别,个...
  • HUSTLX
  • HUSTLX
  • 2016年03月10日 21:07
  • 1714
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:八叉树算法的改进
举报原因:
原因补充:

(最多只允许输入30个字)