首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 平面设计 > 图形图像 >

数目字的美丽——分形图形

2013-08-09 
数字的美丽——分形图形第一次接触分形就被那些图形深深的吸引住了,在那些简单的杂乱无章的外貌下 实际上藏

数字的美丽——分形图形
     第一次接触分形就被那些图形深深的吸引住了,在那些简单的杂乱无章的外貌下 实际上藏着的事一颗简单智慧
的心(分形公式)。
最开始接触的事丢色子游戏:
1.平面上随机选A,B,C三个点。再随机选一个点,记为P。
2.有一个三面色子,每丢一次,则选中ABC三个中一点。
开始游戏:
1、重复丢色子,如果选中A,则取A和P的中点P1,画黑,
2、如果选中B,则取B和P1的中点P2,画黑
3、如果选中A,则取A和P2的中点P3,画黑
4、...一直重复(如每点一下鼠标,丢100次色子。
最终画出来的效果出乎意料之外  看是杂乱的规则  最后却画出了规则的图形(倾斜的谢冰斯基三角形)。

慢慢的又得到了许多分形公式,一一画出来,顿时觉得数学是多么的强大,数学也可以如此美丽。

得到公式后并不是简单的一模一样的调用还是需要灵活的应用的:
第一类应用方法:迭代。   所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。
迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。
类似于高中的数列,由n推出n+1项。

第二类应用方法:递归。  递归就是在过程或函数里调用自身;在使用递归策略时,必须有一个明确的
递归结束条件,称为递归出口。一般来说,递归需要有边界条件、递归前进段和递归返
回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
斐波纳契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列
:1、1、2、3、5、8、13、21..... I[1]   斐波纳契数列是典型的递归案例。

课后小结:总体来说分形还是蛮简单的,只要分析出规律还是很好做的。但还是有些比较难的,迭代比较简单,
一般就是直接应用就行,递归的话,条理一定要清晰。不然很容易混乱。记得递归时参数的变化,及递归的出口,次数。

下面是几个简单的分形例子:
丢色子游戏:

public void  drawLeaf(Graphics g, double x, double y, double L, double a) { //       // 可以方面速度画以了解其算法 //      try { //          Thread.sleep(10); //      } catch (InterruptedException e) { //          // TODO Auto-generated catch block //          e.printStackTrace(); //      }         int red = random.nextInt(126);         int green = random.nextInt(126);         int blue = random.nextInt(126); //随机颜色         g.setColor(new Color(red, green, blue)); //        g.setColor(Color.GREEN);        double x1, x2, x1L, x2L, x2R, x1R, y1, y2, y1L, y2L, y2R, y1R;         float deflection = 50-random.nextInt(20);//侧干主干的夹角         float intersection = random.nextInt(40)-20;//主干偏转角度         float depth = 2+random.nextInt(2);//限制递归深度         float ratio = 3f;//主干侧干长度比(可调整使其更茂密或稀疏)         float ratio2 = 1.2f;//上级主干与本级主干长度比(可调整使其变高低)         if (L > depth) {                 System.out.println("");                            x2=x+L*Math.cos(a*PI1);             y2=y+L*Math.sin(a*PI1);             x2R=x2+L/ratio*Math.cos((a+deflection)*PI1);             y2R=y2+L/ratio*Math.sin((a+deflection)*PI1);             x2L=x2+L/ratio*Math.cos((a-deflection)*PI1);             y2L=y2+L/ratio*Math.sin((a-deflection)*PI1);             x1=x+L/ratio*Math.cos(a*PI1);             y1=y+L/ratio*Math.sin(a*PI1);             x1L=x1+L/ratio*Math.cos((a-deflection)*PI1);             y1L=y1+L/ratio*Math.sin((a-deflection)*PI1);             x1R=x1+L/ratio*Math.cos((a+deflection)*PI1);             y1R=y1+L/ratio*Math.sin((a+deflection)*PI1);             g.drawLine((int)x-50,(int)y+50,(int)x2-50,(int)y2+50);             g.drawLine((int)x2-50,(int)y2+50,(int)x2R-50,(int)y2R+50);             g.drawLine((int)x2-50,(int)y2+50,(int)x2L-50,(int)y2L+50);             g.drawLine((int)x1-50,(int)y1+50,(int)x1L-50,(int)y1L+50);               g.drawLine((int)x1-50,(int)y1+50,(int)x1R-50,(int)y1R+50);             drawLeaf(g,x2,y2,L/ratio2,a+intersection);             drawLeaf(g,x2R,y2R,L/ratio,a+deflection);             drawLeaf(g,x2L,y2L,L/ratio,a-deflection);             drawLeaf(g,x1L,y1L,L/ratio,a-deflection);             drawLeaf(g,x1R,y1R,L/ratio,a+deflection);         }     } 

热点排行