- 4
- 0
- 约6.44千字
- 约 8页
- 2017-01-09 发布于贵州
- 举报
BSP:
二叉分割树,是一种分割场景的方法,下面代码是BSP树一种实现可运行:
运行例子中,将定义的16个空间面,分割为一个深度是3的BSP树,上图显示的是运行结果:
#include stdafx.h
#include map
#include vector
#include iostream
using namespace std;
//定义空间的点结构
struct point
{
float x,y,z;
point():x(0.0f),y(0.0f),z(0.0f){};
point(float a,float b,float c):x(a),y(b),z(c){}
void operator += (int n)
{
x += n;
y += n;
z += n;
}
void operator = (point p)
{
memcpy(this,(void*)p,sizeof(*this));
}
};
//定义空间的面结构
struct face
{
point P[3];
void operator +=(int n)
{
P[0] += n;
P[1] += n;
P[2] += n;
}
};
//定义包围盒结构
struct BBox
{
point Min;
point Max;
BBox():Min(),Max(){}
};
enum EAxis
{//沿的轴枚举
Axis_X,
Axis_Y,
Axis_Z,
};
//树节点的定义
struct TreeNode
{
TreeNode():box(),nDepth(0),pLChild(NULL),pRChild(NULL),Axis(Axis_X),Split(0.0f){vFaceId.reserve(16);}
int nDepth;
TreeNode* pLChild;
TreeNode* pRChild;
std::vectorint vFaceId;
int Axis;
BBox box;
float Split;
};
//存储空间的面
std::mapint,face m_mFace;
//通过面ID获取面的地址
face* GetFaceByID(int nID)
{
std::mapint,face::iterator itr = m_mFace.find(nID);
if (itr != m_mFace.end() )
{
return (m_mFace[nID]);
}
return NULL;
}
//BSP类的定义实现
class BspTree
{
public:
BspTree():m_pRoot(NULL){};
~BspTree()
{
if (m_pRoot)
{
DeleteNode(m_pRoot);
}
}
//初始化树根
void InitTreeRoot(TreeNode *pNode);
//释放整个树的资源
void DeleteNode(TreeNode * pNode);
//生成AABB包围盒
void BuildAABB(TreeNode * pNode);
//切分整个空间
void SplitSpace(TreeNode* pRoot,int nAxis,int ndepth);
//切分面
void SplitFace( int nFaceId, float fSplit, int nAxis, int* pLeftNum, int* pRightNum, int* pBothNum );
//遍历整个树
void ErgodicTree(TreeNode * pNode);
protected:
private:
TreeNode *m_pRoot;
};
void BspTree::InitTreeRoot(TreeNode *pNode)
{
if (pNode == NULL)
return;
m_pRoot = pNode;
}
void BspTree::DeleteNode(TreeNode * pNode)
{
if (pNode == NULL)
return;
DeleteNode(pNode-pLChild);
DeleteNode(pNode-pRChild);
delete pNode;
}
//遍历整个树
void BspTree::ErgodicTree(TreeNode * pNode)
{
if (pNode == NULL)
return;
ErgodicTree(
您可能关注的文档
最近下载
- 一种新金色分枝杆菌重组表达载体及其应用.pdf VIP
- 社区护理学题库及答案.pdf VIP
- 奥迪展车日常检查表_新.doc VIP
- 2023年06月国家国防科技工业局核技术支持中心社会招考聘用笔试历年难、易错考点试题含答案解析.docx
- 互联网舆情监控系统用户手册.doc
- 2025 南平邵武福建贝莱特生物科技有限公司“3.28”一般闪爆事故调查报告-南政综(2025)37号.pdf VIP
- 最新房产测量规范.docx VIP
- 人教版初中物理八年级下册同步第8章《运动和力》【B试卷 专项试卷】(易错训练38题7大考点).docx VIP
- 新编剑桥商务英语(高级)学生用书(第三版修订版)达姆特教材习题答案笔记及workbook答案.pdf
- 党支部书记2025年度组织生活会在学习贯彻党的创新理论方面、加强党性锤炼方面、发挥先锋模范作用方面、发挥先锋模范作用方面、改作风树新风方面五个方面存在的问题及整改措施.docx VIP
原创力文档

文档评论(0)