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

引言:谢尔宾斯基地毯是数学家谢尔宾斯基提出的一个分形图形,谢尔宾斯基地毯和谢尔宾斯基三角形基本类似,不同之处在于谢尔宾斯基地毯采用的是正方形进行分形构造,而谢尔宾斯基三角形采用的等边三角形进行分形构造。谢尔宾斯基地毯和它本身的一部分完全相似,减掉一块会破坏自相似性。(来自百度百科)

是不是还不知道它是啥东西?没事,来张图看看:(有密集恐惧症者慎入)

思路:

方法1:

~~~~~~~       一个实心正方形划分为9个小正方形,为中间的小正方形涂上颜色(使得可见,所以你觉得什么颜色会让它最好看?),再对余下的小正方形重复这一操作便能得到谢尔宾斯基地毯。
~~~~~~~       显而易见,这是一个迭代的过程,我们不断的重复之前的动作,多次以后,我们就可以得到谢尔宾斯基地毯图了。
看到这里你有想法了吗?
~~~~~~~       
~~~~~~~       
我们来试一下在正中心画一个正方形:

int x0=100,y0=50,width=300,height=300;
g.drawRect(x0, y0, width, height);//最外面的方框
g.fillRect(x0+width/3,y0+ height/3, width/3, height/3);//中心的正方形

~~~~~~~       
~~~~~~~       x0、y0为方框左上角坐标,width、height分别为方框宽度和高度。根据思路里面说到的,将大的方框分为9个小正方形,所以中心正方形为方框的1/3。
~~~~~~~       
现在我们已经做完了第一次操作了,接下来就是将它周围的八个正方形做同样的处理。我们可以一个个画,如下:

g.fillRect(x0+0*width/3+width/9,y0+0*height/3+height/9, width/9, height/9);//0,0
g.fillRect(x0+1*width/3+width/9,y0+0*height/3+height/9, width/9, height/9);//1,0
g.fillRect(x0+2*width/3+width/9,y0+0*height/3+height/9, width/9, height/9);//2,0
g.fillRect(x0+0*width/3+width/9,y0+1*height/3+height/9, width/9, height/9);//0,1
g.fillRect(x0+2*width/3+width/9,y0+1*height/3+height/9, width/9, height/9);//2,1
g.fillRect(x0+0*width/3+width/9,y0+2*height/3+height/9, width/9, height/9);//0,2
g.fillRect(x0+1*width/3+width/9,y0+2*height/3+height/9, width/9, height/9);//1,2
g.fillRect(x0+2*width/3+width/9,y0+2*height/3+height/9, width/9, height/9);//2,2

看到这里发现什么规律了吗?我们画正方形的方法为:g.fillRect(x, y, width, height);,所以仔细看上面的代码,是不是每一次的x、y都在变化,而且是有规律的变化,增加width/3,height/3。参考下图,可以让你更容易理解为什么是增加width/3,height/3。

所以我们可以采取如下的方法来代替这一串代码:

for(int k=0;k<=2;k++) {   //改变纵坐标for(int j=0;j<=2;j++) {//改变横坐标g.fillRect(x0+j*width/3+width/9,y0+k*height/3+height/9, width/9, height/9);//绘画正方形  }

试试看交换两个for循环,是不是绘制顺序发生了改变?
~~~~~~~       
~~~~~~~       
接下来,我们进行层数嵌套:

int x0=100,y0=50,width=300,height=300;
g.drawRect(x0, y0, width, height);//最外面的方框
g.fillRect(x0+width/3,y0+ height/3, width/3, height/3);//中心的正方形
//开始切分
int n;//定义切分层数
for(int i=2;i<=n;i++){int a=(int) Math.pow(3, i);//这里用调整正方形宽度比例(1/9,1/27...)int b=(int) Math.pow(3, i-1);//间隔比例for(int k=0;k<=Math.pow(3, i-1)-1;k++) {    //改变纵坐标for(int j=0;j<=Math.pow(3, i-1)-1;j++) {//改变横坐标g.fillRect(x0+j*width/b+width/a,y0+k*height/b+height/a, width/a, height/a);//绘画}}
}

到此,我们便画出了如篇首的图像。为了让我们的过程更好,我们可以加入如下语句:

//加入判断语句,来跳过每一区域中心部分(已被上一级的正方形所覆盖,所以不需要再画了)
if(k==Math.pow(3,i-1)-2&&j==Math.pow(3,i-1)-2) {continue;//跳过中间的不画}
else{g.fillRect(x0+j*width/b+width/a,y0+k*height/b+height/a, width/a, height/a);//绘画//这里是让我们画图延迟一定时间,这样我们就可以清楚的看到画图的过程,1000 = 1stry {Thread.sleep(200);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}
}

~~~~~~~       
方法2
上面我们采用的是循环来绘制图形,接下面我们使用迭代来完成它。
思路
构建一个绘制方法,然后用这个方法对自己进行调用,达到迭代的目的,绘出整个图形。

public void drawMySher1(Graphics g,int x,int y,int width,int height,int n) {     if(n<=0) { return;//当n<=0,结束此次调用,运行后面的代码}g.fillRect(x+width/3, y+height/3, width/3, height/3);//绘制n--;                      drawMySher1(g,x,y,width/3,height/3,n);//0,0drawMySher1(g,x+width/3,y,width/3,height/3,n);//1,0drawMySher1(g,x+2*width/3,y,width/3,height/3,n);//2,0       /。。。}

这里只是给出部分代码以作示例,重要的是思路。如果大家有什么想法的,欢迎一起讨论。
~~~~~~~       
~~~~~~~       ~~~~~~~       
~~~~~~~       
画图需要在界面上实现,如果有不清楚的可前往UI篇(1)。

Java学习日记:UI篇(6)--谢尔宾斯基地毯图相关推荐

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

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

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

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

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

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

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

    照样废话不说,看代码看注释 import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import jav ...

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

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

  6. python与分形0009 - 谢尔宾斯基地毯

    分形介绍 分形是一个悖论. 它惊人的简单,却又无限的复杂. 它很新,却又比尘埃更古老. 分形是什么?它们是从哪里来的?我们为什么要在乎? 20世纪非传统的数学家Benoit Mandelbrot在19 ...

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

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

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

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

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

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

最新文章

  1. 文字转语音引擎未就绪_5个文字转语音网站,其中最强堪比真人发音
  2. 平衡二叉树的构造_LeetCode-平衡二叉树
  3. dml语句包括哪些_聊聊MySQL基本操作DDL,DML,DQL,DCL
  4. python中的画布背景设置_教你用python画图—Turtle详细教程
  5. catia func 三菱后处理_20款三菱帕杰罗V97奢华SUV 津港促销价_搜狐汽车
  6. 36.母板的介绍与使用
  7. java循环队列_Java版-数据结构-队列(循环队列)
  8. likely,unlikely宏与GCC内建函数__builtin_expect()
  9. 20050611:超级伙伴?
  10. Linux install sogou input method
  11. 今日头条的针锋相对让腾讯开始焦虑,天天快报能否占据一席之位?
  12. HttpClient4模拟表单提交
  13. 原来姹紫嫣红开遍 -- 牡丹亭·游园惊梦
  14. Kali使用中文输入法
  15. wps2019数据分析加载项_wps单因素分析数据 wps2019单因素方差分析
  16. SQL零基础入门学习(九)
  17. 送给1985年的朋友 ZT
  18. 数字沙盘虚拟电子沙盘开发教程第9课
  19. 腾讯云免费ssl证书安装(apache)
  20. 以太坊(Ethereum) - Ganache本地区块链

热门文章

  1. PHP使用jwt验证
  2. 【无标题】180-187笔记1月19日李游精品前端课程笔记
  3. ipv6单播地址包括哪两种类型_【思唯网络学院】CCNP知识点总结——IPv6
  4. 运维避免系统故障心得
  5. jpg图片怎么改大小kb?如何压缩jpg图片大小?
  6. 见证产品成长,共享AI力量!
  7. 一个简陋的文字计数器
  8. 计算机桌面变小,电脑桌面变小了怎么办
  9. 数据库字段非空(null的缺点)
  10. http,socks4,socks5代理的区别