java-谢尔宾斯基地毯

java–谢尔宾斯基地毯

本程序将使用递归画出谢尔宾斯基地毯,首先我们将主类继承JFrame类,因为要使用JFrame类生成一个窗体,然后在其中定义一个初始化方法:

public void initUI(){
  	this.setSize(800,600);
 	this.setDefaultCloseOperation(MyJFrame.EXIT_ON_CLOSE);
 	this.setLocationRelativeTo(null); 
  	this.setLayout(new FlowLayout());
 	this.setVisible(true); //设置可见
 }

this.setSize(800,600);设置窗体的长度为800,宽度为600;
this.setDefaultCloseOperation(MyJFrame.EXIT_ON_CLOSE);设置点击窗体的关闭按钮为结束程序;
this.setLocationRelativeTo(null);设置窗口相对于指定组件的位置;
this.setLayout(new FlowLayout());设置布局为流式布局;
this.setVisible(true); 设置窗体显示,直到该语句整个窗体才算生成完毕。
生成完窗体后,我们需要在窗体中画出谢尔宾斯基地毯,这时我们需要使用到窗体的画笔(每个窗体都有自己的画笔),通过画笔在窗体上画出一个个矩形构成谢尔宾斯基地毯。我们在继承JFrame类后,我们可以复写JFrame类中的paint方法,该方法会在每次窗体刷新的时候进行调用(窗体刷新包括改变窗体大小,第一次生成窗体),且该方法的参数是该窗体的画笔对象,因此我们只需要复写该方法并且在该方法中绘画即可,

public void paint(Graphics g) {
  // TODO Auto-generated method stub
  	super.paint(g);
   	g.drawRect(0, 0, this.getWidth(), this.getHeight());
  	this.test(g, 0, 0, this.getWidth(), this.getWidth(),4);
 }
 private int test(Graphics g, int x, int y, int l, int w, int num) {
	if (num == 0) {
   		return 1;
 	}
 	int temp = x;
 	 
  	for (int i = 0; i < 3; i++) {
	 	 for (int j = 0; j < 3; j++) {
   			 if (i == 1 && j == 1) {
   		 		g.fillRect(x, y, l, w);
   			 }else
   				g.drawRect(x, y, l, w);
    			test(g, x, y, l / 3, w / 3, num - 1);
    			x += l;
  		}
 		x = temp;
  		y += w; 
  	}
  	return 1;
 }

super.paint(g);调用父类的paint方法
g.drawRect(0, 0, this.getWidth(), this.getHeight());使用画笔进行画出一个矩形,矩形左上点的坐标0,0,长度为窗体的长度,高度为窗体的高度
this.test(g, 0, 0, this.getWidth(), this.getWidth(),4);调用递归方法,画出谢尔宾斯基地毯,第一个参数为画笔g,第二个参数与第三个参数为坐标(x,y),第三个参数为矩形长度与宽度,第五个参数为递归次数。
在test方法中第一个if判断为递归结束的判断,然后有一个双重循环,该循环次数都为3,表示画九个矩形,内循环中判断该矩形是否为中间的矩形,如果是则画一个填充矩形,否则画一个无填充矩形,然后调用本身,在当前画的矩形当中再画九个矩形,直到num的值等于0才结束递归,num的值决定画多少次九个矩形,然后再for循环中,每内循环一次,横坐标的值都要加上长度,因为要画第二个矩形,每外循环一次,横坐标都要置为原来的值,纵坐标的值都要加上高度。
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值