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

Java学习日记:UI篇(6)–谢尔宾斯基地毯图Java 学习日记 UI 篇 6 谢尔宾斯基地毯图引言 谢尔宾斯基地毯是数学家谢尔宾斯基提出的一个分形图形 谢尔宾斯基地毯和谢尔宾斯基三角形基本类似 不同之处在于谢尔宾斯基地毯采用的是正方形进行分形构造 而谢尔宾斯基三角形采用的等边三角形进行分形构造 谢尔宾斯基地毯和它本身的一部分完全相似 减掉一块会破坏自相似性 来自百度百科 是不是还不知道它是啥东西 没事 来张图看看 有密集恐惧症者慎入 思路 nbsp nbsp nbsp nbsp nbsp nbsp nbsp

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 
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);//绘画正方形  } 
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 = 1s try { 
    Thread.sleep(200); } catch (InterruptedException e) { 
    // TODO Auto-generated catch block e.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,0 drawMySher1(g,x+width/3,y,width/3,height/3,n);//1,0 drawMySher1(g,x+2*width/3,y,width/3,height/3,n);//2,0  /。。。 } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217412.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午9:37
下一篇 2026年3月18日 上午9:38


相关推荐

  • C语言的printf输出格式

    C语言的printf输出格式1、控制小数点后有多少位:printf(“%.10lf\n”,f_a); //将浮点数f_a输出时,输出其小数点后10位,默认是输出小数点后6位。2、控制一共(小数点前后以及小数点)输出多少位:printf(“%10.7f\n”,f_b); //将浮点数f_b输出时,输出其小数点前2位,小数点后7位(加上小数点共10位)。3、输出时让正数带”+”号,负数带”-“号:printf(“%+f\

    2022年7月24日
    18
  • 《使用Nsis打包安装程序》[通俗易懂]

    《使用Nsis打包安装程序》[通俗易懂]NSIS(NullsoftScriptableInstallSystem)打包python安装程序教程

    2025年8月10日
    4
  • vue的$attrs_vue获取list集合中的对象

    vue的$attrs_vue获取list集合中的对象​说明本文用示例介绍Vue的$attrs和$listener的用法官网API—Vue.js$attrs和$listeners介绍Vue2.4中,引入了attrs和listeners,新增了inheritAttrs选项。$attrs:包含了父作用域中没有被prop接收的所有属性(不包含class和style属性)。可以通过v-bind=”$attrs”直接将这些属性传入内部组件。$

    2022年8月31日
    6
  • excel导入mysql后会多了0_Excel导入MySQL数据出现

    excel导入mysql后会多了0_Excel导入MySQL数据出现点击 import 则数据导入表格成功 结果如下所示导入的 MySQL 数据错列问题 当导入 fct sales item 的时候发现 数据存在一个错列有问题 也就是对比 MySQL 数据库原表的列的顺序 会发现该表的表头与数据库中原表的字段列不一样 当导入数据时候 excel 会对原表头进行重新排序 本案例中 导入的数据表头是按字段名称的英文字母的升序顺序 而不是按原来数据表中的字段顺序 这会导致当导入的数据出

    2026年3月17日
    1
  • 怎么做app软件_软件限制设备登录怎么激活成功教程

    怎么做app软件_软件限制设备登录怎么激活成功教程项目描述客户端,基于H5Plus使用MUI框架开发的APP,运行环境为小米手机真机测试。服务端,使用SpringBoot搭建的项目,运行环境为SpringBoot内置Tomcat,部署端口为8090。问题分析电脑和手机连接同一个WiFi,手机点击按钮,触发Ajax请求,无法访问在笔记本电脑上部署的SpringBoot后台。原Ajax请求地址,使用的是localhost,打开电脑cmd窗口,输入ipconfig查询电脑的ipv4地址,修改localhost为电脑私网IP。mui.ajax(“ht

    2025年9月22日
    9
  • Maven 菜鸟教程 1 安装和配置[通俗易懂]

    Maven 菜鸟教程 1 安装和配置[通俗易懂]统一管理jar文件,自动处理jar文件之间的依赖关系统一项目的目录结构,对于不同IDE软件(如Eclipse,IntelliJIDEA)是透明的自动构建:打包,部署,升级jar文件简单方便

    2025年10月8日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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