对樱花树代码的一点优化思路(一)

对画樱花树代码的一点优化思路

第一次写博客,多有不当之处,敬请指导改正.
如有侵权(可能),请联系本账号删除
这里没有对花瓣飘落代码进行分析,写博客是为了激励自己每天敲代码
各位一起加油啊(ง •_•)ง

原代码总览

// 总览
#转自知乎大佬的樱花树画法
#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.花的重复度太高,密密麻麻挤在一起,不过这个除了上面还蛮好看的
对樱花树代码的一点优化思路(一)_第1张图片
2.枝干弯曲的不太对,(就是每次a的值很随意)
对樱花树代码的一点优化思路(一)_第2张图片
3.枝干过于短或者少了,也不太好看哦 (b的随机值大了导致提前结束了)
对樱花树代码的一点优化思路(一)_第3张图片

解决方法:
一:直接换个好看的值
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)
对樱花树代码的一点优化思路(一)_第4张图片a=1.5,b=0.5
对樱花树代码的一点优化思路(一)_第5张图片

最后,说个规律吧,
a控制角度也就是树的展开或者说弯曲度,也就是树宽不宽
b控制枝干粗细和长度,也就是树是否茂盛
建议取值 a∈(0.6,1.1) , b∈(0.5,0.7)
当然你随意去试试也行,因为有趣的发现总是不经意尝试获得的

写完了,未来一共3部分.过后会进一步优化,最后挑战一下写一个画竹子的模板

你可能感兴趣的:(对樱花树代码的一点优化思路(一))