一款程序员版专属樱花树呈上~~
Turtle简介
Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制出你想要的图形。
Turtle常用函数
函数 | 命令 |
turtle.forward() | 向画笔向前移动一定距离 |
turtle.backward() | 向画笔向后移动一定距离 |
turtle.right() | 画笔顺时针移动一定度数 |
turtle.right() | 画笔逆时针移动一定度数 |
turtle.up() | 抬起画笔,之后移动画笔不绘制形状 |
turtle.down() | 落下画笔,之后移动画笔绘制形状 |
turtle.hideturtle() | 隐藏画笔 |
turtle.showturtle() | 显示画笔 |
turtle.color() | 画笔颜色 |
turtle.pensize() | 画笔宽度 |
更多Turtle函数的说明,可以访问:https://docs.python.org/3.0/library/turtle.html
模块拆分
如何画樱花树
1.先选取合适的躯干数,然后每次画一节分枝,并且采用随机数的原理使得每一次的分枝粗细、长短、朝向不同;
2.当到达分枝末梢,即分枝粗细小于12时,就可以开始画樱花了,同理樱花的颜色、大小也随着随机数的改变而不同;
3.然后返回上一个分枝的地方,朝着另一个方向画分枝,然后到达分枝末梢时加上樱花;
4.每次到达末梢时,不断返回上一分枝,循环操作,直到返回第一节分枝;
def tree(self, branch):
time.sleep(0.0005)
if branch > 3:
if 8 <= branch <= 12: # 到达分枝末梢,填充花瓣
if random.randint(0, 2) == 0:
T.color('snow') # 白色,画笔的颜色
T.pensize(random.randint(1, 3)) # 设置画笔的宽度
else:
T.color('lightcoral') # 淡珊瑚色
T.pensize(random.randint(2, 6)) # 红色稍微比白色宽些
# t.pensize(branch / 3)
elif branch < 8: # 设置不同的花瓣
if random.randint(0, 1) == 0:
T.color('snow')
T.pensize(random.randint(2, 4))
else:
T.color('lightcoral') # 淡珊瑚色
T.pensize(random.randint(4, 9))
# t.pensize(branch / 2)
else:
T.color('sienna') # 赭(zhě)色
T.pensize(branch / 10) # 渐渐缩小分枝粗细
T.forward(branch) # 画一段长度为branch的分枝
a = 1.5 * random.random()
T.right(20 * a) # 随机向右旋转绘制方向
b = 1.5 * random.random()
Sakura.tree(self, branch - 10 * b) # 绘制下一个分枝
T.left(40 * a) # 设置向左旋转的方向度数
Sakura.tree(self, branch - 10 * b)
T.right(20 * a)
T.up() # 抬起画笔,表示移动画笔不绘制形状
T.backward(branch) # 即画笔向后移动到上一个分枝的位置
T.down() # 落下画笔,表示移动画笔绘制形状
如何画落花
1.首先设定樱花花瓣落在【400,20】的长方形区域内,其次是樱花片数的选择,如果太少的话,会很不均匀,太多的话,就会变成一滩面饼,因此这里选择选择100;
2.然后根据随机数的不同使得花瓣落在不同的点,最后达到我们想要的效果
def petal(self, m):
for i in range(m):
a = 200 - 400 * random.random() # 在-200到200的区间内
b = 10 - 20 * random.random() # 在-10到10的区间内
# print(a, b)
T.up() # 抬起画笔
T.forward(b) # 前进b的长度
T.left(90) # 将画笔方向逆时针移动90°,即x轴负方向
T.forward(a) # 前进a的长度
T.down()
T.color('lightcoral') # 淡珊瑚色
T.circle(1) # 画一个半径为1的圆,颜色为画笔的颜色
T.up()
T.backward(a) # 后退a的长度
T.right(90) # 将画笔方向顺时针移动90°,即y轴正方向
T.backward(b) # 后退b的长度,即回到for循环之前的位置
完整代码
# -*- coding: UTF-8 -*-
import turtle as T
import random
import time
class Sakura:
"""
画布、画笔的相关初始化
"""
def __init__(self, bgcolor):
# 画布大小,默认(400,300)
self.w = T.Screen()
T.hideturtle() # 隐藏画笔
T.getscreen().tracer(5, 0) # 参数1用于加快作图,一次画出5次循环的图;参数2代表延迟时间
self.w.screensize(bg=bgcolor)
# 最开始时画笔朝着x轴的正方向
T.left(90) # 将画笔方向逆时针移动90°,即y轴正方向
T.backward(150) # 向画笔向后移动150距离
"""
樱花树躯干部分
"""
def tree(self, branch):
time.sleep(0.0005)
if branch > 3:
if 8 <= branch <= 12: # 到达分枝末梢,填充花瓣
if random.randint(0, 2) == 0:
T.color('snow') # 白色,画笔的颜色
T.pensize(random.randint(1, 3)) # 设置画笔的宽度
else:
T.color('lightcoral') # 淡珊瑚色
T.pensize(random.randint(2, 6)) # 红色稍微比白色宽些
# t.pensize(branch / 3)
elif branch < 8: # 设置不同的花瓣
if random.randint(0, 1) == 0:
T.color('snow')
T.pensize(random.randint(2, 4))
else:
T.color('lightcoral') # 淡珊瑚色
T.pensize(random.randint(4, 9))
# t.pensize(branch / 2)
else:
T.color('sienna') # 赭(zhě)色
T.pensize(branch / 10) # 渐渐缩小分枝粗细
T.forward(branch) # 画一段长度为branch的分枝
a = 1.5 * random.random()
T.right(20 * a) # 随机向右旋转绘制方向
b = 1.5 * random.random()
Sakura.tree(self, branch - 10 * b) # 绘制下一个分枝
T.left(40 * a) # 设置向左旋转的方向度数
Sakura.tree(self, branch - 10 * b)
T.right(20 * a)
T.up() # 抬起画笔,表示移动画笔不绘制形状
T.backward(branch) # 即画笔向后移动到上一个分枝的位置
T.down() # 落下画笔,表示移动画笔绘制形状
"""
掉落的花瓣
"""
def petal(self, m):
for i in range(m):
a = 200 - 400 * random.random() # 在-200到200的区间内
b = 10 - 20 * random.random() # 在-10到10的区间内
# print(a, b)
T.up() # 抬起画笔
T.forward(b) # 前进b的长度
T.left(90) # 将画笔方向逆时针移动90°,即x轴负方向
T.forward(a) # 前进a的长度
T.down()
T.color('lightcoral') # 淡珊瑚色
T.circle(1) # 画一个半径为1的圆,颜色为画笔的颜色
T.up()
T.backward(a) # 后退a的长度
T.right(90) # 将画笔方向顺时针移动90°,即y轴正方向
T.backward(b) # 后退b的长度,即回到for循环之前的位置
if __name__ == "__main__":
s1 = Sakura('black') # 设置画布的背景颜色
s1.tree(60) # 樱花的躯干
s1.petal(500) # 掉落的花瓣
s1.w.exitonclick()