书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
第8章目录
8.6 L系统
(a)递归;
(b)变换矩阵;
(c)字符串。
一个L系统主要包括3个元素。
类似于递归分形,我们可以把规则的应用当成一次迭代。按照这个定义,公理就是第0代。
for (int i = 0; i < current.length(); i++) {
char c = current.charAt(i);
if (c == 'A') { 生成规则 A -> AB
next += "AB";
} else if (c == 'B') { 生成规则 B -> A
next += "A";
}
}
由于规则递归地应用于每一代,字符串的长度呈指数性增长。在第11代,字符串共有233个字符;到第22代,字符的个数就超过了46 000。
StringBuffer next = new StringBuffer(); 这个StringBuffer对象代表“下一代”语句
for (int i = 0; i < current.length(); i++) {
char c = current.charAt(i);
if (c == 'A') {
next.append("AB"); 用append()函数代替+=
} else if (c == 'B') {
next.append("A");
}
}
current = next.toString(); StringBuffer可以被轻易地转化回String对象
我们可以把L系统的语句当作绘图指令。
下面用另一个例子说明其中的工作原理。
“FG+-[]”是L系统常用的字母表,它的含义如下。
F: 画一个线段,然后向前移动
G: 向前移动(不画任何线段)
+: 向右转
-: 向左转
[: 保存当前的位置
]: 恢复之前的位置
这种绘图框架通常称为“Turtle graphics”(海龟绘图法,源自早期的LOGO编程)。想象你的电脑屏幕中有一只海龟,你可以对它下一些命令:向左转、向左转、画一个线段等。Processing并不会自动以这种方式工作,但在translate()、rotate()和line()函数的帮助下,我们可以轻易地实现Turtle graphics引擎。
可以按照以下方式把字母表翻译为Processing代码。
F:line(0,0,0,len); translate(0,len);
G:translate(0,len);
+:rotate(angle);
-:rotate(-angle);
[:pushMatrix();
]:popMatrix();