成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

數(shù)據(jù)結(jié)構(gòu)與算法--四叉樹(shù)(javascript實(shí)現(xiàn))

xbynet / 1998人閱讀

摘要:最近想要研究研究地形的渲染,然后就想起了四叉樹(shù),在網(wǎng)上看了一篇相關(guān)的文章,準(zhǔn)備拿實(shí)現(xiàn)一下備用。四叉樹(shù)的定義是它的每個(gè)節(jié)點(diǎn)下至多可以有四個(gè)子節(jié)點(diǎn),通常把一部分二維空間細(xì)分為四個(gè)象限或區(qū)域并把該區(qū)域里的相關(guān)信息存入到四叉樹(shù)節(jié)點(diǎn)中。

   最近想要研究研究webgl地形的渲染,然后就想起了四叉樹(shù),在網(wǎng)上看了一篇相關(guān)的文章,準(zhǔn)備拿javascript實(shí)現(xiàn)一下備用。

四叉樹(shù)原理
(這部分就直接抄了,見(jiàn)參考)四叉樹(shù)(Q-Tree)是一種樹(shù)形數(shù)據(jù)結(jié)構(gòu)。四叉樹(shù)的定義是:它的每個(gè)節(jié)點(diǎn)下至多可以有四個(gè)子節(jié)點(diǎn),通常把一部分二維空間細(xì)分為四個(gè)象限或區(qū)域并把該區(qū)域里的相關(guān)信息存入到四叉樹(shù)節(jié)點(diǎn)中。這個(gè)區(qū)域可以是正方形、矩形或是任意形狀。以下為四叉樹(shù)的二維空間結(jié)構(gòu)(左)和存儲(chǔ)結(jié)構(gòu)(右)示意圖(注意節(jié)點(diǎn)顏色與網(wǎng)格邊框顏色):

四叉樹(shù)的每一個(gè)節(jié)點(diǎn)代表一個(gè)矩形區(qū)域(如上圖黑色的根節(jié)點(diǎn)代表最外圍黑色邊框的矩形區(qū)域),每一個(gè)矩形區(qū)域又可劃分為四個(gè)小矩形區(qū)域,這四個(gè)小矩形區(qū)域作為四個(gè)子節(jié)點(diǎn)所代表的矩形區(qū)域。

數(shù)據(jù)結(jié)構(gòu)

var QuadRect = function(left,top,right,bottom){
        this.left = left;
        this.top = top;
        this.right = right;
        this.bottom = bottom;
    };

    var QuadNode = function(){
        this.rect = null;           //所表示的矩形區(qū)域
        this.data = null;           //相關(guān)數(shù)據(jù)
        this.childs = null;         //四個(gè)子節(jié)點(diǎn),沒(méi)有就是null
    };

    var QuadTree = function(){
        this.root = new QuadNode();     //根節(jié)點(diǎn)
        this.depth = 0;                 //數(shù)的深度
    };

樹(shù)的構(gòu)建

    var g_tree = new QuadTree();

    /**
     * [quadTreeBuild 構(gòu)建四叉樹(shù)]
     * @param  {[number]} depth [輸?shù)纳疃萞
     * @param  {[QuadRect]} rect  [數(shù)表示的矩形區(qū)域]
     */
    function quadTreeBuild(depth, rect){
        g_tree.depth = depth;

        quadCreateBranch(g_tree.root, depth, rect);
    }

    /**
     * [quadCreateBranch 遞歸方式創(chuàng)建給定節(jié)點(diǎn)的子節(jié)點(diǎn)]
     * @param  {[QuadNode]} node  [需要?jiǎng)?chuàng)建子節(jié)點(diǎn)的節(jié)點(diǎn)]
     * @param  {[type]} depth [description]
     * @param  {[type]} rect  [description]
     * @return {[type]}       [description]
     */
    function quadCreateBranch(node, depth, rect){
        if (depth !== 1) {
            node.rect = rect;
            node.childs = [new QuadNode(),new QuadNode(),new QuadNode(),new QuadNode()];

            childsRect = rectSubdivide(rect);

            quadCreateBranch(node.childs[0], depth - 1, childsRect[0]);
            quadCreateBranch(node.childs[1], depth - 1, childsRect[1]);
            quadCreateBranch(node.childs[2], depth - 1, childsRect[2]);
            quadCreateBranch(node.childs[3], depth - 1, childsRect[3]);
        }
    }

    /**
     * [rectSubdivide 給定一個(gè)矩形區(qū)域?qū)⑺譃樗膫€(gè)象限]
     * @param  {[type]} rect [description]
     * @return {[type]}      [description]
     */
    function rectSubdivide(rect){
        var firstRect = new QuadRect(
            (rect.left + rect.right)/2, rect.top, rect.right, (rect.top+rect.bottom)/2
        );
        var secondRect = new QuadRect(
            rect.left, rect.top, (rect.left + rect.right)/2, (rect.top+rect.bottom)/2
        );
        var thirdRect = new QuadRect(
            rect.left, (rect.top+rect.bottom)/2, (rect.left + rect.right)/2, rect.bottom
        );
        var fourthRect = new QuadRect(
            (rect.left + rect.right)/2, (rect.top+rect.bottom)/2, rect.right, rect.bottom
        );

        return [firstRect,secondRect,thirdRect,fourthRect];
    }



    var rect = new QuadRect(0,10,10,0);
    var depth = 5;

    quadTreeBuild(depth,rect);

    console.log("ok.");

用四叉樹(shù)查找某一對(duì)象
未完待續(xù)......

參考
- 四叉樹(shù)與八叉樹(shù)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/87530.html

相關(guān)文章

  • d3-force 力導(dǎo)圖 源碼解讀原理分析【二 : 叉樹(shù)(一)】

    摘要:我們?cè)谏衔脑创a解析發(fā)現(xiàn)版的節(jié)點(diǎn)碰撞采用四叉樹(shù)進(jìn)行了優(yōu)化。那么版本的力導(dǎo)圖具體和版的有何不同點(diǎn)呢,四叉樹(shù)又如何優(yōu)化碰撞校驗(yàn)的呢原文鏈接被重命名為。性能的提高歸功于的新的四叉樹(shù)。 我們?cè)谏衔脑创a解析發(fā)現(xiàn)v4版的節(jié)點(diǎn)碰撞采用四叉樹(shù)進(jìn)行了優(yōu)化。那么V4版本的力導(dǎo)圖具體和v3版的有何不同點(diǎn)呢,四叉樹(shù)又如何優(yōu)化碰撞校驗(yàn)的呢? v3-force VS v4-force https://github...

    pepperwang 評(píng)論0 收藏0
  • 高仿 ios 相冊(cè)地圖功能

    摘要:本篇文章已授權(quán)微信公眾號(hào)郭霖獨(dú)家發(fā)布老規(guī)矩先上圖最近沒(méi)有什么時(shí)間,后面項(xiàng)目再補(bǔ)上詳細(xì)說(shuō)明百度地圖新增點(diǎn)聚合功能。百度地圖是把整個(gè)地球是按照一個(gè)平面來(lái)展開(kāi),并且通過(guò)墨卡托投影投射到坐標(biāo)軸上面。上圖很明顯墨卡托投影把整張世界地圖投影成。 本篇文章已授權(quán)微信公眾號(hào) guolin_blog (郭霖)獨(dú)家發(fā)布 老規(guī)矩先上圖最近 沒(méi)有什么時(shí)間,后面項(xiàng)目再補(bǔ)上詳細(xì)說(shuō)明 showImg(https:/...

    pakolagij 評(píng)論0 收藏0
  • 下一代的 3D Tiles 前瞻

    摘要:在中,引入一些元數(shù)據(jù)方面的擴(kuò)展項(xiàng)。不同層級(jí)的元數(shù)據(jù)像素級(jí)別樣式化渲染不同層級(jí)的元數(shù)據(jù)像素級(jí)別樣式化渲染配合使用和兩個(gè)擴(kuò)展項(xiàng),下一代的可以在各個(gè)層級(jí)存儲(chǔ)元數(shù)據(jù)。例如,水泥地和草地的摩擦系數(shù)可以作為元數(shù)據(jù),影響車(chē)輛的行駛速度等。下一代的 3D Tiles 前瞻原文:Introducing 3D Tiles Next, Streaming Geospatial to the Metaverse原文...

    魏明 評(píng)論0 收藏0
  • JavaScript 數(shù)據(jù)結(jié)構(gòu)算法之美 - 非線(xiàn)性表中的樹(shù)、堆是干嘛用的 ?其數(shù)據(jù)結(jié)構(gòu)是怎樣的 ?

    摘要:筆者寫(xiě)的數(shù)據(jù)結(jié)構(gòu)與算法之美系列用的語(yǔ)言是,旨在入門(mén)數(shù)據(jù)結(jié)構(gòu)與算法和方便以后復(fù)習(xí)。非線(xiàn)性表中的樹(shù)堆是干嘛用的其數(shù)據(jù)結(jié)構(gòu)是怎樣的希望大家?guī)е@兩個(gè)問(wèn)題閱讀下文。其中,前中后序,表示的是節(jié)點(diǎn)與它的左右子樹(shù)節(jié)點(diǎn)遍歷訪(fǎng)問(wèn)的先后順序。 showImg(https://segmentfault.com/img/bVbuvnj?w=900&h=250); 1. 前言 想學(xué)好前端,先練好內(nèi)功,內(nèi)功不行,...

    singerye 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<