神奇!教你如何用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 江南有丹橘,经冬犹绿林

神奇!教你如何用Python来画树_第1张图片

# 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©

​ 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 落红不是无情物,化作春泥更护花

神奇!教你如何用Python来画树_第2张图片

# 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 川原秋色静,芦苇晚风鸣

神奇!教你如何用Python来画树_第3张图片

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

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

你可能感兴趣的:(python,数学建模,开发语言,人工智能,大数据)