如何高效的對可移動物體進行四叉樹管理

2021-04-28 02:41:28 字數 1056 閱讀 6170

首先,我要假設你已經對乙個空間完成了四叉樹劃分,並得到一棵樹( root ),那麼對於靜態物體,很明顯你只需要在預處理階段一次性插入即可,並且在遊戲執行階段你都無須去關心它們( 除非你用一顆炸彈把它們炸飛,不過那時侯你只要呼叫樹的刪除方法就可以了 ).

但是,對於動態物體,你就必須時刻關心它們的動向,因為一旦它們離開了原本所依附的空間節點的區域,而在樹中卻沒有即使的更新,那麼就會得到錯誤的效果,比如渲染錯誤或碰撞檢測錯誤.

所以我們必須時刻檢查移動物體在樹中的位置,最笨的方法,我們每次通過物體的id遍歷樹節點中所有被存放的物體( 不可以通過物體的位置來找原來的節點,因為很可能此時的物體已經不在上一次的位置了,比如悟空的瞬間移動 ),然後我們找到了那個物體,我們需要判斷它需不需要被移動到其他節點上,如果需要那最好,如果不需要(還在原來的區域),那麼剛才的遍歷就全白費了.

這樣的效率顯然不能忍受,改進方法如下:

對於更新操作,我們所要做的就是把當前物體與原來物體進行比較,看兩個物體是否應該在同乙個空間區域,如果是,那麼就不需更新,如果不是,那麼必須把物體從原來的空間節點刪除,並連線到新的空間節點下,我們需要的就是找到高效的通過需要被更新的物體來定位這個物體在原來樹中的位置,由於當前物體與原來物體在位置上可能已經有很大變化,所以我們不可以利用樹來縮小查詢範圍.

但是我注意到,由於我將每個物體都設定了唯一id(在例項化時指定)那麼我們只能利用緩衝儲存的方法來加快查詢,也就是說,我維護乙個存放二元組有序表,二元組為( 物體id, 空間節點指標 ),通過這個二元組把當前樹中存在的物體與所存放的位置儲存起來.

這樣,假設我有3層樹構成四叉樹,更新物體時,我只需:

(1)為當前物體重新搜尋應存放的位置,查詢次數為對數級

(2)根據當前物體id從緩衝儲存得到物體原來所在空間節點,由於我以id為序來維護它,查詢次數為對數級

(3)比較新得到的空間節點與原來的空間節點,如果相同,不需要操作,如果不同,從原來的空間節點中刪除當前物體,加入新算出的空間節點下,同時別忘了更新快取中對應二元組的空間節點

這個方法可以比較好的解決可移動物體由於自身位置的不確定而帶來的四叉樹重新定位的問題,它利用一定數量的儲存空間以及一定程式設計的複雜性換來了時間上的節省.

如何高效的對可移動物體進行四叉樹管理

首先,我要假設你已經對乙個空間完成了四叉樹劃分,並得到一棵樹 root 那麼對於靜態物體,很明顯你只需要在預處理階段一次性插入即可,並且在遊戲執行階段你都無須去關心它們 除非你用一顆炸彈把它們炸飛,不過那時侯你只要呼叫樹的刪除方法就可以了 但是,對於動態物體,你就必須時刻關心它們的動向,因為一旦它們...

樹莓派 攝像頭實現對移動物體的檢測

樹莓派下對攝像頭的呼叫 樹莓派點亮led 接下來,我們將使用python opencv實現對移動物體的檢測 程式功能 攝像頭程式識別到移動的物體之後,樹莓派連線的led閃爍,螢幕中顯示的攝像頭介面出現綠色矩形框選物體移動部分 一 環境變數的配置 當我們將cv2的庫安裝之後,就可以實現對攝像頭的操作 ...

運動物體的檢測 初

最近為了實現運動物體的檢測這一功能,在網路上找了許多材料,但是大都不容易實現或者晦澀難懂,於是決定從基礎入手,先對兩張大小相同但略有差異的兩張進行操作,基本步驟是首先對兩張進行相減操作,把差值圖放在另外一張大小相同的圖上,之後對這張圖進行闕值化操作,然後再尋找輪廓,用矩形圈去輪廓。在建立差圖時找到了...