空間管理 詳解八叉樹

前言

首先先明確一個概念,八叉樹只做空間管理,而碰撞相關的檢測是另外的東西
在這裏插入圖片描述

1.數據結構選型

1.1數組

需要爲完全樹,比較不靈活,內存佔用較大

1.2樹型結構

可以不爲完全樹,深度不一,需要再擴展,節省內存,搜索數據的複雜度爲O(logn)O(logn)

1.3哈希線性結構

通過哈希表存儲,散列處理比較麻煩,但是搜索的複雜度爲O(1)O(1),並且使用Morton碼作爲鍵值時,有很好的佔位率

2.查詢

2.1 Morton位置碼

在這裏插入圖片描述
Morton碼是通過一定的編碼方式,將空間上的位置通過Z字形管理起來。

2.1.1 Morton碼計算

將行數和列數的2進制交叉組合,可以得到位置碼

爲什麼要交叉組合:因爲Morton碼的增加是通過每行增加兩位後,再進入下一行的

例子:
第3行第4列:
3的二進制表示:011
4的二進制表示:100
交叉組合:011010

2.1.2 位置與Morton碼的映射

假設x軸向上的八叉樹範圍爲[xmin,xmax][x_{min},x_{max}],八叉樹半徑爲r,則
位置碼p=xxmin2rp=\frac{x-x_{min}}{2*r}
p<0.5則數位於yz平面的左側,爲0
p>0.5則數位於yz平面的右側,爲1
將其轉換爲二進制,有效高位爲0,則在yz平面的左側
將其轉換爲二進制,有效高位爲1,則在yz平面的右側

次有效高位可以判斷是在子節點中的左右,因爲每次都是原先的二分之一。
在這裏插入圖片描述
在這裏插入圖片描述

2.1.3 代碼中的運算

2.1.3.1 按位分離

    UInt32 Part1By2(UInt32 n)
    {
        n = (n ^ (n << 16)) & 0xff0000ff; //1
        n = (n ^ (n << 8)) & 0x0300f00f;//2
        n = (n ^ (n << 4)) & 0x030c30c3;//3
        n = (n ^ (n << 2)) & 0x09249249;//4
        return n;
    }

若使用UInt32作爲存儲,因爲xyz需要三位,則最多存10組數據
32÷3=10······2
1.

序號 符號 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
①<<16 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
①^② 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
③&④ 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
序號 符號 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
①<<8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
①^② 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1
③&④ 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1
序號 符號 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1
①<<4 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0
①^② 1 1 0 0 0 0 1 1 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1
0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1
③&④ 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1
序號 符號 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1
①<<2 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0
①^② 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1
0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1
③&④ 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1

2.1.3.2 交叉組合

    UInt32 Morton3(UInt32 x, UInt32 y, UInt32 z)
    {
        return (Part1By2(z) << 2) + (Part1By2(y) << 1) + Part1By2(x);
    }

3.插入

//未完待續

4.刪除

//未完待續

5.碰撞檢測

5.2 避免多次檢測

//未完待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章