神奇!教你如何用Python来画树

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

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



# 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()


02 江南有丹橘,经冬犹绿林


# 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()

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


# 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()

04 川原秋色静,芦苇晚风鸣


import turtle

import random

stack = []

defcreateWord(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

defrewrite(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)

defdrawit(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()

defstate_push():

    global stack

    stack.append((turtle.position(), turtle.heading()))

defstate_pop():

    global stack

    position, heading = stack.pop()

    turtle.up()

    turtle.goto(position)

    turtle.setheading(heading)

    turtle.down()

defrandomStart():

    x = random.randint(-300, 300)

    y = random.randint(-320, -280)

    heading = random.randint(-100, -80)

    return ((x, y), heading)

defmain():

    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()

上面代码都可以直接执行,感兴趣就去试试吧!

喜欢的小伙伴可以点个赞再滑走哦~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容