使用L-systems和Python生成树
我试图用L系统生成一个简单的树。但是,当我运行我拥有的代码时:使用L-systems和Python生成树,python,turtle-graphics,l-systems,Python,Turtle Graphics,L Systems,我试图用L系统生成一个简单的树。但是,当我运行我拥有的代码时: import turtle def generate(length): sentence = "F" for j in range(1, length): for i in sentence: if i == "F": sentence += "FF+[+F-F-F]-[-F+F+F]" print(sentence)
import turtle
def generate(length):
sentence = "F"
for j in range(1, length):
for i in sentence:
if i == "F":
sentence += "FF+[+F-F-F]-[-F+F+F]"
print(sentence)
gen = turtle.Turtle()
window = turtle.Screen()
gen.left(90)
for k in sentence:
if k == "F":
gen.forward(10)
elif k == "+":
gen.right(10)
elif k == "-":
gen.left(10)
elif k == "[":
location = gen.position()
elif k == "]":
gen.setposition(location)
我在乌龟的窗户上看到一个奇怪的纹理图案:
如何生成所需的结果?您的
+=
操作将产生式规则的应用附加到字符串,但其思想是用产生式规则的结果替换出现的“F”
字符
您可以使用,它将替换子字符串的每次出现。您在编辑之前使用了此选项,但没有将函数的返回值赋回到原始的语句
变量(replace
不起作用,字符串是不可变的)
无论如何,额外的内部循环都是不必要的
另一个要点是:产生式规则是递归的,因此单个location
变量的存储空间不足,无法“记住”可能已执行的推送序列
下面是在多次迭代中应用产生式规则后的语句
变量的摘录:
...[-FF+[+F-F-F]-[-F+F+F]+...
很明显,在遇到]
之前,这有两个连续的[
操作。这种巢穴可以任意生长。数据结构是跟踪嵌套递归位置的最佳方法(location
只能跟踪最后一个位置,并且当两个推送操作连续发生时,状态将被破坏)
每当遇到[
操作时,推送堆栈上的位置(在Python中表示为一个列表,该列表只使用append
(用于推送)和pop
,不使用任何参数删除列表的背面)。每当遇到]
操作时,弹出堆栈并将海龟的位置设置为该位置
作为次要的一点,最好将硬编码的值保留在代码之外;将所有设置/配置变量分组到块的顶部。如果您使用的是函数,请使用以下参数
以下是一个工作版本:
import turtle
generations = 3
size = 10
rule = ("F", "FF+[+F-F-F]-[-F+F+F]")
sentence = "F"
positions = []
gen = turtle.Turtle()
gen.speed(10)
gen.left(90)
for i in range(generations):
sentence = sentence.replace(*rule)
for op in sentence:
if op == "F":
gen.forward(size)
elif op == "+":
gen.right(size)
elif op == "-":
gen.left(size)
elif op == "[":
positions.append(gen.position())
elif op == "]":
gen.setposition(positions.pop())
turtle.exitonclick()
>>>generate(3),3是字符串的长度,也就是treeOK的复杂度,当我运行时,我无法获得您的视觉效果。我在控制台上收到“F”的垃圾邮件,窗口立即关闭。你能发布你用来生成你发布的图像的确切代码吗?我可以肯定地说,
句子.replace
并没有做你认为它做的事情——它用第二个参数替换第一个参数的每一次出现,但它没有做到位。除此之外,我不确定你想达到什么目的。我在if I==“F”语句中犯了一个小错误,替换句子。将(I,“FF+[+F-F-F]-[-F+F]])替换为句子+=“FF+[+F-F-F]-[-F+F]-[-F+F]”我认为这也不是你想要的。请编辑您的帖子以提供这些更新。好的,我编辑了它,我将如何改进我的代码以获得所需的结果?