細胞狀態機(Cellular Automata)產生地形

以下解釋來自 百度百科:

細胞自動機模型的基本思想是:自然界裏許多複雜結構和過程,歸根到底只是由大量基本組成單元的簡單相互作用所引起。因此,利用各種細胞自動機有可能模擬任何複雜事物的演化過程。

分類:

1)最簡一維細胞自動機: 黑色爲1,白色爲0. 那麼任意一個方格和周圍兩個方格就有 111,110,101,100,011,010,001,000 8種狀態。

2)編碼規則: 當前細胞ci,在t時刻狀態爲 Si,t , 兩個鄰居狀態爲Si-1,t  Si+1,t  則下一時刻狀態 Si,t+1 = F(si-1,t  Si,t  Si+1,t)

假設有如下規則:輸入的三個方格中有奇數個黑色,則下一個爲黑色,表示爲

si,t+1=1 ,如果si-1,t+si,t+si+1,t=1

si,t+1=0 ,如果si-1,t+si,t+si+1,t=2

si,t+1=1 ,如果si-1,t+si,t+si+1,t=3

si,t+1=0 ,如果si-1,t+si,t+si+1,t=0

其中,si,t∈{0,1},對於任意的i和t  。 則編碼爲0101.

3) 最簡一維細胞自動機的動態行爲:

I、 固定值型:細胞自動機經過若干步運算便停留在一個固定的狀態;

II、 週期型:細胞自動機在幾種狀態之間週期循環;

III、 混沌型:細胞自動機處於一種完全無序隨機的狀態,幾乎找不到任何規律;

IV、 複雜型:細胞自動機在運行的過程中可能產生複雜的結構,這種結構既不是完全的隨機混亂,又沒有固定的週期和狀態。

 

產生黑白的格子

void RandomFillMap() { 
    if (useRandomSeed) { 
        seed = Time.time.ToString(); 
    } 
    
    System.Random pseudoRandom = new System.Random(seed.GetHashCode()); 
    
    for (int x = 0; x < width; x ++) { 
        for (int y = 0; y < height; y ++) { 
            if (x == 0 || x == width-1 || y == 0 || y == height -1) { 
                map[x,y] = 1; 
            } 
            else { 
                map[x,y] = (pseudoRandom.Next(0,100) < randomFillPercent)? 1: 0; 
            } 
        } 
    } 
} 


編寫規則

int GetSurroundingWallCount(int gridX, int gridY) { 
    int wallCount = 0; 
    for (int neighbourX = gridX - 1; neighbourX <= gridX + 1; neighbourX ++) { 
        for (int neighbourY = gridY - 1; neighbourY <= gridY + 1; neighbourY ++) { 
            if (neighbourX >= 0 && neighbourX < width && neighbourY >= 0 && neighbourY < height) { 
                if (neighbourX != gridX || neighbourY != gridY) { 
                    wallCount += map[neighbourX,neighbourY]; 
                } 
            } 
            else { 
                wallCount ++; 
            } 
        } 
    }


根據規則重新寫格子

void SmoothMap() { 
    for (int x = 0; x < width; x ++) { 
        for (int y = 0; y < height; y ++) { 
            int neighbourWallTiles = GetSurroundingWallCount(x,y); 
            
            if (neighbourWallTiles > 4) 
                map[x,y] = 1; 
            else if (neighbourWallTiles < 4) 
                map[x,y] = 0; 
            
        } 
    } 
} 

     
    return wallCount; 
}


效果圖:
image

 

參考:

http://unity3d.com/cn/learn/tutorials/modules/advanced/scripting/procedural-cave-generation-pt1?playlist=17153

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章