L-System分形小结

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

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



 

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

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

       

 

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

二、分形的介绍

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做的分形小软件

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

 

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

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



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



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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: L-system是一种用来描述和生成自然图形和形态的形式语言和系统。如果想基于Python绘制L-system分形图,可以通过turtle库实现。具体方法可以先定义L-system产生的字符串,再定义对应的绘制规则,最后根据规则使用turtle库绘制图形。可以参考一些已有的L-system代码进行学习和实践。 ### 回答2: L-System是一种生成分形图形的方法,是由一个初始字符串经过一些规则递归生成的字符串,被称为分形生长器。在绘制L-system分形图中,Python可以非常方便地实现这些规则,并使用matplotlib或turtle绘制结果。以下是基于Python绘制L-system分形图的详细步骤和示例代码。 1. 安装matplotlib或turtle 在Python中绘制图形,可以使用matplotlib或turtle库。这里介绍两个库,读者可以选择其中一个,或者使用其他Python绘图库。将库安装到您的计算机上,如用pip工具输入: ```python pip install matplotlib或者 pip install turtle ``` 2. 定义L-system分形生长器 定义L-system分形生长器,需要一个初始字符串、一些递归的规则和迭代次数。首先,我们可以使用字符串来描述L-system。例如,龙形曲线的初始字符串可以是FX,规则可以是: ```python X → X+YF+ Y → −FX−Y ``` 规则“X→X+YF+”表示,如果字符串中有X,则用“X+YF+”替换X;规则“Y → −FX−Y”表示,如果字符串中有Y,则用“−FX−Y”替换Y。接下来,我们可以通过一个L-system函数来扩展这个字符串,乘以规则n次迭代,如下所示: ```python def lsystem(axiom, rules, n): """ axiom: 初始生成器,应该是一个字符串 rules: 给出规则应该是一个包含多个多个元组的列表,每个元组给出两个元素。 n: 分形深度 """ system = axiom for i in range(n): new_system = "" for char in system: if char in rules: new_system += rules[char] else: new_system += char system = new_system return system ``` 这个函数将返回经过n次规则的操作后的L-System字符串。 3. 用turtle或matplotlib实现L-system分形图 接下来,我们可以使用生成好的字符串进行绘图。在这里,我们使用turtle库来绘制图形。首先,定义一个函数,它将使用给定产生器进行绘图。这个函数将逐个遍历每个字符,并根据字符绘制线条。在这里,F表示向前移动,+和-表示向右或左旋转角度。 ```python def draw_lsystem(system, angle, distance, init_pos=(0, 0)): """ 使用一定角度和距离运行L-System的结果 """ turtle.penup() turtle.goto(init_pos) turtle.pendown() turtle.setheading(0) for char in system: if char == "F" or char == "G": turtle.forward(distance) elif char == "+": turtle.right(angle) elif char == "-": turtle.left(angle) ``` 这里的角度和距离是定义绘制步长的变量,init_pos(x,y)定义canvas上绘制图像的起始位置,F或G表示向前移动,+和-表示向右或左旋转角度。 如果使用matplotlib作为绘图库,可以使用类似的函数。只需要在for循环中定义如何处理F, +和-即可。 最后,将所有代码链接起来以生成最终结果。下面是一个完整的python脚本,使用turtle来绘制Sierpinski三角形作为L-system的示例图像。 ```python import turtle def lsystem(axiom, rules, n): """ axiom: 初始生成器,应该是一个字符串 rules: 给出规则应该是一个包含多个多个元组的列表,每个元组给出两个元素。 n: 分形深度 """ system = axiom for i in range(n): new_system = "" for char in system: if char in rules: new_system += rules[char] else: new_system += char system = new_system return system def draw_lsystem(system, angle, distance, init_pos=(0, 0)): """ 使用一定角度和距离运行L-System的结果 """ turtle.penup() turtle.goto(init_pos) turtle.pendown() turtle.setheading(0) for char in system: if char == "F" or char == "G": turtle.forward(distance) elif char == "+": turtle.right(angle) elif char == "-": turtle.left(angle) if __name__ == '__main__': # 定义L-system的规则和初始字符串 rules = { "A": "+B-A-B+", "B": "-A+B+A-", } axiom = "A" iterations = 4 # 计算L-System的结果 result = lsystem(axiom, rules, iterations) # 将结果绘制到turtle画布上 turtle.speed(0) draw_lsystem(result, 60, 10) turtle.done() ``` 注:在运行turtle代码时,需要等待一段时间,直到结果绘制完成。 ### 回答3: L-system分形图是一种基于迭代的图形绘制方法,广泛应用于各个领域,包括生物学、动画设计和科学计算等等。Python是一种强大的编程语言,可以使用其内置数学库、绘图库和字符串处理库来实现L-system分形图的绘制。下面是一个描述如何在Python中绘制L-system分形图的步骤: 1. 确定L-system的规则:一个L-system包含一个初始状态和一组规则。规则将一个符号或字符序列转换为另一个符号或字符序列。例如,一个L-system规则集合可以是F->F+F--F+F,其中F表示向前绘制一条线段,+表示向左转,-表示向右转。 2. 确定迭代次数:根据规则集,将初始状态迭代多次,得到最终的绘图路径。迭代次数越多,绘图路径越复杂。 3. 将绘图路径转换为坐标点:使用数学公式将绘图路径转换为坐标点列表。通过计算每次向前移动的距离、转动角度和绘图方向等参数,可以确定每条线段的起点和终点坐标。 4. 使用绘图库绘制图像:Python中提供了多种绘图库,如Matplotlib、Turtle和Pygame等。根据需要选择合适的绘图库,并使用坐标点列表绘制图像。 在具体实现中,可以将上述步骤封装为一个函数,根据输入的规则集、迭代次数和绘图参数,自动绘制出L-system分形图。例如,下面是一个基于Pygame的实现示例: ```python import pygame def lsystem(rules, iterations, angle, line_len): state = 'F' for i in range(iterations): state = ''.join(rules.get(c, c) for c in state) x, y = 0, 0 dx, dy = 0, -1 points = [(x, y)] for c in state: if c == 'F': x2 = x + dx * line_len y2 = y + dy * line_len points.append((x2, y2)) x, y = x2, y2 elif c == '+': dx, dy = dy, -dx elif c == '-': dx, dy = -dy, dx screen = pygame.display.set_mode((800, 600)) screen.fill((255, 255, 255)) pygame.draw.lines(screen, (0, 0, 0), False, points, 1) pygame.display.flip() rules = {'F': 'F+F--F+F', '+': '+', '-': '-'} lsystem(rules, 5, 60, 10) ``` 此代码将绘制一个五次迭代的L-system分形图,每个线段长度为10个单位,转角为60度。可以根据需要调整规则、迭代次数和绘图参数,生成不同风格的分形图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值