Python筆下那些神奇的樹

點(diǎn)擊上方"藍(lán)字"關(guān)注我們

記錄? ?分享? ?成長(zhǎng)
代碼來自網(wǎng)絡(luò)
turtle是一只神奇的小海龜,可以畫出大千世界。而turtle加入了python大家族,像是如龜?shù)盟?,變得更加受歡迎。
古人有詩(shī)云“庭中有奇樹,綠葉發(fā)華滋”,樹之美,或婀娜、或繁茂、或蒼勁、或青翠。python-turtle筆下的樹更是別有一番風(fēng)味。
小園新種紅櫻樹,閑繞花行便當(dāng)游

#?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)
#?繪圖區(qū)域
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()
江南有丹橘,經(jīng)冬猶綠林

#?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漸進(jìn),0?最快
????????#?tracer(1,?100)????#?設(shè)置繪圖屏幕刷新頻率,參數(shù)1設(shè)置在正常刷新頻次的第參數(shù)1次刷新,參數(shù)2設(shè)置每次刷新的時(shí)延
????????tracer(0,?0)
????????pu()??#?抬筆
????????backward(100)
????????#?保證筆觸箭頭方向始終不向下,此處使其左轉(zhuǎn)90度,而不是右轉(zhuǎn)
????????left(90)??#?左轉(zhuǎn)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??#?右分支偏轉(zhuǎn)角度
????????????c?=?random()?*?15?+?10??#?左分支偏轉(zhuǎn)角度
????????????d?=?l?*?(random()?*?0.25?+?0.7)??#?下一個(gè)分支的長(zhǎng)度
????????????#?右轉(zhuǎn)一定角度,畫右分支
????????????right(b)
????????????self.tree(n?-?1,?d)
????????????#?左轉(zhuǎn)一定角度,畫左分支
????????????left(b?+?c)
????????????self.tree(n?-?1,?d)
????????????#?轉(zhuǎn)回來
????????????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()
落紅不是無(wú)情物,化作春泥更護(hù)花

#?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()
#?啟動(dòng)方法
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()
川原秋色靜,蘆葦晚風(fēng)鳴

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?????????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()
上面代碼都可以直接執(zhí)行,試試吧!
公眾號(hào)后臺(tái)回復(fù):樹,可領(lǐng)取全部代碼

加入我們的知識(shí)星球【Python大數(shù)據(jù)分析】
愛上數(shù)據(jù)分析!
評(píng)論
圖片
表情

