AOI興趣點演算法(九宮格)

2021-09-23 20:49:59 字數 3501 閱讀 6898

aoi興趣點演算法(九宮格)

aoi格仔的結構體模組

格仔id

格仔的左邊邊界座標

格仔的右邊邊界座標

格仔的上邊邊界座標

格仔的下邊邊界座標

當前格仔內 玩家/物體 成員的id集合 :map[id]

保護格仔內容map的鎖

type grid struct 

//保護當前格仔內容的map的鎖

pidlock sync.rwmutex

}

初始化格仔的方法

給格仔新增乙個玩家

從格仔中刪除乙個玩家

得到當前格仔所有的玩家id

除錯列印格仔資訊方法

//初始化格仔的方法

func newgrid(gid, minx, maxx, miny, maxy int) *grid ), }}

//給格仔新增乙個玩家

func (g *grid) add(playerid int, player inte***ce{})

//從格仔中刪除乙個玩家

func (g *grid) remove(playerid int)

//得到當前格仔所有的玩家id

func (g *grid) getplayerids() (playerids int)

return

}//除錯列印格仔資訊方法

func (g *grid) string() string

aoi格仔管理模組

區域的左邊邊界

區域的右邊邊界

x軸方向的格仔的數量

區域的上邊邊界

區域的下邊邊界

y軸方向的格仔的數量

整體區域擁有哪些格仔:grids map[int] grid

type aoimanager struct
通過乙個格仔id得到當前格仔的周邊九宮格的格仔id集合

//通過乙個格仔id得到當前格仔的周邊九宮格的格仔id集合

func (m *aoimanager) getsurroundgridsbygid(gid int) (grids *grid)

//將當前中心gid放入九宮格切片中

//==== > 判讀gid左邊是否有格仔? 右邊是否有格仔

//通過格仔id 得到x軸編號 idx = gid % cntsx

idx := gid % m.cntsx

//判斷idx編號左邊是否還有格仔

if idx > 0

//判斷idx編號右邊是否還有格仔

if idx < m.cntsx-1

// ===> 得到乙個x軸的格仔集合,遍歷這個格仔集合

// for ... 依次判斷 格仔的上面是否有格仔?下面是否有格仔

//將x軸全部的grid id 放到乙個slice中 ,遍歷整個slice

gidsx := make(int, 0, len(grids))

for _, v := range grids

for _, gid := range gidsx

//下方是否還有格仔

if idy < m.cntsy-1

} return

}

得到每個格仔在x軸方向的寬度

//得到每個格仔在x軸方向的寬度

func (m *aoimanager) gridwidth() int

得到每個格仔在y軸方向高度

//得到每個格仔在y軸方向高度

func (m *aoimanager) gridheight() int

初始化乙個地圖 aoimanager

//初始化乙個地圖 aoimanager

func newaoimanager(minx, maxx, cntsx, miny, maxy, cntsy int) *aoimanager

//隸屬於當前地圖的全部格仔 也一併進行初始化

for y:=0; y < cntsy; y++

} return aoimgr

}

列印當前的地圖資訊

//列印當前的地圖資訊

func (m *aoimanager) string() string

return s

}

新增乙個playerid到乙個aoi格仔中

//新增乙個playerid到乙個aoi格仔中

func (m *aoimanager) addpidtogrid(pid, gid int)

移除乙個playerid 從乙個aoi區域中

//移除乙個playerid 從乙個aoi區域中

func (m *aoimanager) removepidfromgrid(pid, gid int)

通過格仔id獲取當前格仔的全部playerid

//通過格仔id獲取當前格仔的全部playerid

func(m *aoimanager) getpidsbygid(gid int) (playerids int)

通過x,y座標得到對應的格仔id

//通過x,y座標得到對應的格仔id

func (m *aoimanager) getgidbypos(x, y float32) int

if y < 0 || int(y) >= m.maxy

//根據座標 得到當前玩家所在格仔id

idx := (int(x) - m.minx) / m.gridwidth()

idy := (int(y) - m.miny) / m.gridheight()

//gid = idy*cntsx + idx

gid := idy * m.cntsx + idx

return gid

}

通過乙個x,y座標,得到周邊乙個九宮格玩家id

//根據乙個座標 得到 周邊九宮格之內的全部的 玩家id集合

func (m *aoimanager) getsurroundpidsbypos(x, y float32) (playerids int)

return

}

通過座標,將pid將入到乙個格仔中

//通過座標 將pid 加入到乙個格仔中

func (m *aoimanager) addtogridbypos(pid int, x, y float32)

通過座標,把乙個player從乙個格仔刪除

//通過座標 把乙個player從乙個格仔中刪除

func (m *aoimanager) remotefromgridbypos(pid int , x, y float32)

九宮格演算法Python

演算法口訣 一居上行正 依次斜填切莫忘 上出框時向下放,右出框時向左放 排重便在下格填,右上排重乙個樣 import numpy as np n int input 輸入是幾宮格 a np.zeros n,n if n 2 0 print unknown else num 1 i 0j n 2 a ...

九宮格布局

2009 08 25 15 15 27 九宮格是一種比較古老的設計,它最基本的表現其實就像是乙個三行三列的 其實它最初是在window的c s結構中用得比較多,比如我們經常看 到軟體中的乙個窗體,其實就是乙個九宮格的典型應用,因為窗體需要在八個方向拉伸,所以在c s軟體中大量採用這種技術來布局設計。...

九宮格問題

include include stl 雙端佇列容器 include include pos.h using namespace std ofstream fout sudoku.txt deque d int lay deque d int checkout pos p,int n int sud...