沙画效果实现

在这里插入图片描述在这里插入图片描述

沙画实现原理

将窗体分为若干个1x1的像素点

将相邻的4个像素点进行考虑上下2个沙粒的下落情况

可以分成2* 2* 2 *2=16中情况,但是真正有意义的情况只有9种
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
用一个二维数组存放每个像素点的沙粒情况,0为无沙粒,其他情况为有沙粒

另外,沙画初始形状可以随机,也可以运用分形建造

从(0,0)点开始遍历,改变沙粒情况,下一次从(1,1)点开始这样的沙画就可以动起来了

    	//沙画进行
    	for(int k=0;;k++){//形成动画效果
    		
    		//清除
    		bufferGraphics.setColor(BG_COLOR);
    		bufferGraphics.fillRect(0, 0, 800, 600);
    		
    		//i在0和1之间循环赋值
    		for(int i = k;i+1<data.length;i+=1){
    			
    			for(int j = k;j+1<data[i].length;j+=1){
    				
    				int p = r.nextInt(2);
    				if(data[i][j]!=0&&data[i+1][j]==0&&data[i][j+1]==0&&data[i+1][j+1]==0){
    					//只有左上
    					data[i][j]=0;
    					data[i][j+1]=1;
    				} else if(data[i][j]==0&&data[i+1][j]!=0&&data[i][j+1]==0&&data[i+1][j+1]==0){
    					//只有右上
    					data[i+1][j]=0;
    					data[i+1][j+1]=1;
    				} else if(data[i][j]==0&&data[i+1][j]!=0&&data[i][j+1]==0&&data[i+1][j+1]!=0){
    					//右边两个
    					data[i+1][j]=0;
    					data[i][j+1]=1;
    				} else if(data[i][j]!=0&&data[i+1][j]==0&&data[i][j+1]!=0&&data[i+1][j+1]==0){
    					//左边两个
    					data[i+1][j+1]=1;
    					data[i][j]=0;
    				} else if(data[i][j]!=0&&data[i+1][j]!=0&&data[i][j+1]!=0&&data[i+1][j+1]==0){
    					//左三角
    					data[i+1][j]=0;
    					data[i+1][j+1]=1;
    				} else if(data[i][j]!=0&&data[i+1][j]!=0&&data[i][j+1]==0&&data[i+1][j+1]!=0){
    					//右三角
    					data[i][j]=0;
    					data[i][j+1]=1;
    				} else if(data[i][j]==0&&data[i+1][j]!=0&&data[i][j+1]!=0&&data[i+1][j+1]==0){
    					//副对角线
    					data[i+1][j]=0;
    					data[i+1][j+1]=1;
    				} else if(data[i][j]!=0&&data[i+1][j]==0&&data[i][j+1]==0&&data[i+1][j+1]!=0){
    					//主对角线
    					data[i][j]=0;
    					data[i][j+1]=1;
    				} else if(data[i][j]!=0&&data[i+1][j]!=0&&data[i][j+1]==0&&data[i+1][j+1]==0){
    					//上面两个
    					if(p==1){
    						data[i][j]=0;
        					data[i][j+1]=1;
    					} else if(p==0){
    						data[i+1][j]=0;
        					data[i+1][j+1]=1;
    					}
    				}	
    				
    			}
    				
    		}
    		//绘制数组
    		showArr(bufferGraphics,data);
    		//绘制缓存到界面上
    		g.drawImage(buffer, 0, 0, null);
				
    		if(k==1)
    			k=0;

    	}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值