疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

很有趣的Java分形绘制


 

       部分与整体以某种形式相似的形,称为分形。

  首先我们举个例子:

  我们可以看到西兰花一小簇是整个花簇的一个分支,而在不同尺度下它们具有自相似的外形。换句话说,较小的分支通过放大适当的比例后可以得到一个与整体几乎完全一致的花簇。因此我们可以说西兰花簇是一个分形的实例。

  分形一般有以下特质:

  在任意小的尺度上都能有精细的结构; 太不规则,以至难以用传统欧氏几何的语言描述; (至少是大略或任意地)自相似豪斯多夫维数会大於拓扑维数; 有著简单的递归定义。

  (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 }

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

  1、任意画一个正三角形,并把每一边三等分;

  2、取三等分后的一边中间一段为边向外作正三角形,并把这“中间一段”擦掉;

  3、重复上述两步,画出更小的三角形。

  4、一直重复,直到无穷,所画出的曲线叫做科赫曲线。