Science 版 (精华区)
发信人: qpcwth (独翅鸟), 信区: Science
标 题: 《分形艺术》39
发信站: 哈工大紫丁香 (2001年11月03日18:14:01 星期六), 站内信件
第五章 林氏系统与迭代函数系统
5.2实例与伪码
自己编写一个好的L系统程序不是很难,但没有什么必要。我们直接借用Fractint
19.5中的 L系统(参见第十章),并采用那里的伪码约定。用“伪码”表示各种L系统的生
成过程,这样 编写程序就简单得多。伪码虽然不能直接运行,但解释程序可以直接读取
这种ASCII文件, 然后进行计算、绘图。这样做的好处是显然的,更改规则轻而易举,
不懂得C或者PASCAL编 程也没什么关系。
在这种伪码中,先规定几个符号。设角度增量值通过360/n的方式获得,比如角度增
量为90°时,可取n=4。每一行中“;”之后是程序注释,不参与编译。每一个程序 均
以“程序名”开始,然后是以“{}”括起来的程序体。下面看例1:
Koch1 { ;程序名
Angle 6 ;规定角度增量为360/6=60°
Axiom F--F--F ;通过公理给出初始图形:一个倒置的正三角形
F=F+F--F+F ;通过产生式给出代换规则;
}
以上述柯赫曲线为例,L系统的“代入”过程可以通过“符号串替换”表示。将公理“F
--F- -F”中的“F”不断用“F+F--F+F”代换,第一次代入得到:F+F--F+F--F+F--F+F
--F+F-- F+F。第二次代入得到:
F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F--F +F--F+F+F+F--F+F-
-F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F
可以看出,符号串的增长速度是相当快的。第三次代换便得到如下符号串:
F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F+F+F--F+F+F+F--F+F--F+F-- F+F+F+F--F+F--
F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F+F+F--F+F+ F+F--F+F--F+F--F+F+F+F--F+F--
F+F--F+F+F+F--F+F--F+F--F+F+F+F-- F+F+F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F--
F+F--F+F+F+F--F+F-- F+F--F+F+F+F--F+F+F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F--
F+F-- F+F+F+F--F+F--F+F--F+F+F+F--F+F+F+F--F+F+F+F--F+F--F+F--F+F+ F+F--F+F-
-F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F+F+F--F+F+F+F-- F+F--F+F--F+F+F+F--F+F
对于某一给定的替换级别(不宜太高,一般不超过15级),有了这样的符号串,按照每个
符号 的解释,就可以作图了。可以随便找一个“编辑器”(如WPS,FE,EDIT,或者PAS
CAL的IDE) ,通过编辑器的“查找替换”功能方便地得到任意级别的符号串,然后将符
号串存成一个文 本文件,绘图程序从此文件中读取信息,便可完成L系统的绘图。当然
,也可以在一个单一 的程序内部完成这一系列操作。
我们先看一下公理为什么是一个倒置的正三角形。公理为“F--F--F”,第一个“F
”表示 向前走一个单位线段(规定从左向右),得到的是AB线段。然后是两个“-”,表
示从当前方 向开始算起向右转两个60°。第二个“F”表示沿当前方向再走一个单位长
度,得到BC线段 。接下去又右转两个60°,再画一个单位线段,得到CA线段。于是得到
一个正三角形ABC。< /P>
图5.1上图为例1的公理,下图为例1或例2的生成规则(产生式或代入规则)。
例2:与例1不同之处只在于公理不同,生成规则是一样的。此例可以生成柯赫曲线
,初始图 形是一条线段,生成过程是将线段中间1/3向外折起。程序伪码如下:
KochCurve { ;柯赫曲线
Angle 6 ;角度增量是60°
Axiom F ;初始图形是一单位线段
F=F+F--F+F ;产生式是将线段中间1/3折起
} ;结束
图5.2 柯赫曲线生成过程(见例2)
例3:公理(初始图形)为一正方形,生成元也很简单,向前走两步,右转走一步,回
转,走 一步,右转,再走一步。图形结构见图5.3。
FourTreeTest { ;四方内生树,1995-12
Angle 4 ;角度增量为90°
Axiom F-F-F-F ;初始图形为正方形
F=FF-F--F-F
}
例4:我们用L系统再次生成希尔伯特曲线。生成希尔伯特曲线的伪码如下:
Hilbert{ ;希尔伯特曲线,1996-12
Angle 4
Axiom Y ;初始串为任意字母Y
X=-YF+XFX+FY- ;第一个生成规则
Y=+XF-YFY-FX+ ;第二个生成规则,由以上规则不断代换
}
例5:分形龙。迭代13次生成的图形见图5.4。生成分形龙的伪码如下:
LiuDragon { ;变形的分形龙,1996-12
Angle 9 ;角度增量为40°
Axiom FX
F= ;第一个规则,含义为删除“F”
Y=+FX--FY+ ;第二个规则
X=-FX++FY- ;第三个规则
}
图5.3 四方内生树,右图为代入8次后的图形。
例6:模拟草本植物。注意这里出现了“括号”——可以方便地表示树枝,见图5.5
右图 (见503.htm文件)。伪码如下:
HerbPlant { ;生成植物,本程序使用了括号
Angle 14
Axiom Z
Z=ZFX[+Z][-Z]
X=X[-FFF][+FFF]FX
}
例7:模拟侧柏形态,见图5.5左图(见503.htm文件),伪 码如下:
OriArbo {
Angle 18
Axiom F
F=F[+F]F[-F][F]
}
--
心事浩茫连广宇,于无声处听惊雷
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.229.154]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.953毫秒