细胞状态机(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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不负初心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值