美文网首页
四叉树优化

四叉树优化

作者: mx乐乐 | 来源:发表于2017-01-09 09:29 被阅读72次

在上一篇文章中我们已经知道四叉树的使用方法了,但同时我们也注意到一个问题:由于屏幕的物体是运行的,前一秒在象限一的物体可能下一秒就跑到象限二了,所以每一帧都需要重新初始化四叉树。这意味着,每16ms就要初始化一次四叉树,这个代价太大了:

var run = function run() {
    // 重新向四叉树中插入所有物体,重新初始化四叉树
    // ...
    // 筛选物体集合并进行碰撞检测
    // ...
};

我们想想,是不是有这样做的必要?实际上,只是部分物体从一个象限跑到另一个象限,而其他物体都是保持在原先象限中,所以我们只需要重新插入这部分物体即可,从而避免了对所有物体进行插入操作。

我们为四叉树增添这部分的功能,其名为动态更新:

// 判断矩形是否在象限范围内
function isInner(rect, bounds) {
    return rect.x >= bounds.x &&
        rect.x + width <= bounds.x + bounds.width &&
        rect.y >= bounds.y &&
        rect.y + rect.height <= bounds.y + bounds.height;
}
/*
  动态更新:
    从根节点深入四叉树,检查四叉树各个节点存储的物体是否依旧属于该节点(象限)的范围之内,如果不属于,则重新插入该物体。
*/
QuadTree.prototype.refresh = function(root) {
    var objs = this.objects,
        rect, index, i, len;

    root = root || this;

    for (i = objs.length - 1; i >= 0; i--) {
        rect = objs[i];
        index = this.getIndex(rect);

        // 如果矩形不属于该象限,则将该矩形重新插入
        if (!isInner(rect, this.bounds)) {
            if (this !== root) {
                root.insert(objs.splice(i, 1)[0]);
            }

        // 如果矩形属于该象限 且 该象限具有子象限,则
        // 将该矩形安插到子象限中
        } else if (this.nodes.length) {
            this.nodes[index].insert(objs.splice(i, 1)[0]);
        }
    }

    // 递归刷新子象限
    for (i = 0, len = this.nodes.length; i < len; i++) {
        this.nodes[i].refresh(root);
    }
}; 

现在有了动态更新功能,每一帧中只需要对该四叉树进行动态更新即可:

var run = function run() {
    // 动态更新
    tree.refresh();

    // 筛选物体集合并进行碰撞检测
    // ...

};

相关文章

  • 四叉树优化

    在上一篇文章中我们已经知道四叉树的使用方法了,但同时我们也注意到一个问题:由于屏幕的物体是运行的,前一秒在象限一的...

  • 游戏算法(2):查找优化之四叉树的应用

    本文主要介绍四叉树的应用场景和实现。 本文链接游戏算法(2):查找优化之四叉树的应用[https://www.ji...

  • InnoDB 索引

    链表 -> 二叉查找树 -> 平衡二叉树 -> B树 -> B+树 链表:层级等于链表长度二叉查找树:链表优化,...

  • 14-树&二叉树&真二叉树&满二叉树

    一、树 二、二叉树 三、真二叉树 四、满二叉树

  • 数据结构-平衡二叉树

    定义 平衡二叉树,是对二叉搜索树的一种优化。 向二叉搜索树中插入元素时,不同的插入次序,将构造出不同结构的树。通俗...

  • 12-平衡二叉树

    平衡二叉树 平衡二叉树就是对二叉查找树的优化升级,它要求每个节点的左右子树的高度相差不大于1 1.平衡二叉树的查找...

  • 二叉树、2-3 树、红黑树

    二叉树、2-3 树、红黑树一、满二叉树二、完全二叉树三、二叉查找树四、平衡二叉树4.1 插入原理4.2 旋转问题4...

  • 四、树与二叉树

    四、树与二叉树 1. 二叉树的顺序存储结构 二叉树的顺序存储就是用数组存储二叉树。二叉树的每个结点在顺序存储中都有...

  • 四叉搜索树引言

    四叉搜索树简称四叉树,是采用分块的思想将待分割区域分成四个区域,直到每个区域内只有一个值为止。因此,四叉...

  • 第十六讲 数据结构之二叉树(四)

    霍夫曼树 霍夫曼树是二叉树的一种特殊形式,又称为最优二叉树,其主要作用在于数据压缩和编码长度的优化。 重要概念 路...

网友评论

      本文标题:四叉树优化

      本文链接:https://www.haomeiwen.com/subject/cdicbttx.html