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...