网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
05月10日漏签0天
processing吧 关注:7,140贴子:9,781
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 4回复贴,共1页
<<返回processing吧
>0< 加载中...

Processing中制作沙粒溶解动画:智慧从乌合之众中涌现

  • 取消只看楼主
  • 收藏

  • 回复
  • Prezi_暗流
  • 核心吧友
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
在博客上花费数小时憋出一篇文章却没人看,心情很失落。
发到这里来找存在感~~貌似这里人气也不是很高,这贴应该不会沉得快~~
发图镇楼,后面代码就是这个效果:


  • Prezi_暗流
  • 核心吧友
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Processing能够以相对简单的方式对很多元胞自动机进行模拟,此外它还内置了一些例子。比如file/examples/topics/cellularautomata/game of life 就是很简单的一个,它把画布切割成网状格,每个格子只有两种状态:“生”和“死”,而这种状态由环绕着它的八个格子的生死状态来决定,只有当八个格子中有两个或三个“生格子”的时候,该格子才能“生”,大于三个,则因“拥挤”而死,小于两个,则因“孤独”而死。遵循着这个原则,画布上所有格子不断进化,生生死死,最后得到一个相对较稳定的状态。这个模型说起来也是对生活中很多现象的抽象化表达。
题图的砂堆模型,应用的是另一种元胞自动机的规则,叫做blockcellularautomaton,可以译作分块式元胞自动机,就是把所有元胞按照位置分为若干个均匀的“块”,每一各块内部的元胞根据规则作出相应活动;紧接着下一步把元胞重新划块,重新块内作用;再分块,再作用,周而复始,不断变化。这在模拟物理运动时非常好用(这几句看不懂没关系,继续往下看)。
Margolusneighborhood就是这个分块式模型里最简单的模型。把平面内所有元胞按照2*2分割成块(如绿线所示分割),计算块内四个元胞的相互作用并更新状态;然后错一行一列重新进行分割(如蓝线),块内相互作用并更新元胞状态;再按绿线分割;再按蓝线分割;如此往复。



陕西润玛彩商贸有限公司
processing主编直接收稿,3天审稿 1-2个月见刊, 录用高 保见刊。加急通道!processing编辑专业服务,即投即审,提供杂志社票据,发表无后顾之忧。
2025-05-10 05:26广告
立即查看
2025-05-10 05:26:12
广告
  • Prezi_暗流
  • 核心吧友
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
把每一块内的四个元胞替换成沙粒和空隙,并应用沙堆规则,就能相当逼真地模拟沙堆自然塌陷的效果,这里运用的沙堆规则如下:

只有一种情况会出现“阻塞”效果,如下。这种情况下,会按概率p和1-p出现两种结果。


  • Prezi_暗流
  • 核心吧友
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
题图的代码及注释如下,这个例子里每个像素点就是一个元胞。
boolean jump; //一个让块的分割线在蓝线和绿线之间来回切换的参数
boolean p1,p2,p3,p4; //每个块内四个元胞的状态,p1代表左上,p2右上,p3左下,p4右下
BlockquadCube; //后面写了一个类叫做Block,主要内容就是块内四个元胞如何根据现有的状态更新状态
boolean[]status=newboolean[4]; //建个数组储存四个元胞状态
PFontyahei; //声明字体
void setup(){
size(400,300);
background(0);
frameRate(30); //画布的帧率,通过这个参数可以控制坍塌的速度
yahei=createFont("MSYHBD.TTF",160);
//写这句之前你需要先在c盘font文件夹里找到雅黑字体并拖到当前代码窗口里
textFont(yahei); //使用字体
fill(255); //字体填充色
text("节操",50,200); //写字
}
void draw(){
if(jump==false){ //false时使用绿线的方法分割,true时使用蓝线方法切割
for(int i=0;i<width-1;i+=2){ //每一列
for(intj=0;j<height-1;j+=2){ //每一行
if(get(i,j)==color(255)){p1=true;}else{p1=false;} //根据每个像素点的颜色求得其状态
if(get(i+1,j)==color(255)){p2=true;}else{p2=false;}
if(get(i,j+1)==color(255)){p3=true;}else{p3=false;}
if(get(i+1,j+1)==color(255)){p4=true;}else{p4=false;}
quadCube=new Block(p1,p2,p3,p4); //四个状态导入到类里运算
status=quadCube.output(); //得到更新后的状态
if(status[0]==true){set(i,j,color(255));}else{set(i,j,color(0));} //根据状态给每个像素点上色
if(status[1]==true){set(i+1,j,color(255));}else{set(i+1,j,color(0));}
if(status[2]==true){set(i,j+1,color(255));}else{set(i,j+1,color(0));}
if(status[3]==true){set(i+1,j+1,color(255));}else{set(i+1,j+1,color(0));}
}
}
jump=true; //切换下状态,下一帧里按照蓝线切割了
}else{
//按照蓝线切割
for(int i=1;i<width-1;i+=2){ //每一列
for(intj=1;j<height-1;j+=2){ //每一行
if(get(i,j)==color(255)){p1=true;}else{p1=false;}
if(get(i+1,j)==color(255)){p2=true;}else{p2=false;}
if(get(i,j+1)==color(255)){p3=true;}else{p3=false;}
if(get(i+1,j+1)==color(255)){p4=true;}else{p4=false;}
quadCube=new Block(p1,p2,p3,p4);
status=quadCube.output();
if(status[0]==true){set(i,j,color(255));}else{set(i,j,color(0));}
if(status[1]==true){set(i+1,j,color(255));}else{set(i+1,j,color(0));}
if(status[2]==true){set(i,j+1,color(255));}else{set(i,j+1,color(0));}
if(status[3]==true){set(i+1,j+1,color(255));}else{set(i+1,j+1,color(0));}
}
}
jump=false; //切换回绿线
}
}
//下面是专门计算状态的类,看着挺长,实际上就是用if 和 else if对上面那个沙堆规则图进行了代码化表达
class Block {
boolean s1, s2, s3, s4;
float possibility=35f; //这里的f是用来声明35是个浮点数而不是整数,有35的概率“阻塞”
boolean result[]=new boolean[4];
Block(boolean i1, boolean i2, boolean i3,boolean i4) {
if(i1==false && i2==false && i3==false &&i4==false) {
s1=false;
s2=false;
s3=false;
s4=false;
}
else if(i3==true && i4==true) {
s1=i1;
s2=i2;
s3=i3;
s4=i4;
}
else if(i1==true && i2==true && i3==false &&i4==true) {
s1=false;
s2=true;
s3=true;
s4=true;
}
else if(i1==true && i2==true && i3==true &&i4==false) {
s1=true;
s2=false;
s3=true;
s4=true;
}
else if(i1==true && i2==false && i3==true &&i4==false) {
s1=false;
s2=false;
s3=true;
s4=true;
}
else if(i1==false && i2==true && i3==false &&i4==true) {
s1=false;
s2=false;
s3=true;
s4=true;
}
else if(i1==true && i2==true && i3==false &&i4==false) {
float odd=random(100);
if (odd
s1=true;
s2=true;
s3=false;
s4=false;
}
else {
s1=false;
s2=false;
s3=true;
s4=true;
}
}
else if(i1==true) {
s1=false;
s2=false;
s3=true;
s4=false;
}
else if(i2==true) {
s1=false;
s2=false;
s3=false;
s4=true;
}
else {
s1=i1;
s2=i2;
s3=i3;
s4=i4;
}
}
boolean[] output() { //这里返回数组的写法要多留心下,我写错了好多回
boolean[]result= {
s1, s2, s3, s4
};
returnresult;
}
}
这段代码里溶解的是汉字,换成图片等同样能收到不错的视觉效果。


  • Prezi_暗流
  • 核心吧友
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我的新浪微博是@Prezi_暗流,欢迎关注:-)


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 4回复贴,共1页
<<返回processing吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示