巧,由于画布是黑色的,我们可以制作一个尺寸和个体图片尺寸一样大小的的黑色图片,把它覆盖在原来的区域,就等于把这个个体擦除了。这个方法不需要刷新整个屏幕,而且,只对小区域的图形进行操作,大大提高了系统的性能。下面是这个想法的算法实现(为了提高系统的性能,我使用了双缓冲技术):
算法描述:
Begin
(1)首先把cell里的信息复制到workcopy里。
(2)载入你想在屏幕上显示的图片,建立虚拟画布。
(3)对绘画区域上的位置逐个进行判断。如果这个位置下一代有而上一代没有的话,就绘制一个图形;如果这个位置下一代没有而上一代有的话,就擦除上面的图形。
End
请看通用模块显示部分算法流程图5
图7 生命游戏中细胞按规则演化的算法流程图
注意:算法流程图中出现的变量名解释:
h_i 是二维矩阵的行号;h_j是二维矩阵的列号; top 存储当前细胞上一行的行号坐标;
bottom 存储当前细胞下一行的行号坐标; left 存储当前细胞前一列的列号坐标;
right 存储当前细胞后一列的列号坐标;z是矩阵的边界
处理了cell数组以后,我们就可以使用通用模块中的Display函数把它的状态绘制出来。至此,完成了生命游戏的程序设计。请看程序运行的截图 图8:
图8 生命游戏
2.3 一维通用细胞自动机(CA)的实现
生命游戏其实是一维细胞自动机的一个特殊的例子。它能实现比一维细胞自动机更生动直观和奇幻的图形。但是,由于一维细胞自动机规则简单、现象直观,故而人们对它进行了深入的研究,而且,沃夫拉姆的四种分类也是建立在一维细胞自动机的基础之上。它的理论基础可参照本论文第一章第二节。所以,有必要实现一维细胞自动机模型。
一维细胞自动机的算法描述:
Begin
(1)随机生成第一代的细胞:先在绘制区域的最后一行,也就是矩阵数组的最后一行进行一次随机生成细胞操作。
(2)从第二行开始,把整个区域往上挪一行
(3)根据一维细胞自动机的规则和上一代的细胞状态,计算出下一代的细胞状态。并放置在cell数组的最后一行里。
根据cell数组的信息,绘制出相应的图形并返回到(2)步骤。
End
在这里,我们有必要对一维细胞自动机的规则作出解释,请先参看第一章第三节对规则的解释,上面是以一维细胞自动机为例的,也详细阐述了其规则的原理。下面简单其规则产生的算法:
一维细胞自动机规则生成算法描述:
Begin
(1)取得使用者给出规则的十进制表达形式。
(2)使用相关的函数把十进制值转化成二进制(具体语言不一样,可参照本毕业设计源程序的trun_this_on() 函数)。
(3)把这个二进制值每一位分别拆开,放到数组里以便使用。
End
图11 一维细胞自动机
2.4 分子热运动模拟
由于上面的章节没有提到分子热运动,所以这里需要解释一下。我们还是使用原来的通用模块来对分子热运动这个物理现象进行模拟。这里,离散个体的称呼改成小分子。因为分子运动性质和上面的细胞有点区别,每个分子都必须有自己的运动方向和当前以及下一步的坐标,所以使用了一个结构体来存储这些信息。当然,我们对这群分子的状态的显示离不开cell数组,cell 属于通用模块的第一个组成部分。我们可以这样定义这个数据结构:
public struct qiuti
{
public int x; //这个小分子当前的坐标值
public int y;
public int fang; //指示这个小分子当前的的运动方向
}
我们用上面的结构体定义一个结构体数组,来存储所产生的分子的信息(信息指这个分子下一步的坐标和方向)。
public qiuti[] fenzi = new qiuti[15000];
分子随机热运动模拟程序算法描述:
(1)在cell数组上随机生成小分子的坐标和方向。
(2)把这些信息记录在我们定义的结构体数组里。
(3)把 cell 数组的信息复制到 workcopy 数组里去。
(4)对结构体数组的每一个数据项都进行计算,给出分子下一步的方向和坐标。
(5)调用通用模块显示出所有分子的状态,并返回(3)步骤。