1. 程式人生 > >八連通填充演算法

八連通填充演算法

  最近做了個圈地的遊戲,根據玩家行走路徑和自己的領地區域圈出自己的新領地。自己在演算法這方面比較薄弱,這次也趁機修煉了一波,寫下自己的心得和感悟在這裡。可能寫的不好,希望看到的僅供參考,不足之處和錯誤之處多謝指正。

  八連通演算法其實就是給定一個種子點,通過迴圈查詢以自己為中心的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);  //遞迴呼叫

            }

     }

},