65.9K
CodeProject 正在变化。 阅读更多。
Home

简单的 Lindenmayer 系统

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.49/5 (17投票s)

2005年10月21日

CPOL

2分钟阅读

viewsIcon

55399

downloadIcon

938

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

Sample Image - l_system.jpg

引言

一个简单的程序,用于演示二维 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 次后需要很长时间。你需要随着迭代次数的增加缩短长度,以便将模式适应屏幕。

© . All rights reserved.