第一次写博客,多有不当之处,敬请指导改正.
如有侵权(可能),请联系本账号删除
这里没有对花瓣飘落代码进行分析,写博客是为了激励自己每天敲代码
各位一起加油啊(ง •_•)ง
// 总览
#转自知乎大佬的樱花树画法
#turtle库的高阶应用
import turtle as T
import random
import time
#画樱花躯干
def Tree(branch, t):
time.sleep(0.005)
if branch > 3:
if 8 <= branch <= 12:
if random.randint(0, 2) == 0:
t.color('snow') #白色
else:
t.color('lightcoral') #淡珊瑚色
t.pensize(branch / 3)
elif branch < 8:
if random.randint(0, 1) == 0:
t.color('snow') #白色
else:
t.color('lightcoral') #淡珊瑚色lightcoral
t.pensize(branch / 2)
else:
t.color('sienna') #赭(zhe)色sienna
t.pensize(branch / 10) #6
t.forward(branch)
a = 1.5 * random.random()
t.right(20 * a)
b = 1.5 * random.random()
Tree(branch - 10 * b, t)
t.left(40 * a)
Tree(branch - 10 * b, t)
t.right(20 * a)
t.up()
t.backward(branch)
t.down()
# 掉落的花瓣
def Petal(m, t):
for i in range(m):
time.sleep(0.1)
a = 200 - 400 * random.random()
b = 10 - 20 * random.random()
t.up()
t.forward(b)
t.left(90)
t.forward(a)
t.down()
t.color('lightcoral') #淡珊瑚色
t.circle(1)
t.up()
t.backward(a)
t.right(90)
t.backward(b)
#绘图区域
t = T.Turtle()
#画布大小
w = T.Screen()
t.hideturtle()
t.getscreen().tracer(5, 0)
w.screensize(bg = 'wheat')
t.left(90)
t.up()
t.backward(150)
t.down()
t.color('sienna')
#画樱花躯干
Tree(60, t)
#画掉落的花瓣
Petal(200, t)
w.exitonclick()
T.done()
对部分核心代码分析
if branch > 3:
if 8 <= branch <= 12:
if random.randint(0, 2) == 0:
t.color('snow') #白色
else:
t.color('lightcoral') #淡珊瑚色
t.pensize(branch / 3)
elif branch < 8:
if random.randint(0, 1) == 0:
t.color('snow') #白色
else:
t.color('lightcoral') #淡珊瑚色
t.pensize(branch / 2)
else:
t.color('sienna') #赭(zhe)色
t.pensize(branch / 10)
可以发现枝干和花瓣的画法区别在于pensize()和color()
而且一个很重要的变量branch,既充当了枝干数量的表示,又有枝干粗细和长度的限制(作者还是蛮厉害的,这很符合常识)
t.forward(branch)
a = 1.5 * random.random()
t.right(20 * a)
b = 1.5 * random.random()
Tree(branch - 10 * b, t)
t.left(40 * a)
Tree(branch - 10 * b, t)
t.right(20 * a)
t.up()
t.backward(branch)
t.down()
这段代码调用两次Tree()主要是用来画分支枝干的
其中, 使用random.random() 来使得 枝干弯曲角度随机,
这里本来用的很好
但就是由于随机就使得可能画的不太好看,有点影响美感。
可能问题:
1.花的重复度太高,密密麻麻挤在一起,不过这个除了上面还蛮好看的
2.枝干弯曲的不太对,(就是每次a的值很随意)
3.枝干过于短或者少了,也不太好看哦 (b的随机值大了导致提前结束了)
解决方法:
一:直接换个好看的值
1.降低branch()在画花瓣时的枝干数
2. 第一段枝干使用列表+.choice() 来限制枝干弯曲程度
(也可以用shuffle(),uniform()都行)
尝试:
本质上就是把a,b限制在一个比较正常的范围
a = random.choice([0.6,0.7,0.8,0.9,1.0,1.1])
或者
a = random.uniform(0.6,1.1)
但是要搞明白的是,
在b正常的话,a越大,这棵树就越宽,但不一定越茂盛
限制之后你会发现很对称,就算重叠也很好看,就是不太像樱花❀(a=1.1,b=0.6)
a=1.5,b=0.5
最后,说个规律吧,
a控制角度也就是树的展开或者说弯曲度,也就是树宽不宽
b控制枝干粗细和长度,也就是树是否茂盛
建议取值 a∈(0.6,1.1) , b∈(0.5,0.7)
当然你随意去试试也行,因为有趣的发现总是不经意尝试获得的
写完了,未来一共3部分.过后会进一步优化,最后挑战一下写一个画竹子的模板