四元树又称四叉树是一种树状数据结构,在每一个节点上会有四个子区块。四元树常应用于二维空间数据的分析与分类。 它将数据区分成为四个象限。数据范围可以是方形或矩形或其他任意形状。
从定义我们可以看出重点信息:
树状结构
四个区块
分类
矩形
图示讲解
讲解之前需要先说明一下四叉树是用来做什么的,明白了原理才好理解它的行为。
使用四叉树就是使用分类的方法,减少碰撞节点的个数,只取出与给定碰撞体相同区域或者压在碰撞体所在区域边上的对象。
将游戏屏幕分为四个区域。
插入对象
插入的对象超过了我们设置的阈值时,划分
插入的对象再次超过了我们设置的阈值时,继续分。
分析
插入
从上面的图示我们可以很好理解四叉树的原理。涉及的都是插入操作。
那么插入操作具体都做了什么呢?
从代码中我们可以看出:
当插入第一个对象的时候只走了2;这个时候没有子树,所以不会走1,因为objects(管理的对象)的长度还没有超过我们设置的阈值MAX_OBJECTS,所以也不会走3。
一直插入,当objects中的数量,超过了我们设置的阈值MAX_OBJECT,就会开始划分,产生子树,有了nodes,划分之后将自己管理的节点插入到子树中。再此之前,都不会走1,因为还没有产生子树。
划分之后再次插入新对象,如果对象可以获得对应的象限,就会走1 不会走2和3,如果没有获得对应的象限才会走2,3(没有获得的情况可能是你创建的对象在屏幕外,游戏中很多情况是敌人从屏幕外走进屏幕的,具体可参考我做的《星际迷航》或者《星际战》游戏)。