最近想要研究研究webgl地形的渲染,然后就想起了四叉树,在网上看了一篇相关的文章,准备拿javascript实现一下备用。

四叉树原理

(这部分就直接抄了,见参考)四叉树(Q-Tree)是一种树形数据结构。四叉树的定义是:它的每个节点下至多可以有四个子节点,通常把一部分二维空间细分为四个象限或区域并把该区域里的相关信息存入到四叉树节点中。这个区域可以是正方形、矩形或是任意形状。以下为四叉树的二维空间结构(左)和存储结构(右)示意图(注意节点颜色与网格边框颜色):

四叉树的每一个节点代表一个矩形区域(如上图黑色的根节点代表最外围黑色边框的矩形区域),每一个矩形区域又可划分为四个小矩形区域,这四个小矩形区域作为四个子节点所代表的矩形区域。

数据结构

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; //所表示的矩形区域

this.data = null; //相关数据

this.childs = null; //四个子节点,没有就是null

};

var QuadTree = function(){

this.root = new QuadNode(); //根节点

this.depth = 0; //数的深度

};

树的构建

var g_tree = new QuadTree();

/**

* [quadTreeBuild 构建四叉树]

* @param {[number]} depth [输的深度]

* @param {[QuadRect]} rect [数表示的矩形区域]

*/

function quadTreeBuild(depth, rect){

g_tree.depth = depth;

quadCreateBranch(g_tree.root, depth, rect);

}

/**

* [quadCreateBranch 递归方式创建给定节点的子节点]

* @param {[QuadNode]} node [需要创建子节点的节点]

* @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 给定一个矩形区域将它分为四个象限]

* @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.');

用四叉树查找某一对象

未完待续......

四叉树 java实现,数据结构与算法--四叉树(javascript实现)相关推荐

  1. java基础----数据结构与算法----Java API:集合 以及 排序相关API

    概述: 基本数据结构与算法在jdk中都有相应的API 数组+java.util.Arrays java中的集合类 Collection-->List+Set-->接口的实现类 Map   ...

  2. java contions_Java数据结构与算法

    特点: 在内存中分配连续的空间,只存储数据,不存储地址信息.位置就隐含着地址. 1 优点: 1.节省存储空间,因为分配给数据的存储单元全用存放结点的数据(不考虑c/c++语言中数组需指定大小的情况), ...

  3. java有趣的技术分享ppt,java面试数据结构与算法高频考

    前言 本文涵盖了阿里巴巴.腾讯.字节跳动.京东.华为等大厂的Java面试真题,不管你是要面试大厂还是普通的互联网公司,这些面试题对你肯定是有帮助的,毕竟大厂一定是行业的发展方向标杆,很多公司的面试官同 ...

  4. Java版数据结构与算法笔记

    文章目录 一.数据结构与算法概述及题目 1.数据结构和算法的关系 2.线性结构与非线性结构 Ⅰ-线性结构 Ⅱ-非线性结构 3.经典面试题 Ⅰ-字符串匹配问题: Ⅱ-汉诺塔游戏 Ⅲ-八皇后问题: Ⅳ-马 ...

  5. 猎豹网校JAVA语言数据结构与算法视教程

    -------------------课程目录------------------- 01.NetBeans_下载和安装.mp4 02.JavaDS_数据结构和算法的概述.mp4   03.JavaD ...

  6. Java描述 数据结构与算法

    算法:NonextremeElement(S[], n) 输入:由n个整数构成的集合S 输出:其中的任一非极端元素 { 任取的三个元素x, y, z ∈ S; //既然S是集合,这三个元素必互异 通过 ...

  7. java dfs_Java数据结构与算法 深搜(DFS)的简单使用(一)之排列组合

    今天,我们来简单介绍一下深度优先搜索(DFS)的概念和使用. 在百度词条中,对深搜的解释是这样的. 百度词条中的解释 由此,我们可知,深搜是广泛运用到 图 中的搜索方法之一. 用深度优先搜索遍历图的基 ...

  8. Java版数据结构与算法——线性表

    *************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如 ...

  9. 数据结构与算法入门(Java)

    数据结构与算法(Java) 1. 数据结构与算法概述 1.1 什么是数据结构? 官方解释: 数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科. 大白话: ...

最新文章

  1. jquery 1.6以上版本 全选
  2. 机器学习流程模板及多模型对比实战梳理
  3. python的__init__几种方法总结【转载】
  4. matlab 常用数学函数
  5. 动态加载类的原理——元数据的使用
  6. linux tao环境 安装_Linux安装jdk8及环境变量配置
  7. CentOS7 安装nginx
  8. LeetCode MySQL 1264. 页面推荐(union)
  9. Vim设置支持鼠标,光标定位,滚轮上下移动
  10. java 中linux命令参数说明,java中linux命令参数说明
  11. IO 流的操作基本规律
  12. 学习笔记:DHCP服务器的配置
  13. 评课用计算器计算机,《用计算器计算》教学反思
  14. 分布式爬虫搭建系列 之二-----神器PyCharm的安装
  15. Dos window下运行java程序
  16. 小米手机MIUI安装Google服务框架和Google Play的教程
  17. matlab饼状图的编程方法,matlab饼状图
  18. php 取余数函数,PHP取余函数介绍MOD(x,y)与x%y
  19. centos8 配置DNS服务
  20. 【06月24日】预分红股息率最高排名

热门文章

  1. java8 stream 的list处理
  2. Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported [已解决]...
  3. Linux 命令篇 之 uname
  4. 【Python】如何在PyPI上发布自定义软件包
  5. 吴军《硅谷来信》工作篇学习总结
  6. joinquant量化数据精准吗?
  7. python画4维图_请教如何画四维图(4D-plot)
  8. MySQL系列之优化——1.优化哲学、2. 优化工具的使用、3. 优化思路分解、4. MySQL参数优化测试、5.1 参数优化、6. 参数优化结果、7. 锁的监控及处理、8. 主从优化
  9. 二叉树的前序中序后序遍历真题
  10. You (omm) are not allowed to use this program (crontab)普通用户没有权限访问crontab