`

分形图总结

 
阅读更多

 分形总结

       前一段时间一直在画分形,今天终于坐下来把我画的和大家分享一下。

       先来名词解释吧。1975年,数学家曼德布罗特(B. B. Mandelbrot)出版了著作《分形、机遇和维数》,标志着分形理论的诞生,这是一门力图以数学方法,模拟自然界存在的、及科学研究中出现的那些看似无规律的各种现象的学科。在过去的几十年里,分形在物理学材料科学地质勘探、乃至股价的预测等方面都得到了广泛的应用或密切的注意,并且由于分形的引入,使得一些学科焕发了新的活力。

       而分型图则无疑是这个学科中格外引人关注的一部分,分形图主要表现为部分的自相似性,充分表现了数学的简单、和谐、统一的内涵。借助计算机,数学家们创造出了无比神奇的作品。由这一点出发,可以说,艺术家已经开始漫步于科学领地,而科学家也从此跨入了神圣的艺术殿堂。其中比较为人熟知的图形有三分康托集、谢宾斯基地毯、谢宾斯基三角形、科赫曲线等,而最让人惊叹的还数神奇的曼德勃罗集——无限放大的过程中呈现出无穷的变化。

曼德勃罗集

 

分型图的神奇来源于他的自相似性,而这通过计算机程序的递归迭代算法得以轻松实现,以下分享一下我画的几个作品。

       前两个是根据胡哥给的公式画的,通过简单的递归迭代就能实现,难点在于颜色的设置。一开始我也没有头绪,后来我慢慢摸索,先算出图像的宽度长度,然后以此为基准,用系数把图形的位置转化成0-255的值,以此来设置颜色的三个参数,使图形总体呈现渐变的效果,只是好像不是很好看。。。。

       谢宾斯基垫片和三角形,通过分析最简单的部分图形,不难通过递归实现。困难的在科赫曲线,一开始搞了好久我都没弄明白,因为不知如何找到不同位置直线的“凸起点”,因为直线倾斜时好难找,通过方程计算坐标又好麻烦。。。。

       后来,我偷了个懒,换了种方法,找到两个顶点之间连线的三等分点,一次得到两个“凸起点”,于是,科赫曲线中所有的点都成为了“三等分点”,最后好歹实现了。。。当然,过程中还出现了另一个问题,那就是在前一层中画过的线在后面均产生了“多余”,很不好看。为了改进这点,我一开始也没有思路,想到用再画一条白线盖住原来的黑线的方法。。。。当然,没有成功,因为后面产生了误差,很多线都没能盖住。后来,我看到了另一位学长写的日志,才豁然开朗——原来只要简单加一个判断语句,让函数递归到最后一层时才画线,这样有没有了之前多余线的烦恼。

以下是截图与代码:

1、

 

g.clearRect(0, 150, 1500, 1000);
   double xt = 1;
      double yt = 1;
      for(int  i=0;i<100000;i++){
       double tx = xt;
       double ty = yt;

       //核心公式
       xt = Math.sin(-2*ty)-Math.cos(-2*tx);
       yt = Math.sin(-1.2*tx)-Math.cos(2*ty);


       int xn = (int)(xt*fd*100)+600;
       int yn = (int)(yt*fd*100)+400;
       if (xn>maxX)maxX = xn;
       if(yn>maxY)maxY = yn;
       if(xn<minX)minX = xn;
       if(yn<minY)minY = yn;
       int x = (int)(xt*100)+300;
       int y = (int)(yt*100)+300;

       //设置颜色
       double p1 = 255.0/398,p2 = 255.0/389;
       int t1 = (int)(p1*(x-101)),t2 = (int)(p2*(y-101));
       int r2 = 255-t2 ,g2 = t1,b2 = t2;
       g.setColor(new Color(r2,g2,b2));
       if(yn>80)g.drawLine(xn, yn, xn, yn);
      } 

2、

 

 

g.clearRect(0, 150, 1500, 1000);
   double xt = 1;
      double yt = 1;
      for(int  i=0;i<100000;i++){
       double tx = xt;
       double ty = yt;
       xt = -6.56*Math.sin(1.4*tx)-Math.sin(1.56*ty);
       yt = 1.4*Math.cos(1.4*tx)+Math.cos(1.56*ty);
       int xn = (int)(xt*fd*40)+600;
       int yn = (int)(yt*fd*40)+395;
       if(xn>maxX) maxX = xn;
       if(yn>maxY) maxY = yn;
       if(xn<minX) minX = xn;
       if(yn<minY) minY = yn;
       //设置颜色
       int x = (int)(xt*40)+398;
       int y = (int)(yt*40)+395;
       double p1 = 255.0/604,p2 = 255.0/190;
       int t1 = (int)(p1*(x-96)),t2 = (int)(p2*(y-300));
       int r1 = 100 ,g1 = t2,b1 = (t1+t1)/2;
       g.setColor(new Color(r1,g1,b1));
       if(yn>80)g.drawLine(xn, yn, xn, yn); 
      }

 3、谢宾斯基三角形

 

//画谢宾斯基三角形的方法
 public void drawMTir(int x1,int y1,int x2,int y2,int x3,int y3){
  if(ceng == 0){
   drawTri(x1,y1,x2,y2,x3,y3);
  }
  else{
   drawNext1(x1,y1,x2,y2,x3,y3,ceng);
  }
 }
 //画三角形的递归方法
 private void drawNext1(int x1,int y1,int x2,int y2,int x3,int y3,int count) {
  count--;
  if(count<0)return;
  drawTri(x1,y1,x2,y2,x3,y3);
  drawTri((x1+x2)/2,(y1+y2)/2,(x2+x3)/2,(y2+y3)/2,(x3+x1)/2,(y3+y1)/2);
  
  drawNext1(x1,y1,(x1+x2)/2,(y1+y2)/2,(x3+x1)/2,(y3+y1)/2,count);
  drawNext1((x1+x2)/2,(y1+y2)/2,x2,y2,(x3+x2)/2,(y3+y2)/2,count);
  drawNext1((x1+x3)/2,(y1+y3)/2,(x2+x3)/2,(y2+y3)/2,x3,y3,count);
  
 }

 

 4、谢宾斯基垫片



 

//画谢宾斯基垫片的方法
 private void drawXie(int x, int y, int width) {
  x += 100;
  y += 100;
  g.drawRect(x,y,width,width);
  g.fillRect(x+width/3, y+width/3, width/3,  width/3);
  drawNextXie(x+width/3, y+width/3, width/3,ceng);
 }
 //画谢宾斯基的递归方法
 private void drawNextXie(int x, int y, int w,int count) {
  if(count-- < 0){
   return;
  }
  w/=3;
  g.fillRect(x-2*w, y-2*w, w, w);
  g.fillRect(x+w, y-2*w, w, w);
  g.fillRect(x+4*w, y-2*w, w, w);
  g.fillRect(x-2*w, y+w, w, w);
  g.fillRect(x+4*w, y+w, w, w);
  g.fillRect(x-2*w, y+4*w, w, w);
  g.fillRect(x+w, y+4*w, w, w);
  g.fillRect(x+4*w, y+4*w, w, w);
  drawNextXie(x-2*w , y-2*w, w, count);
  drawNextXie(x+w , y-2*w, w,count);
  drawNextXie(x+4*w , y-2*w, w,count);
  drawNextXie(x-2*w , y+w, w,count);
  drawNextXie(x+4*w , y+w, w,count);
  drawNextXie(x-2*w , y+4*w, w,count);
  drawNextXie(x+w , y+4*w, w,count);
  drawNextXie(x+4*w , y+4*w, w,count);
 }

5、科赫曲线

 

  //画科赫曲线的方法
 public void drawKehe(int x1,int y1,int x5,int y5){
  if(ceng == 0){
   g.drawLine(x1, y1, x5, y5);
  }else if(ceng == 1){
   int x2 = (2*x1+x5)/3,y2 = (2*y1+y5)/3,
     x3 = (x1+x5)/2,y3 = (int)((y1+y2)/2-Math.sqrt(3)*(x5-x1)/6),
     x4 = (x1+2*x5)/3,y4 = (y1+2*y5)/3;
   drawFour(x1,y1,x2,(2*y1+y2)/3,x3,y3,x4,y4,x5,y5);
  }else {
   int x2 = (2*x1+x5)/3,y2 = (2*y1+y5)/3,
     x3 = (x1+x5)/2,y3 = (int)((y1+y2)/2-Math.sqrt(3)*(x5-x1)/6),
     x4 = (x1+2*x5)/3,y4 = (y1+2*y5)/3;
  drawNextKehe(x1,y1,x2,y2,x3,y3,ceng-1);
  drawNextKehe(x3,y3,x4,y4,x5,y5,ceng-1);
  }
 }
 //画科赫曲线的递归方法
 private void drawNextKehe(int x1, int y1, int x5, int y5,int x9,int y9,int count) {
  count--;
  if(count<0)return; 
  int x2 = (2*x1+x5)/3,y2 = (2*y1+y5)/3;
  int x3 = (2*x1+x9)/3,y3 = (2*y1+y9)/3;
  int x4 = (x1+2*x5)/3,y4 = (y1+2*y5)/3;
  int x6 = (2*x5+x9)/3,y6 = (2*y5+y9)/3;
  int x7 = (x1+2*x9)/3,y7 = (y1+2*y9)/3;
  int x8 = (x5+2*x9)/3,y8 = (y5+2*y9)/3;
   
  if(count == 0)drawEight(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6,x7,y7,x8,y8,x9,y9); 
   
  drawNextKehe(x1,y1,x2,y2,x3,y3,count);
  drawNextKehe(x3,y3,x4,y4,x5,y5,count);
  drawNextKehe(x5,y5,x6,y6,x7,y7,count);
  drawNextKehe(x7,y7,x8,y8,x9,y9,count);
 }
   //画8条线的方法
 private void drawEight(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,int x5,int y5,int x6,int y6,int x7,int y7,int x8,int y8,int x9,int y9){
  g.drawLine(x1, y1, x2, y2);
  g.drawLine(x2, y2, x3, y3);
  g.drawLine(x3, y3, x4, y4);
  g.drawLine(x4, y4, x5, y5);
  g.drawLine(x5, y5, x6, y6);
  g.drawLine(x6, y6, x7, y7);
  g.drawLine(x7, y7, x8, y8);
  g.drawLine(x8, y8, x9, y9); 
 }
 //画4条线的方法
 private void drawFour(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,int x5,int y5){
  g.drawLine(x1, y1, x2, y2);
  g.drawLine(x2, y2, x3, y3);
  g.drawLine(x3, y3, x4, y4);
  g.drawLine(x4, y4, x5, y5);
 }

  • 大小: 125.9 KB
  • 大小: 139.1 KB
  • 大小: 7.3 KB
  • 大小: 5.6 KB
  • 大小: 4.1 KB
分享到:
评论

相关推荐

    matlab代码实现分形维数计算_二值图像_分形维数_分形图像

    分形维数是一种用于描述复杂几何形状或结构...总结起来,MATLAB中的分形维数计算涉及到二值图像处理、Box-Counting算法、图像分析以及线性回归拟合等技术。通过这些步骤,我们可以有效地评估和理解复杂图像的分形特性。

    分形图像C++实现

    #### 四、总结与扩展 通过上述分析,我们可以看出,该C++程序利用IFS原理成功实现了分形图像的生成。未来可以通过调整变换参数或增加新的变换来生成更多种类的分形图案。此外,还可以尝试改进算法以提高生成效率或...

    分形图案 奇妙的递归

    分形图的自相似性意味着无论放大多少倍,局部的细节都与整体的形状相似。这种特性在自然界中无处不在,如海岸线、云朵、山脉、雪花等,都能找到分形的影子。雪花的形状就是很好的例子,它们的六角对称性和复杂的分支...

    fra.rar_分形 压缩_分形 matlab_分形 压缩_分形图像

    总结来说,这个压缩包提供了用于研究和实践分形图像压缩的MATLAB源代码。通过运行和理解这些程序,你可以深入学习分形理论,掌握如何使用MATLAB实现分形图像的压缩和重构,这对于理解分形在计算机科学中的应用以及...

    分形几何中一些经典图形的Matlab画法

    总结来说,MATLAB作为强大的计算和绘图工具,使得探索和展示分形几何的魅力变得容易。通过掌握上述知识点,你将能够用代码描绘出自然界中那些令人惊叹的复杂之美。对于想要深入了解分形几何和MATLAB编程的读者,这份...

    分形图像压缩源代码

    ### 总结 分形图像压缩技术依赖于图像的自相似性质,通过寻找图像内部的重复模式来进行高效压缩。MATLAB实现的分形图像压缩算法,通过对图像进行特定的分割、变换和匹配过程,实现了对图像的有效压缩。尽管这种方法...

    分形图代码

    ### 分形图代码详解 #### 一、分形几何与MATLAB 分形几何是一种用于描述自然界中不规则形状和复杂结构的数学理论。它在计算机科学领域有着广泛的应用,尤其是在图形学方面。MATLAB作为一种强大的数值计算软件,...

    基于相关系数的分形图像压缩算法

    #### 四、总结 本文介绍了一种基于相关系数的分形图像压缩算法,并通过MATLAB代码实现了图像的压缩过程。该算法通过将图像划分为值域块和定义域块,利用值域块的标准差来筛选可以简化表示的部分,并通过寻找与之...

    Higuchi算法分形.rar_Higuchi_Higuchi分形算法_分形 声_分形维数

    总结起来,Higuchi算法是一种强大的工具,能够量化一维时间序列的分形特性,尤其适用于分析声发射数据。通过计算分形维数,我们可以深入了解系统的行为模式,对于故障检测、材料科学、生物医学等领域有着深远的影响...

    分形彩图的matlab的源代码

    根据给定的文件信息,我们可以总结出以下关于“分形彩图的MATLAB源代码”的相关知识点: ### 分形彩图的基本概念 1. **分形**:分形是一种具有自相似性质的几何形状,其特征是无论放大多少倍,都能看到与原形相似...

    分形几何——数学基础及其应用

    #### 七、总结 《分形几何——数学基础及其应用》是一本系统介绍分形几何理论与应用的经典之作。该书内容丰富、论述深刻,既适合初学者入门,也是研究人员不可或缺的参考书。通过本书的学习,不仅可以掌握分形几何...

    基于Jacquin分形法图像编码的Matlab仿真实现.pdf

    总结来说,分形图像编码作为一种有损压缩技术,具有高压缩比和快速解码的优点。Jacquin分形法作为其中的代表方法,其主要研究内容之一是缩短编码时间,这对于实际应用非常关键。通过Matlab仿真实现,研究者可以验证...

    浅析MATLAB环境下分形图形的生成.pdf

    总结而言,本文从理论和实践两个方面对MATLAB环境下分形图形的生成进行了全面的探讨。通过具体实例的分析,文章展示了MATLAB如何高效地实现分形图形的生成,并指出了随机分形技术在实际应用中的潜力和挑战。随着...

    分形艺术((分形几何的艺术))

    总结来说,分形艺术是数学与美学的完美碰撞,它揭示了宇宙中深藏的秩序和美感。通过理解和运用分形几何,艺术家和设计师能够创造出既科学又艺术的作品,这些作品不仅令人赏心悦目,还激发我们对自然世界更深层次的...

    用MATLAB模拟分形.pdf

    总结来说,MATLAB提供了一种强大且灵活的方式来模拟和展示分形,无论是在科学研究还是艺术创作中,都为用户提供了深入理解和探索分形世界的机会。通过熟练掌握MATLAB编程,我们可以更直观地理解分形理论,进一步探索...

    基于JAVA的分形图像生成研究.doc

    小结部分总结了整个毕业设计的过程和成果,包括代码编写、程序调试和功能实现。参考文献列出了相关研究的来源,而英文摘要则为非中文读者提供了论文概要。最后,致谢表达了对指导教师和学习经历的感激之情,并附有...

    vc++实现分形三角形

    根据提供的信息,我们可以总结出以下关于“vc++实现分形三角形”的相关知识点: ### 一、背景介绍 在计算机图形学中,分形是一种非常有趣的现象,它可以通过简单的数学规则来生成复杂的图形。这些图形通常具有自...

    小波域分形图像编码

    - **提取灰度图**:从彩色图像中提取出一个灰度通道作为后续处理的对象。 **2. 图像分割** - **确定分割大小**:根据图像的宽度和高度计算出图像的分割尺寸,这里采用了16×16和8×8两种大小的块。 - **16×16块的...

Global site tag (gtag.js) - Google Analytics