大家好,又见面了,我是你们的朋友全栈君。
照样废话不说,看代码看注释
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账号...