美文网首页视觉艺术
Python笔下那些神奇的树

Python笔下那些神奇的树

作者: python大数据分析 | 来源:发表于2020-08-10 21:10 被阅读0次

    代码来自网络

    turtle是一只神奇的小海龟,可以画出大千世界。而turtle加入了python大家族,像是如龟得水,变得更加受欢迎。

    古人有诗云“庭中有奇树,绿叶发华滋”,树之美,或婀娜、或繁茂、或苍劲、或青翠。python-turtle笔下的树更是别有一番风味。

    小园新种红樱树,闲绕花行便当游。

    # coding=gbk
    import turtle as T
    import random
    import time
    
    # 画樱花的躯干(60,t)
    def Tree(branch, t):
        time.sleep(0.0005)
        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')  # 赭(zhě)色
                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):
            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)
    # wheat小麦
    w.screensize(bg='white')  
    t.left(90)
    t.up()
    t.backward(150)
    t.down()
    t.color('sienna')
    # 画樱花的躯干
    Tree(60, t)
    # 掉落的花瓣
    Petal(200, t)
    w.exitonclick()
    

    江南有丹橘,经冬犹绿林

    # coding=gbk
    from turtle import *
    from random import *
    from math import *
    
    
    class Tree:
    
        def __init__(self):
            setup(1000, 500)
            bgcolor(1, 1, 1)  # 背景色
            # ht()  # 隐藏turtle
            speed(10)  # 速度 1-10渐进,0 最快
            # tracer(1, 100)    # 设置绘图屏幕刷新频率,参数1设置在正常刷新频次的第参数1次刷新,参数2设置每次刷新的时延
            tracer(0, 0)
            pu()  # 抬笔
            backward(100)
            # 保证笔触箭头方向始终不向下,此处使其左转90度,而不是右转
            left(90)  # 左转90度
            backward(300)  # 后退300
    
        def tree(self, n, l):
            pd()  # 下笔
            # 阴影效果
            t = cos(radians(heading() + 45)) / 8 + 0.25
            pencolor(t, t, t)
            pensize(n / 1.2)
            forward(l)  # 画树枝
    
            if n > 0:
                b = random() * 15 + 10  # 右分支偏转角度
                c = random() * 15 + 10  # 左分支偏转角度
                d = l * (random() * 0.25 + 0.7)  # 下一个分支的长度
                # 右转一定角度,画右分支
                right(b)
                self.tree(n - 1, d)
                # 左转一定角度,画左分支
                left(b + c)
                self.tree(n - 1, d)
                # 转回来
                right(c)
            else:
                # 画叶子
                right(90)
                n = cos(radians(heading() - 45)) / 4 + 0.5
                pencolor(n, n * 0.8, n * 0.8)
                fillcolor(n, n * 0.8, n * 0.8)
                begin_fill()
                circle(3)
                left(90)
                end_fill()
    
                # 添加0.3倍的飘落叶子
                if random() > 0.7:
                    pu()
                    # 飘落
                    t = heading()
                    an = -40 + random() * 40
                    setheading(an)
                    dis = int(800 * random() * 0.5 + 400 * random() * 0.3 + 200 * random() * 0.2)
                    forward(dis)
                    setheading(t)
                    # 画叶子
                    pd()
                    right(90)
                    n = cos(radians(heading() - 45)) / 4 + 0.5
                    pencolor(n * 0.5 + 0.5, 0.4 + n * 0.4, 0.4 + n * 0.4)
                    fillcolor(n, n * 0.8, n * 0.8)
                    begin_fill()
                    circle(2)
                    left(90)
                    end_fill()
                    pu()
                    # 返回
                    t = heading()
                    setheading(an)
                    backward(dis)
                    setheading(t)
                # pass
            pu()
            backward(l)  # 退回
    
    def main():
        tree = Tree()
        tree.tree(12, 100)  # 递归7层
        done()
    
    
    if __name__ == '__main__':
        main()
    
    

    落红不是无情物,化作春泥更护花

    # coding=gbk
    from turtle import *
    from random import *
    
    # 画树方法
    def drawTree(n, l):
        pendown()
        pencolor('#5d3c3c')
        pensize( n / 1.5)
        forward(l)
        if n > 0:
            dr = randint(30, 40)
            dl =  randint(30, 40)
            move = l * (random() * 0.4 + 0.5)
            right(dr)
            drawTree(n - 1, move)
            left(dr + dl)
            drawTree(n - 1, move)
            right(dl)
        else:
            drawPetal(3)
        penup()
        backward(l)
    
    # 花瓣位置生成
    def petalPlace(m, x, y):
        penup()
        goto(x, y)
        pendown()
        setheading(0)
        tracer(False)
        for i in range(m):
            if i == 0:
                drawPetal(5)
            else:
                penup()
                goto(x, y)
                a = randint(20, 400)
                b = randint(-50, 50)
                forward(a)
                left(90)
                forward(b)
                right(90)
                pendown()
                drawPetal(5)
    
    # 花朵绘画方法
    def drawPetal(n):
        colormode(255)
        r = randint(200, 255)
        g = randint(8, 158)
        b = randint(8, 158)
        begin_fill()
        fillcolor(r, g, b)
        pencolor(r, g, b)
        circle(n)
        end_fill()
    
    # 启动方法
    def run():
        setup(1.0, 1.0)
        penup()
        goto(-50, -150)
        left(90)
        pendown()
        hideturtle()
        tracer(False)
        drawTree(13, 150)
        petalPlace(160, -100, -150)
    
    run()
    done()
    

    川原秋色静,芦苇晚风鸣

    import turtle
    import random
    
    stack = []
    
    def createWord(max_it, word, proc_rules, x, y, turn):
        turtle.up()
        turtle.home()
        turtle.goto(x, y)
        turtle.right(turn)
        turtle.down()
        t = 0
        while t < max_it:
            word = rewrite(word, proc_rules)
            drawit(word, 5, 20)
            t = t+1
    
    def rewrite(word, proc_rules):
        wordList = list(word)
        for i in range(len(wordList)):
            curChar = wordList[i]
            if curChar in proc_rules:
                wordList[i] = proc_rules[curChar]
        return "".join(wordList)
    
    def drawit(newWord, d, angle):
        newWordLs = list(newWord)
        for i in range(len(newWordLs)):
            cur_Char = newWordLs[i]
            if cur_Char == 'F':
                turtle.forward(d)
            elif cur_Char == '+':
                turtle.right(angle)
            elif cur_Char == '-':
                turtle.left(angle)
            elif cur_Char == '[':
                state_push()
            elif cur_Char == ']':
                state_pop()
    
    def state_push():
        global stack
        stack.append((turtle.position(), turtle.heading()))
    
    def state_pop():
        global stack
        position, heading = stack.pop()
        turtle.up()
        turtle.goto(position)
        turtle.setheading(heading)
        turtle.down()
    
    def randomStart():
        x = random.randint(-300, 300)
        y = random.randint(-320, -280)
        heading = random.randint(-100, -80)
        return ((x, y), heading)
    
    def main():
        rule_sets = []
        rule_sets.append(((3, 5), 'F', {'F':'F[+F][-F]F'}))
        rule_sets.append(((4, 6), 'B', {'B':'F[-B][+ B]', 'F':'FF'}))
        rule_sets.append(((2, 4), 'F', {'F':'FF+[+F-F-F]-[-F+F+F]'}))
        tree_count = 50
        turtle.tracer(10, 0)
        for x in range(tree_count):
            rand_i = random.randint(0, len(rule_sets) - 1)
            selected_ruleset = rule_sets[rand_i]
            i_range, word, rule = selected_ruleset
            low, high = i_range
            i = random.randint(low, high)
            start_position, start_heading = randomStart()
            start_x, start_y = start_position
            createWord(i, word, rule, start_x, start_y, start_heading)
    
    if __name__ == '__main__': main()
    

    相关文章

      网友评论

        本文标题:Python笔下那些神奇的树

        本文链接:https://www.haomeiwen.com/subject/hnxhdktx.html