一、前言——美丽的分形图形

分形图形,在自然界中的存在,着实令人感到震撼,那是自然界巧夺天工的美,更让人感叹自然界的奇妙。


 

         这里展示了一张海岸线和一张蕨菜的图片,其中都蕴含着美丽的分形。

自然界中的分形自然是奇妙的,用计算机代码实现的分形,同样令人感慨。


 

          这些美丽的图形,究竟是怎样实现的,而分形又是什么呢?

二、分形的介绍

1、分形的定义

查找了一些资料,关于分形并没有确定的科学定义,应用比较广泛的是科学家曼德勃罗特对分形的定义和英国数学家法尔科内(Kenneth Falconer)仿照生物学家对生命定义的方式来给分形下的定义。

(1)Mandelbrot 定义
定义 1:如果一个集合在欧式空间的豪斯道夫维数(Hausdorff Dimension, DH)严格大于其拓扑维数,则该集合为分形集,简称为分形。其中 DH是分数。
定义 2:整体与局部以某种方式相似的形,称为分形。
       两个定义都有很大的局限性,定义 1 排除了为数众多的其豪斯道夫维数为整数但具有明显分形特征的集合。定义 2 强调了分形的重要特征—自相似性,但自相似性只是分形的属性特征之一。
(2)Falconer 定义
       法尔科内指出,如果某一集合具有下述所有或大部分性质,那么它就是分形。
(1) 具有精细的结构,即在任意小的尺度下,可以有更小的细节;
(2) 具有不规则性,无论从整体还是局部观察,都无法用微分或者传统的几何语言来描述;
(3) 本身的结构通常在大小尺度上具有某种自相似的性质;
(4) 分形维数大于拓扑维数;
(5) 在多数情况下,可以由迭代方法产生。
 2、分形的特征

关于分形,并没有很准确的定义,但是分形却有其独特的特征。

(1)自相似性

我认为这是分形最主要的特征。

自相似性是指:分形对象的局部经过放大后与整体相似,或者整体经过缩小后可以和局部重合的一种性质。


          如图,这是Sierpinski 三角垫片的自相似。


          如图,这是分形树的自相似。

(2)无标度性

无标度性是指对分形对象的任何局部区域进行放大或缩小,它的形态、复杂程度、不规则性等都不发生变化的特性。

也就是说,用不同尺度去观察对象时,所看到的图案细节都是一样的,而与观察的尺度(或标度)无关。
       无标度性与自相似性存在一定的关系,具有标度不变性的对象必定满足自相似性质。也可以认为,这类研究对象没有特征尺度,即无法用空间中的长度、面积、体积和时间中的秒、分、时等来描述。自相似性仅存在于具有标度不变性的一段区间范围内,如果超出这个区间就没有自相似性,分形也就不存在了。
(3)自仿射性

自仿射性是自相似性的一种拓展和延伸。如果将自相似性看成是局部到整体在各个方向上的等比例变换的结果的话,那么,自仿射性就是局部到整体在不同方向上进行不等比例变换的结果。前者称为自相似变换,后者称为自仿射变换,由此可以知道,自相似性变换是自仿射性变换的特例。

3、分形的应用

分形的应用可谓是非常广泛,涉及到自然科学、工程技术、材料科学、图案设计、社会经济等领域。越来越多的人关注分形,人们运用分形成功的解决了许多其他方法难以解决的问题。

三、L-System(L系统)简介

1、L系统的简单介绍

L系统是分形理论的重要分支。

林氏系统(通常称L系统)是林德梅叶1968年为模拟生物形态而设计的,后来史密斯于1984年 、普鲁辛凯维奇于1986年,分别将它应用于计算机图形学,引起生物学界和计算机界人士极大兴趣,一时发表了许多论文和专著。L系统实际上是字符串重写系统。我们把字符串解释成曲线(或者更准确地说,称作图形), 于是只要能生成字符串,也就等于生成了图形。L系统的工作原理非常简单,仅仅是对几个简单的字符进行操作。L系统是一个简单由“F”,“+”,“-”等字符组成的字符串,串的形成前提是必须具备“种子”,并且
按照一定的规则替换。母串中的字母“F”可以被子串替代,这样就完成了一次替换,依此类推,就可以完成L系统的迭代。

2、L系统中的基本概念

(1)重写(rewriting):L-系统的本质就是对字符串进行重写,首先定义字符串集合,设置初始字符串和替代规则(即产生式),然后根据产生式对初始字符串不断的替代。每一步对每一个字符的替代都是并行的,所有字符串同时进行替代。
(2)字符表(Alphabet):即是字符串集合,L-系统中所有赋予不同意义的字符,用字母 V 表示。
(3)公理(Axiom):又称初始元(initiator)是由字符表中的字符构成的字符串,用符号 ω 表示。例如 V={A、B、C},那么 AB、ABC、AABBC 等都是一些字符串粒子。
(4)字长(Length):是公理 ω 中所包含的字符个数,用|ω|表示。
(5)产生式(Productions):解释为改写规则(rewriting rules),是指从字符 a∈V到字符 ω 的变换。表示为:P:a→ω,ω 可以是 a 本身,也可以是空字(empty word),用符号 φ 表示。

3、L系统的基本构图原理

上述的L系统基本概念可能有些晦涩难懂,这里用一个简单的小例子(Koch曲线),来进一步说明L系统的基本构图原理。

计算机实现过程,是很简单的,首先通过生成字符串,来遍历字符串的每一个字母,对应的字母代表一种含义,然后可以将含义告诉计算机,让计算机遍历字符串的时候执行字符对应动作,这样就可以了。而字符的生成过程,如图所示:

如上图就是字符生成过程,我们可以在实现过程中,可以在字符串数组中先保存一个'F',然后遍历数组,然后再取得每一个字母,对应生成其所对应的字符串,那么就可以形成数组中的下一个元素了。

然后在自己的程序中,给每一种字符赋予一种含义,像上面就有三种字符,'F','-','+',那么我们就为这三种字符赋予它的含义,'F'代表向前面走一次,'—'代表逆时针旋转,'+'代表顺时针旋转,等等。你可以自己为他们赋予你自己所想的任何计算机可以执行的动作,然后在后面让计算机遍历数组,得到字符,那么就可以进行我们自己想要的创作了。

为了便于理解,下附Koch 曲线迭代后生成的字符串,和迭代次数为1,2,4时的Koch曲线
      

           如图,为Koch 曲线迭代后生成的字符串。


        如图,为迭代次数为1时的Koch曲线


          如图,为迭代次数为2时的Koch曲线

如图,为迭代次数为4时的Koch曲线
四、我的用LSystem做的分形小软件

应用程序的界面如图所示:


         可以有不同的图案以供选择。

并且可以随意改变参数,如图所示:


       其中各参数的含义可以使用帮助按钮:


          在整个程序的制作过程中,有参考了很多资料,也有一些自己的想法,希望大家予以建议和指评。

L-System分形小结相关推荐

  1. 2021年 第12届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2021.04.18】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[题目下载.2013年(第4届)~2020年(第11届)] CSDN 蓝桥杯 专栏 2013年 第04届 蓝桥杯 Java B组 省赛真题详解及小结 ...

  2. Bullsh*t,System. currentTimeMillis大胆用起来,我说的!

    以下文章来源方志朋的博客,回复"666"获面试宝典 # 疑惑,System.currentTimeMillis真有性能问题? 最近我在研究一款中间件的源代码时,发现它获取当前时间不 ...

  3. MinGW+Lua环境配置小结

    虽说VC是Windows下C++开发的首选工具,但有时候写一些小程序,我还是更倾向于使用一些轻量级的开发工具.比如最近研究Lua嵌入 C++,有时候只是写一些很小的程序,这时候Visual Studi ...

  4. Android7.1update.zip升级在system/bin下新增可执行文件没有可执行权限问题

    Android7.1update.zip升级在system/bin下新增可执行文件没有可执行权限问题 外出的设备,只能通过update.zip方式升级,比如要在设备/system/bin目录下增加lo ...

  5. Java常用类之【Math类、Random类、System类、Runtime类】

    一.Math类 Math类 [绝对值]Math.abs();//返回对应类型的绝对值 [最大值和最小值]Math.max(int a, int b) ,Math.min(int a,int b);(其 ...

  6. C语言system函数(C语言程序中执行命令行)

    需包含头文件:C 标准库 - <stdlib.h> 文章目录 描述 声明 参数 返回值 实例1 实例2:列出 windows 机上当前目录下所有的文件和目录 描述 C 库函数 int sy ...

  7. linux 编译system.img,android生成sysytem.img的命令过程

    From http://xianghuaclm.blog.163.com/blog/static/6668783201110221486240/ 使用#file system.img 输出:syste ...

  8. java基础—System类的方法演示

    System类的一些方法的演示: import java.util.Properties; import java.util.Set; public class StstemDemos {public ...

  9. Android 系统(137)---android打包解包boot.img,system.img

    android打包解包boot.img,system.img 2017年04月28日 15:00:36 阅读数:1822 原帖地址:http://www.52pojie.cn/thread-48802 ...

最新文章

  1. 基于局部表面特征在杂乱场景中的三维物体识别
  2. 【STM32 .NET MF开发板学习-29】摄像头蓝牙图像远程获取
  3. 灵活运用ISA的链接转换功能:ISA2006系列之十三
  4. 利用文件头判断文件类型
  5. 基于matlab的单相pwm逆变电路的仿真研究,基于MATLAB的单相PWM逆变电路的仿真研究...
  6. Linux的基础命令小总结(二)
  7. iPhone设备分辨率及尺寸
  8. SPI、I2C、UART三种串行总线的原理、区别及应用
  9. Arduino学习笔记-新的按键控制方式
  10. How to manage the certificates in the PC
  11. python-Generalization of Hops
  12. path的图片下拉效果
  13. python 编译器_Python教程:编译器与解释器
  14. 指针与指针指向的内容(四)
  15. 配置nessus服务在kali中开机自启动
  16. 微信表情图像代表什么意思_微信表情含义图解大全(微信58个表情含义图)
  17. 基于asp.net的排球赛事网站设计与实现
  18. android打开app白色页面,完美解决Android App启动页有白屏闪过的问题
  19. 13-MyBatis 使用了哪些设计模式?在源码中是如何体现的?
  20. [线性控制理论]关于Laplace变换中求导运算的结果推导

热门文章

  1. opencv3/C++ mixChannels()详解:4通道图像分割、HSV通道获取
  2. 华为手机备份的通讯录是什么文件_手机怎么备份通讯录?华为手机备份方法大全...
  3. 网络基础学习:布线、计算机数制
  4. 禽畜养殖生产智慧管理系统方案
  5. 部署Microsoft LAPS分步指南
  6. Android基础-Facebook Rebound 弹性动画库 源码分析
  7. ZooKeeper入门(二)ZooKeeper之Paxos及客户端使用
  8. 使用pandas库读取数据
  9. SAP SD 基础知识之计划行类别(Schedule Line Category)
  10. 用Pandas分析了75w多条数据,揭秘美国选民的总统喜好!