很有趣的Java分形绘制

部分与整体以某种形式相似的形,称为分形。首先我们举个例子:我们可以看到西兰花一小簇是整个花簇的一个分支,而在不同尺度下它们具有自相似的外形。换句话说,较小的分支通过放大适当的比例后可以得到一个与整体

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

部分与整体以某种形式相似的形,称为分形。
首先我们举个例子:
       我们可以看到西兰花一小簇是整个花簇的一个分支,而在不同尺度下它们具有自相似的外形。换句话说,较小的分支通过放大适当的比例后可以得到一个与整体几乎完全一致的花簇。因此我们可以说西兰花簇是一个分形的实例。
分形一般有以下特质:
在任意小的尺度上都能有精细的结构; 太不规则,以至难以用传统欧氏几何的语言描述; (至少是大略或任意地)自相似豪斯多夫维数会大於拓扑维数; 有著简单的递归定义。
(i)分形集都具有任意小尺度下的比例细节,或者说它具有精细的结构。
(ii)分形集不能用传统的几何语言来描述,它既不是满足某些条件的点的轨迹,也不是某些简单方程的解集。
(iii)分形集具有某种自相似形式,可能是近似的自相似或者统计的自相似。
(iv)一般,分形集的“分形维数”,严格大于它相应的拓扑维数。
(v)在大多数令人感兴趣的情形下,分形集由非常简单的方法定义,可能以变换的迭代产生。
 
用java写分形时,不同的图形根据不同的画法调用递归来实现,如:
科赫曲线:
 1 public void draw1(int x1, int y1, int x2, int y2,int depth) {//科赫曲线   keleyi.com
 2         g.drawLine(x1, y1, x2, y2);  
 3         if (depth<=1)  
 4             return;  
 5         else {//得到三等分点  
 6             double x11 = (x1 * 2  + x2)  / 3;  
 7             double y11 = (y1 * 2  + y2) / 3;  
 8   
 9             double x22 = (x1 + x2 * 2) / 3;  
10             double y22 = (y1 + y2 * 2) / 3;  
11   
12             double x33 = (x11 + x22) / 2 - (y11 - y22) * Math.sqrt(3) / 2;  
13             double y33 = (y11 + y22) / 2 - (x22 - x11) * Math.sqrt(3) / 2;  
14   
15             g.setColor(j.getBackground());  
16             g.drawLine((int) x1, (int) y1, (int) x2, (int) y2);  
17             g.setColor(Color.black);  
18             draw1((int) x1, (int) y1, (int) x11, (int) y11,depth-1);  
19             draw1((int) x11, (int) y11, (int) x33, (int) y33,depth-1);  
20             draw1((int) x22, (int) y22, (int) x2, (int) y2,depth-1);  
21             draw1((int) x33, (int) y33, (int) x22, (int) y22,depth-1);  
22         }  
23     } 

正方形:

 1 public void draw2(int x1, int y1, int m,int depth) {//正方形 keleyi.com  
 2         g.fillRect(x1, y1, m, m);  
 3         m = m / 3;  
 4         if (depth<=1)  
 5             return;  
 6         else{  
 7         double x11 = x1 - 2 * m;  
 8         double y11 = y1 - 2 * m;  
 9   
10         double x22 = x1 + m;  
11         double y22 = y1 - 2 * m;  
12   
13         double x33 = x1 + 4 * m;  
14         double y33 = y1 - 2 * m;  
15   
16         double x44 = x1 - 2 * m;  
17         double y44 = y1 + m;  
18   
19         double x55 = x1 + 4 * m;  
20         double y55 = y1 + m;  
21   
22         double x66 = x1 - 2 * m;  
23         double y66 = y1 + 4 * m;  
24   
25         double x77 = x1 + m;  
26         double y77 = y1 + 4 * m;  
27   
28         double x88 = x1 + 4 * m;  
29         double y88 = y1 + 4 * m;  
30   
31         draw2((int) x11, (int) y11, (int) m,depth-1);  
32   
33         draw2((int) x22, (int) y22, (int) m,depth-1);  
34   
35         draw2((int) x33, (int) y33, (int) m,depth-1);  
36   
37         draw2((int) x44, (int) y44, (int) m,depth-1);  
38   
39         draw2((int) x55, (int) y55, (int) m,depth-1);  
40   
41         draw2((int) x66, (int) y66, (int) m,depth-1);  
42   
43         draw2((int) x77, (int) y77, (int) m,depth-1);  
44   
45         draw2((int) x88, (int) y88, (int) m,depth-1);  
46         }  
47   
48     }  

谢冰斯基三角形:

 1 public void draw3(int x1,int y1,int x2,int y2,int x3,int y3,int depth){//三角形   keleyi.com
 2           
 3         double s = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));  
 4         g.drawLine(x1,y1,x2,y2);  
 5         g.drawLine(x2,y2,x3,y3);  
 6         g.drawLine(x1,y1,x3,y3);  
 7 //      if(s<3)  
 8 //          return;  
 9         if (depth<=1)  
10             return;  
11         else  
12         {  
13         /* 
14          * 上面的三角形 
15          */  
16         double x11=(x1*3+x2)/4;  
17         double y11=y1-(s/4)*Math.sqrt(3);  
18           
19         double x12=(x1+x2*3)/4;  
20         double y12=y11;  
21           
22         double x13=(x1+x2)/2;  
23         double y13=y1;  
24           
25         /* 
26          * 左边的三角形 
27          */  
28         double x21=x1-s/4;  
29         double y21=(y1+y3)/2;  
30           
31         double x22=x1+s/4;  
32         double y22=y21;  
33           
34         double x23=x1;  
35         double y23=y3;  
36           
37         /* 
38          * 右边的三角形 
39          */  
40         double x31=x2+s/4;  
41         double y31=(y1+y3)/2;  
42           
43         double x32=x2-s/4;  
44         double y32=y21;  
45           
46         double x33=x2;  
47         double y33=y3;  
48           
49           
50         draw3((int)x11,(int)y11,(int)x12,(int)y12, (int)x13, (int)y13, depth-1);  
51         draw3((int)x21,(int)y21,(int)x22,(int)y22, (int)x23, (int)y23, depth-1);  
52         draw3((int)x31,(int)y31,(int)x32,(int)y32, (int)x33, (int)y33, depth-1);  
53         }  
54     } 

很有趣的Java分形绘制

科赫曲线是一种外形像雪花的几何曲线,所以又称为雪花曲线,它是分形曲线中的一种,具体画法如下:

1、任意画一个正三角形,并把每一边三等分;
2、取三等分后的一边中间一段为边向外作正三角形,并把这“中间一段”擦掉;
3、重复上述两步,画出更小的三角形。
4、一直重复,直到无穷,所画出的曲线叫做科赫曲线。

小结:分形是个很好玩的东西,根据自己的奇妙想象可以画出很多很好看的图形,不仅仅是已经存在的,你可以创造出属于你自己的图形!

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 菜鸟眼中的三层架构[通俗易懂]

    菜鸟眼中的三层架构[通俗易懂]菜鸟眼中的三层架构

    2022年4月24日
    43
  • java int最大值和最小值_excel中求最大值和最小值

    java int最大值和最小值_excel中求最大值和最小值Java中Integer的最大值和最小值.JavaByte的最大值和最小值.Javafloat的最大值和最小值.Javalong的最大值和最小值.

    2025年10月7日
    2
  • 用docker部署jar包_war包和jar包部署区别

    用docker部署jar包_war包和jar包部署区别对于springboot项目运行,直接是java-jar的方式运行,如果想要放到docker中运行,有三种方式:方式一:1.上传jar到服务器的指定目录2.在该目录下创建Dockerfile文件viDockerfile3.然后将下面的内容复制到Dockerfile文件中FROMjava:8MAINTAINERbin…

    2022年10月19日
    5
  • BloomFilter怎么用?使用布隆过滤器来判断key是否存在?「建议收藏」

    BloomFilter怎么用?使用布隆过滤器来判断key是否存在?「建议收藏」今天跟一个同事聊了一个问题,说最近在做推荐,如何判断用户是否看过这个片段呢?想了一下,正好可以使用布隆过滤器来完成这个需求。布隆,可不是LOL的布隆。我们的这个布隆是一个叫布隆的外国人,在1970年提出的一种方案:如果判断这个key不存在,那么就一定不存在,如果key存在,那么有可能不存在。所以不存在的时候,你永远可以详细布隆。布隆过滤器是一个高空间利用率的概率性数据结构,由BurtonBloom于1970年提出,用于测试一个元素是否在集合中。新创建的布隆过滤器是一串被置为0的Bit数组(假设有m位),

    2025年6月1日
    3
  • PyCharm for Anaconda

    PyCharm for AnacondaPyCharmforAnaconda新版本的特点智能Python帮助 PyCharm提供了智能代码完成、代码检查、动态错误突出显示和快速修复,以及自动化的代码重构和丰富的导航功能。 Web开发框架 PyCharm为现代web开发框架(如Django、Flask、Google应用程序引擎、Pyramid和web2py)提供了强大的特定于框架的支持。 科学工具(新版本的)…

    2022年8月29日
    7
  • MIPI协议简介

    MIPI协议简介MIPI协议简介 介绍 MIPI联盟定义了一套接口标准,把移动设备内部的接口如摄像头、显示屏、基带、射频接口等标准化,从而增加设计灵活性,同时降低成本、设计复杂度、功耗和EMI。未来的产品都将朝着移动的方向发展,例如智能手机、数码相机、摄像机、平板电脑、媒体播放器、游戏机等,这些产品需要能执行多任务,包括处理多个不同的传感器如麦克风、图像传感器、磁罗盘、三轴加速度计和精细的触摸屏…

    2022年4月28日
    61

发表回复

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

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