八叉树(C++实现)

八叉树这块的代码,在别人的基础上,把有问题的地方稍作改动,以及不懂得地方多加了注释,当作以后的学习资料。

#include <iostream> 
using namespace std;
//定义八叉树节点类  
template<class T>
struct OctreeNode
{
   
	T data; //节点数据  
	T xmin, xmax; //节点坐标,即六面体个顶点的坐标  
	T ymin, ymax;
	T zmin, zmax;
	OctreeNode <T>*top_left_front, *top_left_back; //该节点的个子结点  
	OctreeNode <T>*top_right_front, *top_right_back;
	OctreeNode <T>*bottom_left_front, *bottom_left_back;
	OctreeNode <T>*bottom_right_front, *bottom_right_back;
	OctreeNode //节点类  
	(T nodeValue = T(),
		T xminValue = T(), T xmaxValue = T(),
		T yminValue = T(), T ymaxValue = T(),
		T zminValue = T(), T zmaxValue = T(),
		OctreeNode<T>*top_left_front_Node = NULL,
		OctreeNode<T>*top_left_back_Node = NULL,
		OctreeNode<T>*top_right_front_Node = NULL,
		OctreeNode<T>*top_right_back_Node = NULL,
		OctreeNode<T>*bottom_left_front_Node = NULL,
		OctreeNode<T>*bottom_left_back_Node = NULL,
		OctreeNode<T>*bottom_right_front_Node = NULL,
		OctreeNode<T>*bottom_right_back_Node = NULL)
		:data(nodeValue),
		xmin(xminValue), xmax(xmaxValue),
		ymin(yminValue), ymax(ymaxValue),
		zmin(zminValue), zmax(zmaxValue),
		top_left_front(top_left_front_Node),
		top_left_back(top_left_back_Node),
		top_right_front(top_right_front_Node),
		top_right_back(top_right_back_Node),
		bottom_left_front(bottom_left_front_Node),
		bottom_left_back(bottom_left_back_Node),
		bottom_right_front(bottom_right_front_Node),
		bottom_right_back(bottom_right_back_Node) {
   }
};
//创建八叉树  
template <class T>
void createOctree(OctreeNode<T> * &root, int maxdepth, double xmin, double xmax, double ymin, double ymax, double zmin, double zmax)
{
   
	//cout<<"处理中,请稍候……"<<endl;  
	maxdepth = maxdepth - 1; //每递归一次就将最大递归深度-1  
	if (maxdepth >= 0)
	{
   
		root = new OctreeNode<T>();
		cout << "请输入节点值:";
		//root->data =9;//为节点赋值,可以存储节点信息,如物体可见性。由于是简单实现八叉树功能,简单赋值为9。  
		cin >> root->data;  //为节点赋值  
		root->xmin = xmin; //为节点坐标赋值  
		root->xmax = xmax;
		root->ymin = ymin;
		root->ymax = ymax;
		root->zmin = zmin;
		root->zmax = zmax;
		double xm = (xmax - xmin) / 2;//计算节点个维度上的半边长  
		double ym = (ymax - ymin) / 2;
		double zm = (ymax - ymin) / 2;
		//递归创建子树,根据每一个节点所处(是几号节点)的位置决定其子结点的坐标。  
		createOctree(root->top_left_front, maxdepth, xmin, xmax - xm, ymax - ym, ymax, zmax - zm, zmax);
		createOctree(root->top_left_back, maxdepth, xmin, xmax - xm, ymin, ymax - ym, zmax - zm, zmax);
		createOctree(root->top_right_front, maxdepth, xmax - xm, xmax, ymax -<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值