欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

递归--谢宾斯基三角形、赛尔平斯基地毯

程序员文章站 2024-02-21 18:51:28
...

递归

为实现一个结果,需要调用多次类似的方法,因此会产生重复代码,那么,我们就可以用到递归;递归的正确使用需要条件来退出循环,否则产生存储溢出现象。

谢宾斯基三角形

递归--谢宾斯基三角形、赛尔平斯基地毯
每一个正三角形三条边中点的连线产生四个小正三角形,其中有三个正向,一个倒向;再连接三个正向小正三角形的中点连接,每个小正三角形也会产生四个小小正三角形,以此类推。

//主方法
public static void main(String[] args) {
		Demotri frame = new Demotri();
		frame.ShowUI();//调用ShowUI
	}
	//创建窗体界面
	public void ShowUI(){
		JFrame ShowFrame= new JFrame("展示界面");
		ShowFrame.setSize(800,800);//设置窗体尺寸
		ShowFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭即退出
		ShowFrame.setLocationRelativeTo(null);
		ShowFrame.setVisible(true);//可视化
	    Graphics g = ShowFrame.getGraphics();//画笔从窗口获取对象
	    System.out.println(g);
	    drawLine(3,g,400,50,500);//调用下面的drawLine
	}

接下来利用递归思想画谢宾斯基三角形,drawLine中有几个参数,循环次数、画笔、顶点x坐标、顶点y坐标、正三角形边长。
顶点坐标(x,y)左顶点(x-lengthsin30,y+lengthcos30)
右顶点(x+lengthsin30,y+lengthcos30)
再取每条边中点,进行连接划线,以此类推,随着count不断递减,if循环结束,即退出了递归

	public void drawLine(int count,Graphics g,int x,int y,int length){
		if(count<0){
			return;
		}
		count--;
		int x1=x-length/2;
		double x2=x+length/2;
		double y1=y+length*Math.sqrt(3)/2;
		double y2=y+length*Math.sqrt(3)/2;
		//强制整型
		int x11=(int)x1;
		int x21=(int)x2;
		int y11=(int)y1;
		int y21=(int)y2;
		//画三角形
		g.drawLine(x11, y11, x21, y21);
		g.drawLine(x, y, x21, y21);
		g.drawLine(x11,y11,x,y);
		//取一边的中点
		int x3=(x+x11)/2;
		int y3=(y+y11)/2;
		int x4=(x+x21)/2;
		int y4=(y+y21)/2;
		int x5=(x11+x21)/2;
		int y5=(y11+y21)/2;
		//画中间倒三角形
		g.drawLine(x3, y3, x4, y4);
		g.drawLine(x3, y3, x5, y5);
		g.drawLine(x4,y4,x5,y5);
		//递延0.2s
		try {
			Thread.sleep(20);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		drawLine(count,g, x,y,length/2);
		drawLine(count,g, x3,y3,length/2);
		drawLine(count,g, x4,y4,length/2);
		}
		
		}

赛尔平斯基地毯

递归--谢宾斯基三角形、赛尔平斯基地毯
注意看图片,将一个大正方形分为9格,实心正方形在中间,其余八个再接着分成9个小正方形,并且中间为实心正方形,以此类推。

	public static void main(String[] args) {
		Demorect frame = new Demorect();
		frame.ShowUI();
	}
	public void ShowUI() {
		// 创建窗体界面
		JFrame ShowFrame = new JFrame("实心正方形");
		ShowFrame.setSize(800, 800);
		ShowFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		ShowFrame.setLocationRelativeTo(null);
		ShowFrame.setVisible(true);
		Graphics g = ShowFrame.getGraphics();
		System.out.println(g);
		drawMyrect(g, 50, 50, 500, 500, 3);
	}
	

递归思想,每个大正方形顶点为(x,y)中间的小正方形为实心,如此小正方形顶点应该为(x+w/3, y+h/3),边长为w/3、h/3。此处递归用到for循环。

public void drawMyrect(Graphics g,int x,int y,int w,int h,int count) {
		if(count<0){
			return;
		}
		count--;
		g.fillRect(x+w/3, y+h/3, w/3, h/3);
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	    int i=0;
	    int j=0;
		for(i=0;i<3;i++){
			for(j=0;j<3;j++){
			drawMyrect(g,x+i*w/3, y+j*h/3, w/3, h/3,count);
			}
相关标签: java