树(简单应用-四叉树)课件.pptVIP

  1. 1、本文档共27页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
树(简单应用-四叉树)课件

树的简单应用;问题提出;问题;四叉树;可分解成为各自的区块 每一个区块可持续分解直到资料无法分解为止 树状数据结构依造四叉树法加以区分 如下图;;在游戏中应用四叉树;下面我们采用四叉树来解决前面所提到的问题。 在使用四叉树之前,一种方法是事先在内存中把四叉树建好,其创建的原则是屏幕区域按照坐标系划分成四个象限。 然后对每个象限在做递归的划分。 如下图 ;;使绕褒抢偷猜郴授暗栋泼怕曾僵窜戴雹厨刹唉琢柱烟擅城乔啡思透茅饰公树(简单应用-四叉树)课件树(简单应用-四叉树)课件;当递归到足够的层次,建树的过程就完成了。 当四叉树建立好了后,就可以将屏幕上的小球划归到对应的结点中。 如果建树的层次恰当,那么每个叶子结点所包含的小球树相对较少,一般2~5个。 一般是在同一个叶子节点中的小球才能发生碰撞,而每个叶子节点检查是相对较快,如果按平均2个小球算,一个叶节点就只需要2x2 =4 次,假设树有5层,那么总共会有1024个节点,那么检查碰撞的次数是 1024 x 4 = 4096,比前面的1000000次检测要少很多。 当然四叉树还有其它的消耗,比如,小球移动,就涉及到小球需要重新划归到某个叶子节点的操作,但是其总体效率还是比循环检查要高出许多。 ;创建四叉树;struct TreeNode { vectorCSprite * listSprites;//存储Item TreeNode *pChildren[4]; bool hasChildren; RECT rect; };;下面考虑定义CQuadTree类来管理四叉树。 CQuadTree要实现的功能,不外乎是: 创建树 增加Item 删除Item 更新树 检测碰撞 所以CQuadTree类可以定义如下: ;class CQuadTree { public: CQuadTree(void); public: ~CQuadTree(void); public: void CreateTree(TreeNode *pRoot,RECT rect); bool AddItem(TreeNode *pNode,CSprite *pSprite); bool RemoveItem(TreeNode *pNode,CSprite *pSprite); int CollisionDetection(); int Update(); ;private: int nLevel; //当前层 const int nLevels; //总计多少层 RECT rect; //顶层矩形范围 TreeNode *pRoot; //根结点 int nCount; //记录碰撞的小球数目 listTreeNode* listLeaves; //记录所有的叶子节点 vectorCSprite* vecSprites; //记录所有精灵 }; ;创建树;void CQuadTree::CreateTree(TreeNode * pRoot,RECT rect) { if (pRoot == NULL) { return; } this-pRoot = pRoot; nLevel = 1; nCount = 0; 定义队列 q; 将根节点入对 while(q非空) { TreeNode *pParent = 队头节点; 依次为pParent创建4个子节点 为每个子结点设置好它们各成员(特别是rect) 将每个子结点入队列 nCount += 4; if (nCount = 该层的结点数) { nLevel ++; nCount = 0; } pParent-hasChildren = true; } } ;增加Item;bool CQuadTree::AddItem(TreeNode *pNode,CSprite *pSprite) { if (pSprite 在这个结点所持有的矩形范围里) { if (是叶子结点) { 将Item添加到该结点的数据数组中 return true; } else { ; //递归查询四个子结点是否可以添加该Item for(int i=0;i4;i++) { if (子结点添加Item成功) { return true; } } } } return false; } ;删除Item;更新树;int CQuadTree::Update() { 用于存储小球的容器vecSprites清零 循环遍历所有叶子节点 { 将每个叶子结点的Item放入vec

文档评论(0)

dmdt5055 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档