Python:绘制樱花树
这篇文章参考了别人的博客《三月桃花开,用python给你带来你的桃花运,详细解析画一棵表白树》[1],原文作者:沙漏在下雨,这里简单记录一下学习过程。
这里使用的是 python 的 turtle 模块,如果读者使用的是 Pycharm ,在使用 turtle 时会存在一些问题,可以看我的另一篇博客《Ubuntu:解决PyCharm中turtle模块无法使用的问题》[2]。
目录
一、代码详解
(一)绘制画幕
(二)绘制落花
(三)绘制树枝与花瓣
(四)绘制多棵树
二、完整代码
(一)完整代码
(二)效果
一、代码详解
(一)绘制画幕首先绘制画幕,命令说明如下:
screensize(width, height, bg=color):设置画幕大小及颜色setup(p1, p2):设置画幕大小,当 p1、p2 为小数时表示屏幕占比;当 p1、p2 为整数时表示像素tracer(speed):设置绘制速度,speed越大表示绘制速度越快def get_screen(width, height, color, speed):
screen_obj = turtle.Screen()
screen_obj.screensize(width, height, bg=color)
screen_obj.setup(1.0, 1.0)
screen_obj.tracer(speed)
return screen_obj
' (二)绘制落花在确定落花数量的情况下,我们首先要评估落花的范围,这里通过两句语句来约束落花的范围(落花数量越多,当然地落花范围也就越大):
x = flower - 4 * flower * random()
y = 10 - 20 * random()
然后我们来讲讲 turtle 常用的几个命令吧:
首先,我们得明确,对于 turtle 画布来说,其为一个 xOy 的平面,画布中心为原点 O ;对于 turtle 画笔来说,其有一个初始方向,指向 x 轴正方向。
penup():起笔(可以想象成画画的时候沾墨之后提笔)forward():向前移动backward():向后移动left(degree):逆时针旋转 degree 度right(degree):顺时针旋转 degree 度pendown():落笔pencolor(color):笔墨颜色为 colorcircle(r):画一个半径为 r 的圆代码如下:
def draw_petal(turtle_obj, flower):
for i in range(int(flower / 2)):
x = flower - 2 * flower * random()
y = 10 - 20 * random()
turtle_obj.penup()
turtle_obj.forward(y)
turtle_obj.left(90)
turtle_obj.forward(x)
turtle_obj.pendown()
turtle_obj.pencolor("lightcoral")
turtle_obj.circle(1)
turtle_obj.penup()
turtle_obj.backward(x)
turtle_obj.right(90)
turtle_obj.backward(y)
turtle_obj.pendown()
' (三)绘制树枝与花瓣读者会发现,在 drwa_tree 方法中,又出现了两次 drwa_tree 方法,这是一个递归的方法,可以简单理解为一棵树最下面的树枝最少且最粗,越往上树枝数量增加但是变细了。如果读者看不懂如下代码的话,可以查看《Turtle(python)画分形树理解递归》[3]文章。
def draw_tree(turtle_obj, branch, tree_color):
min_branch = 4
if branch > min_branch:
if branch < 8:
if randint(0, 1) == 0:
turtle_obj.pencolor("snow")
else:
turtle_obj.pencolor("lightcoral")
turtle_obj.pensize(branch / 2)
elif 8 <= branch <= 16:
if randint(0, 2) == 0:
turtle_obj.pencolor("snow")
else:
turtle_obj.pencolor("lightcoral")
turtle_obj.pensize(branch / 4)
else:
turtle_obj.pencolor(tree_color)
turtle_obj.pensize(branch / 10)
turtle_obj.forward(branch)
a = 1.5 * random()
turtle_obj.right(20 * a)
b = 1.5 * random()
draw_tree(turtle_obj, branch - 10 * b, tree_color)
turtle_obj.left(40 * a)
draw_tree(turtle_obj, branch - 10 * b, tree_color)
turtle_obj.right(20 * a)
turtle_obj.penup()
turtle_obj.backward(branch)
turtle_obj.pendown()
' (四)绘制多棵树这部分代码的前半部分是用来约束树根的位置的,为了使树可以在图像中显示地较为完成,较大的树根应该更靠近于画幕底端,且不能太靠近两边,其余部分代码就很容易理解了。
def trees(tree_num):
color = ['brown', 'tan', 'black']
for j in range(tree_num):
tree_color = color[randint(0, len(color) - 1)]
pensize = randint(2, 5)
forward = ((-1) ** pensize) * pensize * randint(20, 50)
if pensize <= 3:
backward = ((-1) ** pensize) * (5 - pensize) * randint(10, 15)
else:
backward = pensize * randint(45, 50)
turtle_obj = turtle.Turtle()
turtle_obj.pensize(pensize)
turtle_obj.penup()
turtle_obj.forward(forward)
turtle_obj.left(90)
turtle_obj.backward(backward)
turtle_obj.pendown()
turtle_obj.pencolor(tree_color)
branch = pensize * 15
flowers = branch
draw_tree(turtle_obj, branch, tree_color)
draw_petal(turtle_obj, flowers)
'二、完整代码
(一)完整代码给出完整代码:
import turtle
from random import random
from random import randint
def draw_petal(turtle_obj, flower):
for i in range(int(flower)):
x = flower - 4 * flower * random()
y = 10 - 20 * random()
turtle_obj.penup()
turtle_obj.forward(y)
turtle_obj.left(90)
turtle_obj.forward(x)
turtle_obj.pendown()
turtle_obj.pencolor("lightcoral")
turtle_obj.circle(1)
turtle_obj.penup()
turtle_obj.backward(x)
turtle_obj.right(90)
turtle_obj.backward(y)
turtle_obj.pendown()
def draw_tree(turtle_obj, branch, tree_color):
min_branch = 4
if branch > min_branch:
if branch < 8:
if randint(0, 1) == 0:
turtle_obj.pencolor("snow")
else:
turtle_obj.pencolor("lightcoral")
turtle_obj.pensize(branch / 2)
elif 8 <= branch <= 16:
if randint(0, 2) == 0:
turtle_obj.pencolor("snow")
else:
turtle_obj.pencolor("lightcoral")
turtle_obj.pensize(branch / 4)
else:
turtle_obj.pencolor(tree_color)
turtle_obj.pensize(branch / 10)
turtle_obj.forward(branch)
a = 1.5 * random()
turtle_obj.right(20 * a)
b = 1.5 * random()
draw_tree(turtle_obj, branch - 10 * b, tree_color)
turtle_obj.left(40 * a)
draw_tree(turtle_obj, branch - 10 * b, tree_color)
turtle_obj.right(20 * a)
turtle_obj.penup()
turtle_obj.backward(branch)
turtle_obj.pendown()
def get_screen(width, height, color, speed):
screen_obj = turtle.Screen()
screen_obj.screensize(width, height, bg=color)
screen_obj.setup(1.0, 1.0)
screen_obj.tracer(speed)
return screen_obj
def trees(tree_num):
color = ['brown', 'tan', 'black']
for j in range(tree_num):
tree_color = color[randint(0, len(color) - 1)]
pensize = randint(2, 5)
forward = ((-1) ** pensize) * pensize * randint(20, 50)
if pensize <= 3:
backward = ((-1) ** pensize) * (5 - pensize) * randint(10, 15)
else:
backward = pensize * randint(45, 50)
turtle_obj = turtle.Turtle()
turtle_obj.pensize(pensize)
turtle_obj.penup()
turtle_obj.forward(forward)
turtle_obj.left(90)
turtle_obj.backward(backward)
turtle_obj.pendown()
turtle_obj.pencolor(tree_color)
branch = pensize * 15
flowers = branch
draw_tree(turtle_obj, branch, tree_color)
draw_petal(turtle_obj, flowers)
if __name__ == '__main__':
my_screen_width = 800
my_screen_height = 600
my_screen_color = 'wheat'
my_screen_speed = 5
my_screen_obj = get_screen(my_screen_width, my_screen_height,
my_screen_color, my_screen_speed)
my_tree_num = 5
trees(my_tree_num)
my_screen_obj.exitonclick()
(二)效果整体效果还是挺美的。
[1] 三月桃花开,用python给你带来你的桃花运,详细解析画一棵表白树!_python桃花程序-CSDN博客
[2] Study:解决PyCharm中turtle模块无法使用的问题_pycharm turtle不能用-CSDN博客
[3] Turtle(python)画分形树理解递归_python分形数-CSDN博客
相关知识
python 绘制一个四瓣花图
用Python绘制樱花树、玫瑰花各种表白代码,从此不再缺女朋友
python绘制花
Python绘制花朵
python绘制一朵栀子花
绘制玫瑰花并添加文字python
用python turtle绘制一朵玫瑰花
python绘制玫瑰花情人节表白
Python实战——自动生成情人节对女朋友表白玫瑰花、爱心,以及用Python画一颗樱花树,愿祖国繁花与共!
如何用简单的Python绘制一朵花
网址: Python:绘制樱花树 https://www.huajiangbk.com/newsview1148624.html
上一篇: 「樱花树专题」最全面的樱花树相关 |
下一篇: 樱花树几月份可以移栽 |
推荐分享

- 1君子兰什么品种最名贵 十大名 4012
- 2世界上最名贵的10种兰花图片 3364
- 3花圈挽联怎么写? 3286
- 4迷信说家里不能放假花 家里摆 1878
- 5香山红叶什么时候红 1493
- 6花的意思,花的解释,花的拼音 1210
- 7教师节送什么花最合适 1167
- 8勿忘我花图片 1103
- 9橄榄枝的象征意义 1093
- 10洛阳的市花 1039