使用python和turtle绘制樱花树

使用python和turtle绘制樱花树

一.完整代码

import turtle
import random
import time


# 绘制樱花树的函数
def draw_tree(branch_length, pen):
    time.sleep(0.005)  # 控制绘制速度
    if branch_length > 3:
        # 根据枝干长度设置画笔颜色和粗细
        if 8 <= branch_length <= 12:
            pen.color('lightcoral')  # 绿色
            pen.pensize(branch_length / 3)
        elif branch_length < 8:
            pen.color('snow')
            pen.pensize(branch_length / 2)
        else:
            pen.color('sienna')  # 赭色
            pen.pensize(branch_length / 10)
        # 绘制枝干
        pen.forward(branch_length)
        angle = 1.5 * random.random()
        pen.right(20 * angle)
        reduce_length = 10 * 1.5 * random.random()
        # 递归绘制树枝
        draw_tree(branch_length - reduce_length, pen)
        pen.left(40 * angle)
        # 递归绘制花
        draw_tree(branch_length - reduce_length, pen)
        pen.right(20 * angle)
        pen.up()
        pen.backward(branch_length)
        pen.down()


# 绘制花瓣的函数
def draw_petals(count, pen):
    for i in range(count):
        distance = 200 - 400 * random.random()
        angle = 10 - 20 * random.random()
        pen.up()
        pen.forward(angle)
        pen.left(90)
        pen.forward(distance)
        pen.down()
        pen.color('lightcoral')  # 淡珊瑚色
        pen.circle(1)
        pen.up()
        pen.backward(distance)
        pen.right(90)
        pen.backward(angle)


# 设置画布和画笔(返回一个画布对象TurtleScreen )
window = turtle.Screen()
# 设置画布颜色小麦色
window.bgcolor('wheat')
# 控制绘制速度 每次绘制后暂停5毫秒 0代表立刻更新画布
window.tracer(5, 0)
# 用于创建画笔的函数 (返回一个Turtle对象)
pen = turtle.Turtle()
# 隐藏画笔
# pen.hideturtle()

# 移动画笔到起始位置并设置方向
pen.left(90)
pen.up()
pen.backward(150)
pen.down()
pen.color('sienna')

# 绘制樱花树
draw_tree(60, pen)

# 绘制花瓣
draw_petals(200, pen)

# 点击退出
window.exitonclick()


二.代码详解

1.用到的库

  • turtle
  • random
  • time

Turtle

Turtle 是 Python 中一个简单而有趣的绘图库,它模拟了一只海龟(turtle)在画布上移动的过程,通过控制海龟的移动和画笔的属性,可以实现各种图形的绘制和动画效果。Turtle 库通常用于教学和初学者入门编程,因为它易于理解和上手,同时也可以用于创建一些简单的图形和动画。

以下是 Turtle 库的一些主要特点和功能:

  1. 绘制图形: 可以使用 Turtle 库来绘制各种图形,包括直线、圆形、多边形、矩形等。

  2. 控制海龟: 可以控制海龟的移动方向、步长、旋转角度等,从而实现复杂的图形绘制。

  3. 画笔属性: 可以设置画笔的颜色、粗细、填充颜色等属性,使得绘制出的图形更加丰富多彩。

  4. 动画效果: Turtle 库支持绘制动画效果,通过控制海龟的移动和画笔的属性变化,可以实现各种动态效果。

  5. 事件处理: 可以注册事件处理器,例如点击画布时执行特定的函数,从而实现交互式的绘图和动画。

  6. 保存图形: 可以将绘制的图形保存为图片文件,例如 PNG、JPEG 等格式。

  7. 轨迹记录: Turtle 库可以记录海龟移动的轨迹,从而实现绘制复杂图形的功能。

下面是一个简单的使用 Turtle 库绘制正方形的示例代码:

import turtle

# 创建画布和海龟
window = turtle.Screen()
t = turtle.Turtle()

# 绘制正方形
for _ in range(4):
    t.forward(100)  # 向前移动100个像素
    t.right(90)  # 向右旋转90度

# 点击退出
window.exitonclick()

这段代码创建了一个画布和一只海龟,然后使用海龟绘制了一个正方形。点击画布任意位置可以退出绘制。这只是 Turtle 库的一个简单示例,你可以通过探索更多的方法和属性,实现更多有趣的图形和动画效果。
效果:
在这里插入图片描述

random

random 是 Python 标准库中的一个模块,用于生成各种随机数,包括整数、浮点数和随机选择序列中的元素等。random 模块提供了一系列函数,可以用于生成随机数,控制随机数的范围和分布,以及实现随机抽样等功能。

以下是 random 模块常用的功能和函数:

  1. 生成随机整数:

    • random.randint(a, b): 返回一个包含在闭区间 [a, b] 内的随机整数。
    • random.randrange(start, stop[, step]): 返回一个在范围 [start, stop) 内按指定步长 step 递增的随机整数。
  2. 生成随机浮点数:

    • random.random(): 返回一个 0 到 1 之间的随机浮点数。
    • random.uniform(a, b): 返回一个在闭区间 [a, b] 内的随机浮点数。
  3. 随机选择序列元素:

    • random.choice(sequence): 从序列 sequence 中随机选择一个元素并返回。
    • random.sample(population, k): 从总体 population 中随机选择 k 个元素作为样本,并返回一个新列表。
  4. 打乱序列:

    • random.shuffle(sequence): 将序列 sequence 中的元素随机打乱顺序。
  5. 随机种子:

    • random.seed(a=None): 初始化随机数生成器的种子。如果不提供种子 a,则使用系统时间作为种子,否则使用指定的种子。

通过使用 random 模块,你可以生成各种需要的随机数,实现随机化的功能。等会咱们就要用到random.random()函数。

time

time 是 Python 标准库中的一个模块,用于处理时间相关的操作,包括获取当前时间、延时等待、时间格式转换等功能。time 模块提供了一系列函数,可以用于获取系统时间、计算时间间隔、格式化时间字符串等操作。

以下是 time 模块常用的功能和函数:

  1. 获取当前时间:

    • time.time(): 返回当前时间的时间戳(Unix 时间戳,即自 1970 年 1 月 1 日以来的秒数)。
    • time.localtime([seconds]): 将时间戳转换为本地时间的 struct_time 对象,或者将当前时间转换为 struct_time 对象。
  2. 时间格式转换:

    • time.strftime(format[, t]): 将 struct_time 对象或时间戳 t 格式化为指定格式的字符串。
    • time.strptime(string, format): 将格式化的时间字符串 string 解析为 struct_time 对象。
  3. 延时等待:

    • time.sleep(seconds): 让程序休眠指定的时间(秒),用于实现延时操作。
  4. 计时器:

    • time.clock(): 返回程序运行的 CPU 时间,用于性能分析和计时。
  5. 其他功能:

    • time.gmtime([seconds]): 将时间戳转换为 UTC 时间的 struct_time 对象。
    • time.monotonic(): 返回一个单调递增的时钟,用于测量时间间隔,不受系统时间调整的影响。

通过使用 time 模块,你可以在程序中获取和处理时间信息,实现各种时间相关的功能,例如实现定时任务、记录程序运行时间、格式化输出时间信息等。等会咱们用到time.sleep(seconds)函数。

2.主函数

# 设置画布和画笔(返回一个画布对象TurtleScreen )
window = turtle.Screen()
# 设置画布颜色小麦色
window.bgcolor('wheat')
# 控制绘制速度 每次绘制后暂停5毫秒 0代表立刻更新画布
window.tracer(5, 0)
# 用于创建画笔的函数 (返回一个Turtle对象)
pen = turtle.Turtle()
# 隐藏画笔
# pen.hideturtle()

# 移动画笔到起始位置并设置方向
pen.left(90)
pen.up()
pen.backward(150)
pen.down()
pen.color('sienna')

# 绘制樱花树
draw_tree(60, pen)

# 绘制花瓣
draw_petals(200, pen)

# 点击退出
window.exitonclick()

要想画一颗樱花树,首先得有画布 window = turtle.Screen() 是 Python Turtle 模块中用于创建画布(canvas)的函数。它返回一个 TurtleScreen 对象,你可以用这个对象来控制画布的各种属性和行为,比如设置背景颜色、大小,注册事件处理器等等。

window.bgcolor('wheat')给画布设置成小麦色。

window.tracer(5, 0) 是用于控制绘图窗口(即画布)更新速度的方法。

具体来说,这个方法的参数含义如下:

  • 第一个参数 5 表示设置绘图窗口的更新延迟,即每次绘制之后暂停 5 毫秒。
  • 第二个参数 0 表示立即更新绘图窗口,即在每次绘制后立即更新画布显示。

绘图窗口的更新速度控制了绘制图形时的动画效果。通过设置适当的更新延迟,可以控制绘图的流畅度和速度,使得绘制出的图形动画更加真实和连续。

在咱们的代码中,window.tracer(5, 0) 用于控制绘图窗口的更新速度,每次绘制后暂停 5 毫秒,然后立即更新画布显示,从而实现动画效果的控制。

目前画布准备完毕了,然后就需要画笔了,pen = turtle.Turtle() 用于获取一个画笔对象,然后就可以使用这个对象来绘制各种形状和图案,控制画笔的移动、颜色、粗细等属性。

下面是一些常用的 Turtle 方法示例:

  • 移动画笔:

    pen.forward(100)  # 向前移动100个像素
    
  • 设置画笔颜色:

    pen.color('blue')  # 设置画笔颜色为蓝色
    
  • 设置画笔粗细:

    pen.pensize(2)  # 设置画笔粗细为2个像素
    
  • 向左旋转画笔:

    pen.left(90)  # 向左旋转90度
    
  • 向右旋转画笔:

    pen.right(90)  # 向右旋转90度
    

通过使用 Turtle 对象的方法,你可以实现各种绘图操作,例如绘制线条、图形,甚至是复杂的动画效果。

3.draw_tree绘制树干函数

首先咱们先绘制不加转向的树干,其中主要绘制思路就是:将树干分成一段一段的,长的树干比较粗,然后通过递归方法依次将树干长度减少,同时宽度也减少,当长度 branch_length < 20则开始绘制花朵(就是将颜色设置成红色)当长度20 <= branch_length <= 30时开始绘制树叶(就是将颜色设置成绿色)否则就是树干的部分了,将颜色设置成褐色。

import turtle
import random
import time


# 绘制樱花树
def draw_tree(branch_length, pen):
    time.sleep(1)
    if branch_length > 5:
        # 根据枝干长度设置画笔颜色和粗细
        if 20 <= branch_length <= 30:
            pen.color('green')  # 绿色
            pen.pensize(branch_length / 3)
        elif branch_length < 20:
            pen.color('pink')
            pen.pensize(branch_length / 2)
        else:
            pen.color('sienna')  # 赭色
            pen.pensize(branch_length / 10)
        # 绘制枝干
        pen.forward(branch_length)
        # 递归绘制树枝
        reduce_length = int(10 * 1.5 * random.random())
        print('枝干长度:%s 减去的长度:%s' % (branch_length, reduce_length))
        draw_tree(branch_length - reduce_length, pen)



# 设置画布和画笔(返回一个画布对象TurtleScreen )
window = turtle.Screen()
# 设置画布颜色小麦色
window.bgcolor('wheat')
# 控制绘制速度 每次绘制后暂停5毫秒 0代表立刻更新画布
window.tracer(1, 0)
# 用于创建画笔的函数 (返回一个Turtle对象)
pen = turtle.Turtle()

# 移动画笔到起始位置并设置方向
pen.left(90)
pen.up()
pen.backward(150)
pen.down()
pen.color('sienna')

time.sleep(5)


draw_tree(60, pen)


# 点击退出
window.exitonclick()

效果:
在这里插入图片描述
下面加上向右偏的代码

pen.forward(branch_length)
angle = 1.5 * random.random()
pen.right(20 * angle)
draw_tree(branch_length - reduce_length, pen)

random.random() 函数返回的随机数取值范围是 [ 0 , 1 ) [0, 1) [0,1),即包括 0 而不包括 1。换句话说,返回的随机数是大于等于 0 且小于 1 的浮点数。所以201.5 [ 0 , 1 ) [0, 1) [0,1)的取值范围就是 [ 0 , 30 ) [0, 30) [0,30) 也就是说树干向右生长最多不超过30度。

效果:
在这里插入图片描述
同样的道理,咱们再加上向左生长的代码,这里需要注意以下向左偏移(生长)的度数应该在 [ 0 , 60 ) [0, 60) [0,60)之间了,因为这样整体树干分布左右比较平均。
pen.left(40 * angle)
效果:
在这里插入图片描述
目前代码:
在这里插入图片描述

到这里树干可以向左或向右生长了,然后咱们如何给他们同时加上向右或向左生长的代码呢?
如果同时调用递归绘制就会变成这样:
在这里插入图片描述
在这里插入图片描述
是不是有点问题,没要按照咱们想象的画完右边画左边,问题就在于向右画完了,提笔,然后后退到上一步的地方,然后落笔,再转向,再次重复上述操作。
后退的代码:
pen.right(20 * angle)
pen.up()
pen.backward(branch_length)
pen.down()

效果:
在这里插入图片描述
是不是有一点点像樱花树了,下面咱们再画上落下时花瓣。

4.draw_petals绘制花瓣函数

def draw_petals(count, pen):
    for i in range(count):
        distance = 200 - 400 * random.random()
        angle = 10 - 20 * random.random()
        pen.up()
        pen.forward(angle)
        pen.left(90)
        pen.forward(distance)
        pen.down()
        pen.color('lightcoral')  # 淡珊瑚色
        pen.circle(1)
        pen.up()
        pen.backward(distance)
        pen.right(90)
        pen.backward(angle)

这个函数就比较简单了,就是在指定的区域内画园就行了

注:上面画完树干笔会回到树的根部。

首先distance取值范围是 ( − 200 , 200 ] (-200,200] (200,200]
angle 取值范围是 ( − 10 , 10 ] (-10,10] (10,10]

pen.up()
pen.forward(angle)
然后抬笔,向上移动(因为之前画树时笔的朝向是正上方)angle的距离

pen.left(90)
pen.forward(distance)
再向左移动 distance距离

pen.down()
pen.color('lightcoral') # 淡珊瑚色
pen.circle(1)
接着落笔,画半径为1是园

pen.up()
pen.backward(distance)
pen.right(90)
pen.backward(angle)
再然后抬笔回到初始位置

上述操作重复执行指定的次数,就可以画指定个画瓣了。
在这里插入图片描述

在这里插入图片描述
最后放在一起,一颗漂亮的樱花树就绘制完成啦!
在这里插入图片描述

  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值