pythonturtle树代码_python之turtle使用:画一颗美美哒的树

以上就是小生牺牲午休时间捣鼓出来的~虽然不是辣么好看,但是还是想跟大伙分享一下,进入正题。

代码主要分为两部分:树代码部分,地上花瓣部分

树代码部分

其实代码很简单,主要是我们得知道如何去实现那些关键点(我知道这是废话,但是我总得说点什么凑字数...):

1,树干应该是越往上越细 - 即画笔越往上 size 尺寸越小

2,枝干越往上越短 - 枝干延伸的长度

3,枝干会分叉 - 即递归事件继续执行的入口

4,枝干分叉的角度 - 画笔偏移度

4,要长点什么 - 递归事件的出口

满足了以上几点,这棵树看起来才会正常一点(或者说符合大众观念)。总的来说,我们需要一个点来决定递归事件

的入口和出口,这里我用分叉次数来决定,当然还可以用延伸长度等或一个变量,只要我们能找到出入条件,看代码:

# 画树方法: n为枝干延伸次数,l为枝干延伸长度

def drawTree(n, l):

pendown()

# 设置画笔颜色 - 枝干颜色

pencolor('#5d3c3c')

# 画笔尺寸

pensize( n / 1.5)

# 延伸长度

forward(l)

# 根据 n 判断是否继续递归延伸枝干 或 结束本分支延伸

if n > 0:

# dr 为画笔顺时针偏移度,dl 为画笔逆时针偏移度

dr = randint(30, 40)

dl = randint(30, 40)

# 本次延伸长度:每一次随机减少延伸长度(所以也可以根据 l 来设置 pensize等)

move = l * (random() * 0.4 + 0.5)

# 顺时针偏移 dr

right(dr)

# 递归调用自身,剩余延伸次数 -1

drawTree(n - 1, move)

# 因为上面顺时针偏移了 dr,所以顺时针的偏移度加上逆时针偏移度:dr + dl 才是分叉实际偏移度

left(dr + dl)

drawTree(n - 1, move)

# 顺时针偏移dl,回到画笔原指向

right(dl)

else:

# 本分支延伸结束,调用画花朵方法

drawPetal(3)

# 提起画笔

penup()

# 回到开始延伸的位置

backward(l)

花朵代码:

枝干完成指定分叉次数后,为了好看一点,即需要长点什么,如代码:

# 花朵绘画方法: n 为花朵半径(其实就是圆半径...)

def drawPetal(n):

# 指定颜色模式为 rgb 模式

colormode(255)

# 随机生成 rgb 色值

r = randint(200, 255)

g = randint(8, 158)

b = randint(8, 158)

# 画圆并填充颜色

begin_fill()

fillcolor(r, g, b)

pencolor(r, g, b)

circle(n)

end_fill()

到这里如果只是为了画一棵树,那我们的工作已经基本完成了,当然我们需要一个启动方法:

def run():

# 设置画布比例: 相对显示屏

setup(1.0, 1.0)

penup()

# 移动到坐标 (-50, -150)

goto(-50, -150)

# 逆时针旋转90度,使画笔指向正上方

left(90)

pendown()

# 隐藏画笔

hideturtle()

# 是否追踪绘画过程:即是否一步一步显示绘画过程

tracer(False)

# 调用树方法

drawTree(13, 150)

将上诉代码复制到编辑器里,在调用 run()方法,一棵树神奇的树就会出现了(假设你已经安装了python运行环境)。

让我们再给它洒上一些花瓣,这里花瓣的位置小生将它放在树起始点下方,其实你完全可以随意指定位置和范围以及大小

来展示一张飘落的效果(我已经看过了,很好看):

# 花瓣位置生成: m 为花瓣数量,x y 决定绘画花瓣初始位置

# 这里我将花瓣初始位置设置为树起点位置附近

def petalPlace(m, x, y):

penup()

goto(x, y)

pendown()

setheading(0)

tracer(False)

for i in range(m):

# 起始点画一朵

if i == 0:

drawPetal(5)

else:

penup()

goto(x, y)

# a 为下一朵花瓣水平方向相对起始点距离

a = randint(20, 400)

# b 为下一朵花瓣垂直方向相对起始点距离

b = randint(-50, 50)

# 将画笔移动相应距离

forward(a)

left(90)

forward(b)

right(90)

pendown()

# 调用花瓣绘画方法

drawPetal(5)

到这里我们的所有代码已经完成,下面是所有代码(已去掉注释):

from turtle import *

from random import *

# 画树方法

def drawTree(n, l):

pendown()

pencolor('#5d3c3c')

pensize( n / 1.5)

forward(l)

if n > 0:

dr = randint(30, 40)

dl = randint(30, 40)

move = l * (random() * 0.4 + 0.5)

right(dr)

drawTree(n - 1, move)

left(dr + dl)

drawTree(n - 1, move)

right(dl)

else:

drawPetal(3)

penup()

backward(l)

# 花瓣位置生成

def petalPlace(m, x, y):

penup()

goto(x, y)

pendown()

setheading(0)

tracer(False)

for i in range(m):

if i == 0:

drawPetal(5)

else:

penup()

goto(x, y)

a = randint(20, 400)

b = randint(-50, 50)

forward(a)

left(90)

forward(b)

right(90)

pendown()

drawPetal(5)

# 花朵绘画方法

def drawPetal(n):

colormode(255)

r = randint(200, 255)

g = randint(8, 158)

b = randint(8, 158)

begin_fill()

fillcolor(r, g, b)

pencolor(r, g, b)

circle(n)

end_fill()

# 启动方法

def run():

setup(1.0, 1.0)

penup()

goto(-50, -150)

left(90)

pendown()

hideturtle()

tracer(False)

drawTree(13, 150)

petalPlace(160, -100, -150)

run()

done()

值得注意的是,因为我们使用了很多随机生成的值,所以每一次生成的树都一样,也就是你说,我们可以造一片森林,

有了上面的代码,我们需要补充的已经很少了:

大致思路就是随机生成树的起始点,再调用我们上面的方法就可以了,当然为了美观,部分数值是需要细调的,

最起码每棵树下面的花瓣这个方法不需要了,我们可以换成给整个区域的树加上花瓣飘落效果,这里给个森林例子

(没有改花瓣):

# m 对应生成树的数量

def run(m):

setup(1.0, 1.0)

for i in range(m):

penup()

x = randint(-500, 500)

y = randint(-300, 300)

goto(x ,y)

left(90)

tracer(False)

drawTree(10, 150)

petalPlace(100, x, y)

你可能感兴趣的:(pythonturtle树代码)