L-System分形小结

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

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


L-System分形小结_第1张图片
 
L-System分形小结_第2张图片
         这里展示了一张海岸线和一张蕨菜的图片,其中都蕴含着美丽的分形。

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

       
L-System分形小结_第3张图片
 
L-System分形小结_第4张图片
          这些美丽的图形,究竟是怎样实现的,而分形又是什么呢?

二、分形的介绍

1、分形的定义

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

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

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

(1)自相似性

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

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

     
L-System分形小结_第5张图片
          如图,这是Sierpinski 三角垫片的自相似。


L-System分形小结_第6张图片
          如图,这是分形树的自相似。

(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系统的基本构图原理。

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

 
L-System分形小结_第7张图片
 

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

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

       为了便于理解,下附Koch 曲线迭代后生成的字符串,和迭代次数为1,2,4时的Koch曲线
      
L-System分形小结_第8张图片
           如图,为Koch 曲线迭代后生成的字符串。


L-System分形小结_第9张图片
        如图,为迭代次数为1时的Koch曲线

L-System分形小结_第10张图片
          如图,为迭代次数为2时的Koch曲线

L-System分形小结_第11张图片
 

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

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

 
L-System分形小结_第12张图片
         可以有不同的图案以供选择。

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


L-System分形小结_第13张图片
       其中各参数的含义可以使用帮助按钮:


L-System分形小结_第14张图片
          在整个程序的制作过程中,有参考了很多资料,也有一些自己的想法,希望大家予以建议和指评。

你可能感兴趣的:(System)