很有趣的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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JavaScript 数组排序【六大方法】「建议收藏」

    JavaScript 数组排序【六大方法】「建议收藏」文章目录数组排序sort()方法冒泡排序选择排序插入排序快速排序希尔排序数组排序排序,就是把一个乱序的数组,通过我们的处理,让他变成一个有序的数组1.sort()方法sort()数组对象排序其原理是冒泡排序reverse()方法能够颠倒数组元素的排列顺序例如:vararr=[3,1,5,6,4,9,7,2,8];varasc=arr.sort()console.log(asc); //1,2,3,4,5,6,7,8,9vardesc=asc.

    2022年6月12日
    30
  • 我的fvwm配置

    我的fvwm配置 用了gnome和xfce,还是有些厌了,摆弄了两天fvwm,发现虽然配置起来有点麻烦,但用起来还是它最贴心,而且占资源极少,系统使用过程中内存一直只用了五六十兆。我的鼠标左键坏了,但是通过配置fvwm,只用鼠标右键也可以完成大多数工作了。下面是我的截图和配置文件: #################jiqingsfvwm2rc#2008-07-08############

    2022年10月3日
    3
  • java jvm优化(一)

    java jvm优化(一)转自http://ifeve.com/jvm-optimize-1/java由堆来分配所需内存。java有3个代,年轻代、年老代、永久代垃圾回收:当堆的空间不足以存放新的对象时,这是需要分配内存,也就是垃圾回收启动。GC算法:引用计数器回收、跟踪回收下面转自http://www.importnew.com/13827.htmlGC种类:4种1.串行垃圾回收器2.并行…

    2022年5月28日
    33
  • 在目录下打开命令行_如何用命令行打开文件夹

    在目录下打开命令行_如何用命令行打开文件夹用命令行打开指定目录。基本指令nautilus+路径命令可以在ubuntu上直接打开此路径的目录。如nautilus~/workspace/。打开win格式的路径在Windows上的路径为反斜线\,在ubuntu命令行是无法识别的,此时需要将\转换为/。使用sed命令可以自动转换。以下命令可以打开/home/eric.cai/Workspace/目录:nautilus$(echo’\home\eric.cai\Workspace’|sed‘s+\\+/+g’)写成

    2022年10月15日
    3
  • 网页导航菜单制作

    网页导航菜单制作导航部分可分为三部分:第一部分:登陆/注册第二部分:导航,无序列表部分第三部分:图标部分具体步骤:1.先新建一个div容纳整个导航部分的内容2.再新建p标签包含第一部分内容,左浮(p标签本为行级元素不能设置宽高,但左浮后,变成行块元素可以设置宽高),再设置height与line-height值相同,则可上下居中。3.导航部分右边属于一个无序列表,要实

    2022年7月26日
    9
  • NSGA2算法MATLAB

    NSGA2算法MATLABNSGA2算法MATLAB实现(能够自定义优化函数)以前写了一个简单的NSGA2的算法能够用在ZDT1函数上:http://www.omegaxyz.com/2017/05/04/nsga2matlabzdt1/那个NSGA2的算法不具有普遍性,下面参考课国外的课题小组的代码重新修改了内部冗余内容,使之能够自定义优化函数。更多内容访问omegaxyz.comNSGA2的过程为:

    2022年5月12日
    40

发表回复

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

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