Python画出一个樱花树说出它的设计思路
时间: 2023-06-26 17:08:46 浏览: 169
如何基于python实现画不同品种的樱花树
设计思路:
1. 导入必要的库和模块:`turtle`、`random`和`colorsys`。
2. 设置画布的大小和背景色,并隐藏画笔。
3. 定义樱花树的枝干和叶子的形状和颜色。
4. 定义递归函数 `draw_tree`,用于画樱花树的枝干和叶子。
5. 在 `draw_tree` 函数中,设置递归停止的条件。当枝干长度小于 10 时,停止递归。
6. 在 `draw_tree` 函数中,设置枝干的颜色和粗细,并画出枝干。然后随机生成 3 到 4 个不同角度的枝干,分别调用 `draw_tree` 函数,递归画出这些枝干。
7. 在 `draw_tree` 函数中,如果枝干长度大于 50,就开始画出樱花叶子。首先设置叶子的颜色,并画出叶子。然后随机生成 3 到 4 个不同角度的叶子,分别调用 `draw_tree` 函数,递归画出这些叶子。
8. 在 `draw_tree` 函数中,如果枝干长度大于 70,就开始画出樱花花瓣。首先设置花瓣的颜色,并画出花瓣。然后随机生成 3 到 4 个不同角度的花瓣,分别调用 `draw_tree` 函数,递归画出这些花瓣。
9. 最后调用 `draw_tree` 函数,画出整个樱花树。
代码实现:
```python
import turtle
import random
import colorsys
# 设置画布大小和背景色,隐藏画笔
turtle.setup(width=800, height=600)
turtle.bgcolor('black')
turtle.hideturtle()
# 定义樱花树的枝干和叶子的形状和颜色
branches = [(25, 100, 15), (20, 80, 10), (15, 60, 5), (10, 40, 2)]
leaves = [(150, 255, 200), (180, 255, 150), (200, 255, 100), (220, 255, 50)]
petals = [(255, 150, 150), (255, 180, 180), (255, 200, 200), (255, 220, 220)]
# 定义递归函数 draw_tree,用于画樱花树的枝干和叶子
def draw_tree(length, angle, scale):
# 设置递归停止的条件,当枝干长度小于 10 时,停止递归
if length < 10:
return
# 设置枝干的颜色和粗细,并画出枝干
hue = random.uniform(0.1, 0.2)
saturation = random.uniform(0.5, 0.8)
lightness = random.uniform(0.1, 0.3)
turtle.pensize(scale * 5)
turtle.pencolor(colorsys.hls_to_rgb(hue, lightness, saturation))
turtle.forward(length)
# 随机生成 3 到 4 个不同角度的枝干,分别调用 draw_tree 函数,递归画出这些枝干
for i in range(random.randint(3, 4)):
sub_angle = angle + random.uniform(-30, 30)
sub_scale = scale * random.uniform(0.6, 0.8)
turtle.left(sub_angle)
draw_tree(length * random.uniform(0.6, 0.8), sub_angle, sub_scale)
turtle.right(sub_angle)
# 如果枝干长度大于 50,就开始画出樱花叶子
if length > 50:
# 设置叶子的颜色,并画出叶子
hue, lightness, saturation = random.choice(leaves)
turtle.pensize(scale * 2)
turtle.pencolor((hue, lightness, saturation))
turtle.circle(length * random.uniform(0.6, 0.8), 60)
# 随机生成 3 到 4 个不同角度的叶子,分别调用 draw_tree 函数,递归画出这些叶子
for i in range(random.randint(3, 4)):
sub_angle = angle + random.uniform(-30, 30)
sub_scale = scale * random.uniform(0.6, 0.8)
turtle.left(sub_angle)
draw_tree(length * random.uniform(0.6, 0.8), sub_angle, sub_scale)
turtle.right(sub_angle)
# 如果枝干长度大于 70,就开始画出樱花花瓣
if length > 70:
# 设置花瓣的颜色,并画出花瓣
hue, lightness, saturation = random.choice(petals)
turtle.pensize(scale * 1)
turtle.pencolor((hue, lightness, saturation))
turtle.circle(length * random.uniform(0.7, 0.9), 90)
# 随机生成 3 到 4 个不同角度的花瓣,分别调用 draw_tree 函数,递归画出这些花瓣
for i in range(random.randint(3, 4)):
sub_angle = angle + random.uniform(-30, 30)
sub_scale = scale * random.uniform(0.6, 0.8)
turtle.left(sub_angle)
draw_tree(length * random.uniform(0.6, 0.8), sub_angle, sub_scale)
turtle.right(sub_angle)
# 画完一个枝干后,返回到上一个枝干的位置和角度
turtle.penup()
turtle.backward(length)
turtle.right(angle)
turtle.pendown()
# 调用 draw_tree 函数,画出整个樱花树
turtle.speed('fastest')
turtle.left(90)
draw_tree(100, 0, 1)
turtle.done()
```
通过上述代码,我们可以画出一个随机生成的樱花树,每次运行程序都会得到不同的结果。具体效果如下图所示:
![樱花树](https://cdn.jsdelivr.net/gh/Yousazoe/picture-bed/20210930173614.png)
阅读全文