四叉樹算法

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

title: 四叉樹算法
date: 2016-1-11 15:10
categories: IOS

tags: 算法

小小程序猿
我的博客:http://daycoding.com

轉載:http://blog.csdn.net/zhanxinhang/article/details/6706217

高德iOS聚合實例

高德Android聚合實例

四叉樹或四元樹也被稱為Q樹(Q-Tree)。四叉樹廣泛應用于圖像處理、空間數據索引、2D中的快速碰撞檢測、存儲稀疏數據等,而八叉樹(Octree)主要應用于3D圖形處理。對游戲編程,這會很有用。本文著重于對四叉樹與八叉樹的原理與結構的介紹,幫助您在腦海中建立四叉樹與八叉樹的基本思想。本文并不對這兩種數據結構同時進行詳解,而只對四叉樹進行詳解,因為八叉樹的建立可由四叉樹的建立推得。

四叉樹與八叉樹的結構與原理
四叉樹(Q-Tree)是一種樹形數據結構。四叉樹的定義是:它的每個節點下至多可以有四個子節點,通常把一部分二維空間細分為四個象限或區域并把該區域里的相關信息存入到四叉樹節點中。這個區域可以是正方形、矩形或是任意形狀。以下為四叉樹的二維空間結構(左)和存儲結構(右)示意圖(注意節點顏色與網格邊框顏色):

四叉樹的每一個節點代表一個矩形區域(如上圖黑色的根節點代表最外圍黑色邊框的矩形區域),每一個矩形區域又可劃分為四個小矩形區域,這四個小矩形區域作為四個子節點所代表的矩形區域。
較之四叉樹,八叉樹將場景從二維空間延伸到了三維空間。八叉樹(Octree)的定義是:若不為空樹的話,樹中任一節點的子節點恰好只會有八個,或零個,也就是子節點不會有0與8以外的數目。那么,這要用來做什么?想象一個立方體,我們最少可以切成多少個相同等分的小立方體?答案就是8個。如下八叉樹的結構示意圖所示:

/* 一個矩形區域的象限劃分::UL(1)   |    UR(0)----------|-----------LL(2)   |    LR(3)
以下對該象限類型的枚舉
*/
typedef enum
{UR = 0,UL = 1,LL = 2,LR = 3
}QuadrantEnum;/* 矩形結構 */
typedef struct quadrect_t
{    double  left, top, right, bottom;
}quadrect_t;/* 四叉樹節點類型結構 */
typedef struct quadnode_t
{quadrect_t    rect;          //節點所代表的矩形區域list_t        *lst_object;   //節點數據, 節點類型一般為鏈表,可存儲多個對象struct  quadnode_t  *sub[4]; //指向節點的四個孩子 
}quadnode_t;/* 四叉樹類型結構 */
typedef struct quadtree_t
{quadnode_t  *root;int         depth;           // 四叉樹的深度                    
}quadtree_t;

四叉樹的建立

利用四叉樹分網格,如本文的第一張圖<四層完全四叉樹結構示意圖>,根據左圖的網格圖形建立如右圖所示的完全四叉樹。

偽碼:

Funtion QuadTreeBuild ( depth, rect ){
QuadTree->depth = depth;/*創建分支,root樹的根,depth深度,rect根節點代表的矩形區域*/
QuadCreateBranch (  root, depth, rect );}Funtion QuadCreateBranch ( n, depth,rect ){
if ( depth!=0 ){
n = new node;    //開辟新節點
n ->rect = rect; //將該節點所代表的矩形區域存儲到該節點中
將rect劃成四份 rect[UR], rect[UL], rect[LL], rect[LR];/*創建各孩子分支*/
QuadCreateBranch ( n->sub[UR], depth-1, rect [UR] );
QuadCreateBranch ( n->sub[UL], depth-1, rect [UL] );
QuadCreateBranch ( n->sub[LL], depth-1, rect [LL] );
QuadCreateBranch ( n->sub[LR], depth-1, rect [LR] );}}

假設在一個矩形區域里有N個對象,如下左圖一個黑點代表一個對象,每個對象的坐標位置都是已知的,用四叉樹的一個節點存儲一個對象,構建成如下右圖所示的四叉樹。

方法也是采用遞歸的方法對該矩形進行劃分分區塊,分完后再往里分,直到每一個子矩形區域里只包含一個對象為止。
偽碼:

Funtion QuadtreeBuild(){Quadtree = {empty};For (i = 1;i<n;i++)      //遍歷所有對象
{QuadInsert(i, root);//將i對象插入四叉樹
}          剔除多余的節點;       //執行完上面循環后,四叉樹中可能有數據為空的葉子節點需要剔除}    Funtion QuadInsert(i,n)      //該函數插入后四叉樹中的每個節點所存儲的對象數量不是1就是0{  if(節點n有孩子){      通過劃分區域判斷i應該放置于n節點的哪一個孩子節點c;       QuadInsert(i,c);}else if(節點n存儲了一個對象){為n節點創建四個孩子;將n節點中的對象移到它應該放置的孩子節點中;通過劃分區域判斷i應該放置于n節點的哪一個孩子節點c;QuadInsert(i,c);}else if(n節點數據為空)    {將i存儲到節點n中;}} 

用四叉樹查找某一對象

1、采用盲目搜索,與二叉樹的遞歸遍歷類似,可采用后序遍歷或前序遍歷或中序遍歷對其進行搜索某一對象,時間復雜度為O(n)。

2、根據對象在區域里的位置來搜索,采用分而治之思想,時間復雜度只與四叉樹的深度有關。比起盲目搜索,這種搜索在區域里的對象越多時效果越明顯

Funtion find ( n, pos, ){If (n節點所存的對象位置為 pos所指的位置 )Return n;If ( pos位于第一象限 )temp = find ( n->sub[UR], pos );else if ( pos位于第二象限)temp = find ( n->sub[UL], pos );else if ( pos位于第三象限 )temp = find ( n->sub[LL], pos );else  //pos 位于第四象限temp = find ( n->sub[LR], pos );return temp;   } 

轉載于:https://my.oschina.net/coolwxb/blog/631335

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285535.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285535.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285535.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2019年中國教育信息化行業研究報告

2019年中國教育信息化行業研究報告 教育行業丨研究報告 本文轉自&#xff1a;艾瑞咨詢 核心摘要&#xff1a; 教育信息化2.0時代&#xff0c;教育相關政府/學校以更開放的姿態對待社會各類業態的進入&#xff0c;共建共享優質教育資源&#xff0c;提升教育公平與教育質量。同…

C語言試題109之將一個正整數分解質因數。例如:輸入 90,打印出 90=2乘3乘3乘5

?作者簡介:大家好我是碼莎拉蒂,CSDN博客專家?????? ??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 1、題目 題目:將一個正整數分解質因數。例如:輸入 90,打印出 90=233*5。 分析:對 n 進行分解質因…

【ArcGIS遇上Python】使用add-in向導開發ArcGIS插件(1):add-in工具介紹及安裝

文章目錄 addin介紹addin開發方式Python Add-In開發addin下載addin安裝基于ArcObject/ArcGIS Engine的Add-In開發addin介紹 ArcGIS從10.0開始支持addin(ArcGIS軟件中又叫作加載項)的方式進行插件制作。相對于以往9.x系列,addin的無論是從使用或者編寫都更加方便快捷。通過開…

dotnet 使用 Crossgen2 對 DLL 進行 ReadyToRun 提升啟動性能

我對幾個應用進行嚴格的啟動性能評估&#xff0c;對比了在 .NET Framework 和 dotnet 6 下的應用啟動性能&#xff0c;非常符合預期的可以看到&#xff0c;在用戶的設備上&#xff0c;經過了 NGen 之后的 .NET Framework 可以提供非常優越的啟動性能&#xff0c;再加上 .NET Fr…

使用myeclipse建立maven項目(重要)

maven是管理項目的&#xff0c;myeclipse是編寫代碼的。第一次寫項目都要配置好多東西&#xff0c;很麻煩&#xff0c;now 來看看怎樣新建一個maven項目。 工具/原料 myeclipsemaven方法/步驟 因為教程使用的maven是自己下載配置的&#xff0c;并沒有使用myeclipse自帶的&#…

LeetCode 每日一題 Day 22 || 枚舉(數學方法)/二分

1954. 收集足夠蘋果的最小花園周長 給你一個用無限二維網格表示的花園&#xff0c;每一個 整數坐標處都有一棵蘋果樹。整數坐標 (i, j) 處的蘋果樹有 |i| |j| 個蘋果。 你將會買下正中心坐標是 (0, 0) 的一塊 正方形土地 &#xff0c;且每條邊都與兩條坐標軸之一平行。 給你…

不用@微信官網了,用python給自己的微信頭像加個小國旗

國旗LOGO&#xff08;png透明格式&#xff09;&#xff1a; 微信頭像 合成結果&#xff1a; import base64 import os import re from io import BytesIO from PIL import Image import tkinter as tk from tkinter import filedialog# 水印圖片 可以自己指定 #markImageImage…

getContentResolver().query()方法selection參數使用詳解(轉)

如何在managedQuery()和getContentResolver().query()方法中實現結果去重 有時候&#xff0c;我們需要對查詢的數據庫結果進行去重。在SQL中我們可以通過distinct關鍵字實現&#xff0c;但是當我們使用android提供的managedQuery()或getContentResolver().query()方法對數據庫進…

C語言試題106之有一對兔子問題

?作者簡介:大家好我是碼莎拉蒂,CSDN博客專家?????? ??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 1、題目 題目:有一對兔子,從出生后第 3 個月起每個月都生一對兔子,小兔子長到第三個月 后每個月又…

【C#程序設計】教學講義——第二章:簡單C#程序設計

教學目錄 2.1 面向對象的概念2.2 建立簡單的應用程序2.3 窗體和Label控件2.4 文本框-屬性2.5 按鈕控件本章小結2.1 面向對象的概念 2.1.1 對象和類 1.對象 對象是客觀世界中對象的模型化。對象是有著特殊數據(屬性)與操作(行為)的實體,對象的操作(行為)稱為方法。 程…

Blazor University (34)表單 —— 獲得表單狀態

原文鏈接&#xff1a;https://blazor-university.com/forms/accessing-form-state/獲得表單狀態源代碼[1]有時&#xff0c;我們需要獲得 <EditForm> 子內容中的表單狀態。最常見的用途是當我們需要訪問輸入的 CSS 類時&#xff0c;指示輸入是否被修改或有效/無效。例如&a…

[轉]c# 中間件 的擴展模型(.net webapi/.net Core 的 MiddleWare 處理模型)

在學習 asp.net WebApi 或者asp.net Core 的時候&#xff0c;它們管道的處理模型跟 asp.net MVC/WebForm 的管道模型是不一樣的。 asp.net WebApi 或者asp.net Core 他們使用了一種叫做“中間件”的處理模型&#xff0c;相對于傳統管道模型&#xff0c;剔除了很多非必要的處理…

AIX 環境下遇到Device Busy問題

IBM AIX v5.3操作系統環境下在對網絡或網卡進行操作過程中經常遇到"Device Busy"而終止操作例如:#rmdev -l ent1遇到如下返回信息Method error (/etc/methods/ucfgdevice):0514-062 Cant perform the requested function because the speciafield.device is busy. 解…

mykernel編譯過程中問題解決

fatal error: linux/compiler-gcc5.h: No such file or directorycompilation terminated.解決方法:https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/plain/include/linux/compiler-gcc5.h?id2c07053b8e1e0c22bb54dfbdf8e86a70f8bf00fc復制內容保存為c…

C#中的 Attribute 與 Python/TypeScript 中的裝飾器是同個東西嗎

前言最近成功把「前端帶師」帶入C#的坑&#xff08;實際是前端帶師開始從cocos轉unity游戲開發了&#xff09;某天&#xff0c;「前端帶師」看到這段代碼后問了個問題&#xff1a;[這個是裝飾器]&#xff1f;[HttpGet] public Response Get() {return ... }我第一反應覺得不是&…

【ArcGIS Engine二次開發】入門基礎(1):ArcGIS Engine簡介及開發環境搭建

文章目錄ArcGIS Engine概述ArcGIS Engine與ArcObjects的關系ArcGIS Engine下載及安裝ArcGIS Engine概述 ArcGIS Engine簡介 ArcGIS Engine是ESRI公司在2004年推出的用于開發C/S架構GIS應用軟件的工具包&#xff0c;是將用于構建ArcGIS整套產品的組件庫——ArcObjects的比分功…

微軟Visual Studio 2019版本16.3 正式發布,支持 .NET Core 3.0

微軟正式發布了Visual Studio 2019 16.3版本&#xff0c;主要更新內容如下&#xff1a; .NET Core 3.0 Visual Studio版本16.3包括對 .NET Core 3.0 的支持。 注意&#xff1a;如果使用的是.NET Core 3.0&#xff0c;則需要使用Visual Studio 16.3或更高版本。 .NET Core桌…

C語言試題120之輸入兩個正整數 m 和 n,求其最大公約數和最小公倍數

?作者簡介:大家好我是碼莎拉蒂,CSDN博客專家?????? ??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 1、題目 題目:輸入兩個正整數 m 和 n,求其最大公約數和最小公倍數 分析:利用輾除法 2 、溫馨提示…

spring+springMvc+mybatis 調用oracle 存儲過程

最近在項目中遇到在mybatis中調用oracle存儲過程的問題&#xff0c;網上各種查詢&#xff0c;最終解決了問題&#xff0c;在我們項目中我只需要oracle 的存儲過程返回一個字符串用來存入數據庫作為表數據的主鍵&#xff0c; 接下來整理代碼&#xff1a; 首先構建存儲過程getSeq…

OSChina 周一亂彈 ——致我們終將逝去的青春

2019獨角獸企業重金招聘Python工程師標準>>> 我們的青春是這樣的。 從幼兒園午睡開始&#xff0c; 做了一萬遍的廣播體操&#xff0c; 一條充滿了“血”和“淚”的三八線 遍地開花的煎餅果子攤 五毛錢只能養活三天的小雞 象征著財富和地位的彈珠 放學后 奔向世界 放…