- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
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(
您可能关注的文档
- 85°C 营销模式.doc
- 8A第二单元测试8第二单元测试.doc
- 8B unit2教案.doc
- 8S的定义与目的8的定义与目的.doc
- 8BUnit 2综检测8BUnit 2综合检测.doc
- 8《虎门销烟》教案.doc
- 8儿童精神发育迟滞.doc
- 8一分公司及项目检表查表.doc
- 8s管理法简介8s理法简介.doc
- 8人力资源管理程序STS.doc
- 【可行性报告】2023年镇流器相关项目可行性研究报告.docx
- 【可行性报告】2023年年智能交通行业项目可行性分析报告.docx
- 【可行性报告】2023年胶塞项目可行性研究分析报告.docx
- 2023年期货从业资格之期货基础知识通关测试卷和答案.docx
- 【可行性报告】2023年邮政服务相关行业可行性分析报告.docx
- 【可行性报告】2023年磁过滤器相关项目可行性研究报告.docx
- 【可行性报告】2023年新型肥料相关项目可行性研究报告.docx
- 【可行性报告】2023年表面活性剂相关行业可行性分析报告.docx
- 【可行性报告】2023年高速内圆磨床相关项目可行性研究报告.docx
- 【可行性报告】2023年酒精项目可行性研究分析报告.docx
1亿VIP精品文档
相关文档
最近下载
- 管理科学与工程专业历年试题.doc
- 某镇国家综合农业开发高标准农田建设项目申请报告.doc
- 运筹学课件--运筹学完整课件.ppt
- NY∕T 391-2021 绿色食品 产地环境质量.pdf
- 超星尔雅学习通《劳动通论》章节测试答案.pdf VIP
- 区间闭塞设备维护 课件 2任务四 ZPW-2000A移频自动闭塞电路图识读 接收电路.ppt
- 区间闭塞设备维护 课件 3.1.1区间ZPW-2000型轨道电路认知 3接收器.ppt
- 区间闭塞设备维护 课件 2任务四 ZPW-2000A移频自动闭塞电路图识读 一般闭塞分区编码和点灯电路.ppt
- ZPW2000A故障处理.doc
- 区间闭塞设备维护 课件 2任务四 ZPW-2000A移频自动闭塞电路图识读 闭塞分区电路.ppt
文档评论(0)