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

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为falseif(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);  //递归画出左边中间那一个矩形}}
}

。。。嘿嘿

画完三角形再画谢尔宾斯基地毯相关推荐

  1. 关于谢尔宾斯基地毯的讲解

    和谢尔宾斯基三角形一样,谢尔宾斯基地毯也是数学家谢尔宾斯基提出的一个分形图形,谢尔宾斯基地毯和谢尔宾斯基三角形基本类似,不同之处在于谢尔宾斯基地毯采用的是正方形进行分形构造,而谢尔宾斯基三角形采用的等 ...

  2. 按钮动作监听器和鼠标监听器的同时实现,在画图板上画出三角形,射线,曲笔,谢尔宾斯基三角形,谢尔宾斯基地毯Random类的实现,数组的实现,Thread.sleep的实现

    按钮动作监听器和鼠标监听器的实现 实例化 实现 监听器的类 DrawListener dl = new DrawListener();// 在界面上添加鼠标监听器对象(鼠标监听器的对象可以是界面和按钮 ...

  3. Java面向对象编程:利用递归思想绘制“谢尔宾斯基地毯”和“谢尔宾斯基三角形”

    1.递归:在方法中调用本方法. 2.递归调用会无限循环下去,因此方法体中必须有结束方法的条件.返回值为void时通常写为: if (条件) {return; } 下面使用递归绘制"谢尔宾斯基 ...

  4. OpenGL进阶(七)-康托尔集 谢尔宾斯基地毯 Koch雪花

    这一篇关于分形图像,当然只是入门. 分形通常被定义为"一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状",即具有自相似的性质.分形有几种类型 ...

  5. Java学习日记:UI篇(6)--谢尔宾斯基地毯图

    Java学习日记:UI篇(6)–谢尔宾斯基地毯图 引言:谢尔宾斯基地毯是数学家谢尔宾斯基提出的一个分形图形,谢尔宾斯基地毯和谢尔宾斯基三角形基本类似,不同之处在于谢尔宾斯基地毯采用的是正方形进行分形构 ...

  6. Python实验舱谢尔宾斯基地毯绘制教程

    谢尔宾斯基地毯,和谢尔宾斯基三角形相似,下图就是谢尔宾斯基地毯 一,起始代码 p.width(3) p.speed(10) import turtle n=int(input()) base=int( ...

  7. 谢尔宾斯基地毯的讲解

    谢尔宾斯基地毯是数学家谢尔宾斯基提出的一个分形图形,谢尔宾斯基地毯和谢尔宾斯基三角形基本类似,不同之处在于谢尔宾斯基地毯采用的是正方形进行分形构造,而谢尔宾斯基三角形采用的等边三角形进行分形构造.谢尔 ...

  8. 陈斌老师《数据结构与算法Python版》第五周作业——ASCII谢尔宾斯基地毯

    陈斌老师<数据结构与算法Python版>第五周作业--ASCII谢尔宾斯基地毯 题目 思路 程序如下 总结 题目 谢尔宾斯基地毯是形如上图的正方形分形图案,每个地毯可分为等大小的9份,其中 ...

  9. python数据结构与算法40题_Python数据结构与算法40:递归编程练习题3:ASCII谢尔宾斯基地毯...

    注:本文如涉及到代码,均经过Python 3.7实际运行检验,保证其严谨性. 本文阅读时间约为7分钟. 递归编程练习题3:ASCII谢尔宾斯基地毯 谢尔宾斯基地毯 谢尔宾斯基地毯是形如上图的正方形分形 ...

最新文章

  1. wcf系列学习5天速成——第五天 服务托管
  2. Java—List的用法与实例详解
  3. libreoffice error while loading shared libraries: libSM.so.6: cannot open shared object
  4. HDU 3001 三进制状压DP
  5. Undefined symbols for architecture x86_64:
  6. 解码H264视频出现花屏或马赛克的问题
  7. python身份证号码校验
  8. 百度webuploader上传到阿里OSS
  9. 5g多卡聚合路由器/5g多卡汇聚路由器,多网融合,弱网通信,多卡聚合路由器,5G多卡聚合路由,工业路由器,移动物联,商用路由, 视频直播, 融合通讯, 多链路聚合,5G多卡聚合,5G多链路聚合
  10. 360手机怎样更新系统版本android,360手机N5迎来安卓7.0稳定版升级
  11. 如何区分PNP型和NPN型?
  12. 显示隐藏图片html,JavaScript实现显示和隐藏图片
  13. m3u8文件里只有js链接,没有ts链接,和key文件的一点记录
  14. HTML 打印table分页
  15. 开源中国iOS客户端学习——(十二)用户登陆
  16. pygame中人物上下左右移动及翻转,背景透明化
  17. 51单片机——单片机基础知识
  18. 钉钉windows版屏蔽已读
  19. java date.getdate_java – 获取昨天 – 不推荐使用Date类型的方法getDate()
  20. webrtc 海思芯片解码出错的解决办法

热门文章

  1. .Net性能测试工具BenchmarkDotnet
  2. C# 线程安全集合类
  3. Allegro 添加汉字
  4. RegisterHotKey 热键的使用
  5. 第一次使用IDEA提交项目到码云
  6. 4.1 小红书的涨粉逻辑是什么?【玩赚小红书】
  7. extremedb java_实时内存数据库eXtremeDB 在linux系统下的java开发环境搭建
  8. 新手必看:Photoshopnbsp;165条实操技巧
  9. 台式计算机图片,台式机怎么样截图
  10. 4月22日绝地求生服务器维护中,绝地求生5月22日更新服务器繁忙怎么办 吃鸡5月22日更新内容...