画完三角形再画谢尔宾斯基地毯

画完三角形再画谢尔宾斯基地毯照样废话不说,看代码看注释importjava.awt.Color;importjava.awt.Dimension;importjava.awt.Graphics;importjava.awt.Toolkit;importjava.awt.event.MouseAdapter;importjava.awt.event.MouseEvent;import…

大家好,又见面了,我是你们的朋友全栈君。

照样废话不说,看代码看注释

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 *通过递归画出谢尔宾斯基地毯
 * @author LONG
 *
 */
public class Retc extends JFrame {
	/**
	 * 
	 */
	private Dimension di = null;		//声明Dimension类型的变量,来储存屏幕的尺寸
	private Graphics gr = null;		//声明画布类型变量,来储存面板的画布对象
	private boolean isSuccessful = true;	//用来判断最外面的边框是否已经连接
	private static final long serialVersionUID = 1L;
	
	/**
	 * 程序主函数
	 * @param args
	 */
	public static void main(String[] args){
		Retc ke = new Retc();
		ke.showFrame();
	}
	
	/**
	 * 展示窗体,设置窗体的函数,包括得到画布和添加监听器等
	 */
	public void showFrame(){
		this.setTitle("谢尔宾斯基地毯");
		Toolkit tl = Toolkit.getDefaultToolkit();		//得到工具箱
		di = tl.getScreenSize();					//得到屏幕尺寸
		this.setSize(di.width,di.height);		//设置窗体大小,和屏幕大小一样
		this.setDefaultCloseOperation(3);			//设置窗体退出时关闭
		
		JPanel jp_draw = new JPanel();				//创建绘画时会用到的面板
		jp_draw.setPreferredSize(new Dimension(di.width,di.height));			//设置面板的大小和窗体的大小一样
		jp_draw.setBackground(Color.WHITE);			//将背景色设为白色
		this.setResizable(false);				//不可改变窗体的大小
		this.add(jp_draw);				//将面板添加到窗体上
		this.setVisible(true);				//将窗体可视化,然后再得到画布
		
		gr = jp_draw.getGraphics();			//得到面板上的画布对象
		jp_draw.addMouseListener(new MouseAdapter(){		//给面板添加鼠标监听器
			public void mousePressed(MouseEvent e){
				doSomething();		//调用初始化的函数
			}
		});
	}
	
	/**
	 * 初始化整个窗体,因为在调用递归时有差别,所以单独列出来
	 */
	public void doSomething(){
		draw(0,0,di.width,di.height);
	}
	
	/**
	 * 用于实现递归的函数
	 * @param x1	矩形块的左上角x坐标
	 * @param y1	矩形块的左上角y坐标
	 * @param x2	矩形块的右下角x坐标
	 * @param y2	矩形块的右下角y坐标
	 */
	public void draw(int x1,int y1,int x2,int y2){
		//为了清楚看见进行的过程,使用线程控制
		try {
			Thread.sleep(1);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		
		//判断语句,来判断是否已经将最外面的边框连接起来,如果已经连接,则让isSuccessful为false
		if(isSuccessful){
			gr.drawLine(x1, y1, x1, y2);
			gr.drawLine(x1, y1, x2, y1);
			gr.drawLine(x1, y2, x2, y2);
			gr.drawLine(x2, y1, x2, y2);
			isSuccessful = false;
		}
		
		//用来终止递归的判断条件,通过判断矩形两个对角的横坐标之差是否大于10个像素,如果小于等于,则终止
		//如果不进行终止,则会出现栈溢错误
		if(Math.abs(x2 - x1) > 10){
			
			int p_x1 = (x2 - x1)/3 + x1;		//计算得到矩形上边三分之一处的x坐标
			int p_y1 = y1;						//计算得到矩形上边三分之一处的y坐标
			
			int p_x2 = (x2 - x1)*2/3 + x1;		//计算得到矩形上边三分之二处的x坐标
			int p_y2 = y1;					//计算得到矩形上边三分之二处的y坐标
			
			int p_x3 = x2;					//计算得到矩形右边三分之一处的x坐标,和x2的x坐标相同
			int p_y3 = (y2 - y1)/3 + y1;		//计算得到矩形右边三分之一处的y坐标
			
			int p_x4 = x2;						//计算得到矩形右边三分之二处的x坐标
			int p_y4 = (y2 - y1)*2/3 + y1;		//计算得到矩形右边三分之二处的y坐标
			
			//连接上面得到和可以推出的点,将原来的矩形分为九块
			gr.drawLine(p_x1, p_y1, p_x1, y2);
			gr.drawLine(p_x2, p_y2, p_x2, y2);
			gr.drawLine(p_x3, p_y3, x1, p_y3);
			gr.drawLine(p_x4, p_y4, x1, p_y4);
			//将中心处的矩形填充起来,为了绚烂用随机颜色
			gr.setColor(new Color((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255)));
			gr.fillRect(p_x1, p_y3, Math.abs(p_x2 - p_x1), Math.abs(p_y4 - p_y3));
			
			draw(x1,y1,p_x1,p_y3);			//递归画出左上角第一个
			draw(p_x1,p_y1,p_x2,p_y3);	//递归画出上边中间那个矩型
			draw(p_x2,p_y2,p_x3,p_y3);	//递归画出右上角的那个矩形
			draw(p_x2,p_y3,p_x4,p_y4);	//递归画出右边中间那一个
			draw(p_x2,p_y4,x2,y2);		//递归画出右下角那一个矩形
			draw(p_x1,p_y4,p_x2,y2);		//递归画出下面中间那一个
			draw(x1,p_y4,p_x1,y2);		//递归画出左下角那一个矩形
			draw(x1,p_y3,p_x1,p_y4);	//递归画出左边中间那一个矩形
		}
		
		
	}
}

 。。。嘿嘿

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/158458.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 推荐|Python开源自动化运维平台[通俗易懂]

    推荐|Python开源自动化运维平台[通俗易懂]Python开源自动化运维平台介绍:开源免费,轻量级,适用于中小企业的轻量自动化运维管理平台Spug仓库地址:https://github.com/openspug/spug特性:批量执行:命令可以在线批量执行在线终端:主机支持浏览器在线终端登录任务计划:灵活的任务计划发布部署:支持自定义发布流程配置中心:支持KV、文本、json等格式的配置监控中心:支持站点、端口、进程、自定义等监控报警中心:支持短信、邮件、钉钉、微信等报警方式优雅美观:基于AntDesign

  • Idea激活码永久有效Idea2017.1.6激活码教程-持续更新,一步到位[通俗易懂]

    Idea激活码永久有效Idea2017.1.6激活码教程-持续更新,一步到位[通俗易懂]Idea激活码永久有效2017.1.6激活码教程-Windows版永久激活-持续更新,Idea激活码2017.1.6成功激活

  • mybatishelperpro激活码_在线激活

    (mybatishelperpro激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html2K…

  • 使用VSCode编写的代码中文乱码的解决方案【临时+永久】

    使用VSCode编写的代码中文乱码的解决方案【临时+永久】问题描述这是由于编码不同而造成的问题,何为编码?常见的如Uncoide,UTF-8,UTF-16,GB2312,GBK,GB18030VSCode默认的文件编码是UTF-8,而你要用C/C++打印中文在屏幕上时就会出现错误。因为打印时中文的输出编码是GBK或者GB18030或者GB2312,就会导致出错。简单来说就是,我用中文,你用英文,当然无法理解了。解决方法临时修改在VSCode状态栏处,你会看到一个UTF-8的字样,点击它,修改为GBK,GB18030或GB231

  • goland 2021.5 激活码(最新序列号破解)

    goland 2021.5 激活码(最新序列号破解),https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • json对象与json字符串_字符数组与字符串的区别

    json对象与json字符串_字符数组与字符串的区别JSON对象有时候在做项目的时候时常将这两个概念弄混淆,尤其是在使用springmvc的时候,后台@RequestBody接受的是一个json格式的字符串,一定是一个字符串。先介绍一下json对象,首先说到对象的概念,对象的属性是可以用:对象.属性进行调用的。例如:varperson={“name”:”tom”,”sex”:”男”,”age”:”24″}//json对象console.l

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号