简单的 Lindenmayer 系统
一个简单的二维 Lindenmayer 系统绘图程序

引言
一个简单的程序,用于演示二维 Lindenmayer 系统
一个获取更多信息的良好来源是 Google 和这些网站
Lindenmayer 系统是一种字符串重写系统,用于创建分形。它们被开发出来用于描述自然系统,例如树木。你从简单的规则开始,并反复地将它们应用于生成的字符串。Lindenmayer 系统是一种分形,因为规则被反复地应用于自身以创建模式。
例如
rule 1 a:b
rule 2 b:ba
Step 1 a
Step 2 b
Step 3 ba
Step 4 bab
Step 5 babba
为了实际绘制一些东西,规则包括命令
F = draw forward 1 segment
f = move forward one segment (no drawing)
+ = rotate plus degrees
- = rotate minus degrees
B = Draw backwards
b = move backwards
[ = push, remember current position
] = pop, return to last pushed position
例如,Koch 曲线可以用这个规则绘制
F:F+F--F+FF
,an initial Angle of 90, initial string of F.
推送和弹出命令用于创建分支,例如用于树木。
程序的工作原理
程序将规则应用于初始字符串,以创建一个包含命令的长字符串。然后,创建的字符串用于通过简单地遵循字符串中的指令来绘制字符串。字符串中不是命令的任何字符都会被忽略。
唯一有趣的功能是 int CL_systemDoc::MakeCurveString()
,它位于 文件 l_systemDoc.cpp 中。此函数将规则应用于初始字符串,从而创建最终字符串,该字符串将用于绘制模式。与许多分形生成器不同,这是一个迭代过程,而不是递归过程。int CL_systemView::DrawCurveStringRecurse
绘制字符串。使用递归来支持推送和弹出命令。如果不支持推送和弹出,则可以使用简单的 for
循环扫描绘图字符串以创建最终图像。
一个规则看起来像这样:X:Ff+-X
第二个字符必须是冒号 ':'。
第一个字符将被替换为冒号后的文本。
“文件/曲线参数”允许你更改模式的所有方面。
- 旋转角度:= - 旋转绘图方向的角度
- 迭代次数:将规则应用于初始字符串的次数
- 长度:将绘制的每个线段的长度,以像素为单位
- 初始角度:绘制第一条线段的角度
- 初始状态:规则应用于的字符串
在“添加”按钮后的文本框中输入新字符串,然后按“添加”按钮将新规则添加到末尾。
突出显示列表框中的规则,然后按“删除”按钮删除该规则。
要绘制曲线,只需单击主窗口中的鼠标即可选择起始点。
始终从少于 5 次迭代的模式开始。有些模式在迭代次数超过 5 或 6 次后需要很长时间。你需要随着迭代次数的增加缩短长度,以便将模式适应屏幕。