目录
- 原理简介
- 作品展示
- 代码演示
一、原理简介
作用概括:初等细胞自动机在瘟疫模拟中的作用:构建随时间推移发生状态转移的系统,弄清楚它的原理,可以有助于实现疫情的每一段时间内的传播的演示效果。(通过初等细胞自动机中的“代”来确定下一时间的状态)
(1)网格: 初等细胞自动机中的网格是一维的,每个网格表示的是每一个细胞。
(2)状态集: 状态集用于表示每个细胞的状态(细胞是生是死?健康or不健康?)最简单的状态集是0或1
(3)邻居: 邻居指的是和指定细胞相邻的细胞,一维空间中,当前细胞的邻居就是它的左右两边的两个细胞(注意边缘的细胞的邻居细胞仅有一个).邻居可以用来表示其他的细胞的状态和当前细胞之间的状态的一种关系,我们考虑的不再是一个个体,而是相互关联的一种群体。
实现流程图:
二、作品展示
1.图片展示(二维、三维)
2.视频展示
细胞自动机编程——交互媒体课小作业
3.GIF动态图片展示
三、代码演示
1.平台介绍
采用的是JavaScrpit编写的代码,与Three.js结合使用在空间中绘制三维图形
2.创建初等细胞自动机类
(1)计算下一代的函数: 在二维的初等细胞自动机中,每一代是用一行细胞表示的,下一行的细胞表示的是,在上一代中经过一些变化规则,而衍生出来的下一代。所以在这个函数中我们还将使用规则函数。规则,可以根据之前讲到过的邻居细胞之间的关系进行创建。
(2)重置函数: 重置函数是当细胞衍生出很多代,到达了边界时,重新创建新的第一组新生细胞。那么,为什么细胞会到达边界呢?这个边界其实是人为设定的边界。是由于细胞的代数可以是无穷的,但是我们并不想一直这样看着它演变下去,所以我们就人为地给它设定,到了多少代地时候就不能继续再衍生变化下去了。
var log = console.log.bind(console);
var width=20;
var w=1;
var height=20;
var ruleset=[0,1,0,1,1,0,1,0];
var cell;
var container;
var camera, scene, renderer;
var group;
var winWth = window.innerWidth, winHgt = window.innerHeight;
var cubeLine;
var dy=1;
var bigbox=20;
//***********************************细胞自动机原型+构造函数***********************************
function CA(r){
this.ruleset=r;//规则集合
this.cellsarr=new Array(width/w);//创建细胞数组
this.cellLength=this.cellsarr.length;
this.generation=0;
this.colorbox=0xff0000;
this.restart();
}
//重置函数
CA.prototype.restart = function(){
for(var i=0;i<this.cellLength;i++){
this.cellsarr[i]=0;
}
this.colorbox='#'+ Math.random().toString(16).substr(-6);
this.cellsarr[this.cellLength/2]=1;
};
//计算下一代的函数
CA.prototype.generate = function() {
var nextgener=new Array(this.cellLength);//记录新的一代
for(var i=1;i<this.cellLength-1;i++){
var left=this.cellsarr[i-1];
var center=this.cellsarr[i];
var right=this.cellsarr[i+1];
nextgener[i]=this.rules(left,right,center);
}
this.cellsarr=nextgener;//改变细胞状态
this.generation++;//增加代数
};
//计算下一代同位置上的状态的规则函数
CA.prototype.rules = function(left,center,right){
if (left ===1 && center === 1 && right === 1) return this.ruleset[0];
if (left ===1 && center === 1 && right === 0) return this.ruleset[1];
if (left ===1 && center === 0 && right === 1) return this.ruleset[2];
if (left ===1 && center === 0 && right === 0) return this.ruleset[3];
if (left ===0 && center === 1 && right === 1) return this.ruleset[4];
if (left ===0 && center === 1 && right === 0) return this.ruleset[5];
if (left ===0 && center === 0 && right === 1) return this.ruleset[6];
if (left ===0 && center === 0 && right === 0) return this.ruleset[7];
return 0;//如果是边缘的话
};
//确定是否结束:达到了边缘
CA.prototype.finishside = function(){
if(this.generation>height/w-1){
return true;
}else{
return false;
}
};
//重置规则数组
CA.prototype.randomRule = function(){
for(var i=1;i<this.ruleset.length;i++){
ruleset[i]=Math.round(Math.random());//生成0或1的整数
console.log(ruleset[i]);
}
};