八連通填充演算法
最近做了個圈地的遊戲,根據玩家行走路徑和自己的領地區域圈出自己的新領地。自己在演算法這方面比較薄弱,這次也趁機修煉了一波,寫下自己的心得和感悟在這裡。可能寫的不好,希望看到的僅供參考,不足之處和錯誤之處多謝指正。
八連通演算法其實就是給定一個種子點,通過迴圈查詢以自己為中心的3*3其他八個點,滿足要求的就填充自己的顏色,並呼叫該點旁邊的八個點,不滿足就跳出,迴圈往復。八連通演算法是相對簡單的一種演算法,不過它的缺點也很明顯,那就是遞迴導致效率低。而且必須要有種子。對於給定行走路徑的圈地來說,種子點需要確定,遞迴導致的卡慢使得圈地的瞬間比較卡頓。所以並沒有選擇這種演算法,不過這裡也標記一下八連通演算法。
將八個方向基於種子節點的座標存入陣列,等下迴圈的時候使用
var direction_8 = [ cc.v2(-1, 0), cc.v2(-1, 1), cc.v2(0, 1), cc.v2(1, 1), cc.v2(1, 0), cc.v2(1, -1), cc.v2(0, -1), cc.v2(-1, -1) ];
填充方法:
areaFill(x, y) {
let self = this;
if(self.tiledLayer.getTileGIDAt(x, y) == 1){ //我這裡使用的是瓦片地圖 根據瓦片的gid值判定是不是自己的區域
self.tiledLayer.setTileGID(2,x, y);
for(let i = 0; i < direction_8.length; i++){
self.FloodSeedFill(x + direction_8[i].x,y + direction_8[i].y); //遞迴呼叫
}
}
},