摘要:最近想要研究研究地形的渲染,然后就想起了四叉樹,在網(wǎng)上看了一篇相關(guān)的文章,準備拿實現(xiàn)一下備用。四叉樹的定義是它的每個節(jié)點下至多可以有四個子節(jié)點,通常把一部分二維空間細分為四個象限或區(qū)域并把該區(qū)域里的相關(guān)信息存入到四叉樹節(jié)點中。
最近想要研究研究webgl地形的渲染,然后就想起了四叉樹,在網(wǎng)上看了一篇相關(guān)的文章,準備拿javascript實現(xiàn)一下備用。
四叉樹原理
(這部分就直接抄了,見參考)四叉樹(Q-Tree)是一種樹形數(shù)據(jù)結(jié)構(gòu)。四叉樹的定義是:它的每個節(jié)點下至多可以有四個子節(jié)點,通常把一部分二維空間細分為四個象限或區(qū)域并把該區(qū)域里的相關(guān)信息存入到四叉樹節(jié)點中。這個區(qū)域可以是正方形、矩形或是任意形狀。以下為四叉樹的二維空間結(jié)構(gòu)(左)和存儲結(jié)構(gòu)(右)示意圖(注意節(jié)點顏色與網(wǎng)格邊框顏色):
四叉樹的每一個節(jié)點代表一個矩形區(qū)域(如上圖黑色的根節(jié)點代表最外圍黑色邊框的矩形區(qū)域),每一個矩形區(qū)域又可劃分為四個小矩形區(qū)域,這四個小矩形區(qū)域作為四個子節(jié)點所代表的矩形區(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; //四個子節(jié)點,沒有就是null }; var QuadTree = function(){ this.root = new QuadNode(); //根節(jié)點 this.depth = 0; //數(shù)的深度 };
樹的構(gòu)建
var g_tree = new QuadTree(); /** * [quadTreeBuild 構(gòu)建四叉樹] * @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é)點的子節(jié)點] * @param {[QuadNode]} node [需要創(chuàng)建子節(jié)點的節(jié)點] * @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 給定一個矩形區(qū)域?qū)⑺譃樗膫€象限] * @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.");
用四叉樹查找某一對象
未完待續(xù)......
參考
- 四叉樹與八叉樹
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/87530.html
摘要:我們在上文源碼解析發(fā)現(xiàn)版的節(jié)點碰撞采用四叉樹進行了優(yōu)化。那么版本的力導(dǎo)圖具體和版的有何不同點呢,四叉樹又如何優(yōu)化碰撞校驗的呢原文鏈接被重命名為。性能的提高歸功于的新的四叉樹。 我們在上文源碼解析發(fā)現(xiàn)v4版的節(jié)點碰撞采用四叉樹進行了優(yōu)化。那么V4版本的力導(dǎo)圖具體和v3版的有何不同點呢,四叉樹又如何優(yōu)化碰撞校驗的呢? v3-force VS v4-force https://github...
摘要:本篇文章已授權(quán)微信公眾號郭霖獨家發(fā)布老規(guī)矩先上圖最近沒有什么時間,后面項目再補上詳細說明百度地圖新增點聚合功能。百度地圖是把整個地球是按照一個平面來展開,并且通過墨卡托投影投射到坐標軸上面。上圖很明顯墨卡托投影把整張世界地圖投影成。 本篇文章已授權(quán)微信公眾號 guolin_blog (郭霖)獨家發(fā)布 老規(guī)矩先上圖最近 沒有什么時間,后面項目再補上詳細說明 showImg(https:/...
摘要:在中,引入一些元數(shù)據(jù)方面的擴展項。不同層級的元數(shù)據(jù)像素級別樣式化渲染不同層級的元數(shù)據(jù)像素級別樣式化渲染配合使用和兩個擴展項,下一代的可以在各個層級存儲元數(shù)據(jù)。例如,水泥地和草地的摩擦系數(shù)可以作為元數(shù)據(jù),影響車輛的行駛速度等。下一代的 3D Tiles 前瞻原文:Introducing 3D Tiles Next, Streaming Geospatial to the Metaverse原文...
摘要:筆者寫的數(shù)據(jù)結(jié)構(gòu)與算法之美系列用的語言是,旨在入門數(shù)據(jù)結(jié)構(gòu)與算法和方便以后復(fù)習。非線性表中的樹堆是干嘛用的其數(shù)據(jù)結(jié)構(gòu)是怎樣的希望大家?guī)е@兩個問題閱讀下文。其中,前中后序,表示的是節(jié)點與它的左右子樹節(jié)點遍歷訪問的先后順序。 showImg(https://segmentfault.com/img/bVbuvnj?w=900&h=250); 1. 前言 想學好前端,先練好內(nèi)功,內(nèi)功不行,...
閱讀 1176·2021-10-11 10:59
閱讀 1963·2021-09-29 09:44
閱讀 853·2021-09-01 10:32
閱讀 1424·2019-08-30 14:21
閱讀 1870·2019-08-29 15:39
閱讀 2973·2019-08-29 13:45
閱讀 3532·2019-08-29 13:27
閱讀 2006·2019-08-29 12:27