AOI主要有九宮格、燈塔和十字連結清單的算法實作。本文闡述十字連結清單的實作和嘗試。
根據二維地圖,将其分成x軸和y軸兩個連結清單。如果是三維地圖,則還需要維護多一個z軸的連結清單。将對象的坐标值按照大小相應的排列在相應的坐标軸上面。
對對象的操作主要有以下三個接口:
add:對象進入地圖;
leave:對象離開地圖;
move:對象在地圖内移動。
既然是連結清單,很自然地想到用線性表來實作。因為存在向前和向後找的情況,是以使用雙連結清單實作。其實實作也是非常簡單,就是兩個雙連結清單(這裡以二維地圖舉例)。那麼我們的節點需要四個指針,分布為x軸的前後指針,y軸的前後指針。
下面是地圖場景資訊和接口。這裡的實作比較粗略,是帶頭尾的的雙連結清單,暫時不考慮空間占用的問題。類<code>Scene</code>有分别有一個頭尾指針,初始化的時候會為其指派,主要用<code>DoubleNode</code>類的指針來存儲x軸和y軸的頭尾。初始化的時候,将<code>_head</code>的next指針指向尾<code>_tail</code>;将<code>_tail</code>的prev指針指向<code>_head</code>。
将<code>DoubleNode</code>對象插入到十字連結清單中。x軸和y軸分别處理,處理方法基本一緻。其實就是雙連結清單的資料插入操作,需要從頭開始周遊線性表,對比相應軸上的值的大小,插入到合适的位置。
假設可視範圍為x軸2以内,y軸2以内,則運作:
分别插入以下資料a(1,5)、f(6,6)、c(3,1)、b(2,2)、e(5,3),然後插入d(3,3),按照x軸和y軸列印其雙連結清單結果;
插入d(3,3)資料,求其可視AOI範圍(如圖,除了f(6,6),其它對象都在d的可視範圍内)。
控制台結果(前8行):

步驟1結果圖示:
步驟2結果圖示:
其實都是雙連結清單的基本操作,斷掉其相應的指針就好了。按理,是需要
move和leave操作如圖,move是将d(3,3)移動到(4,4),然後再列印其AOI範圍。
控制台結果:
移動後AOI範圍圖示: