摘要:現(xiàn)實生活中,有很多圖形是非常有規(guī)律性的,這樣的圖形如果使用遞歸算法來實現(xiàn),程序就會非常簡潔,運行效果也會很好。下面我們來用畫一棵樹,感受一下中的遞歸算法和的克隆功能。
前兩篇文章基本涵蓋了turtle的大部分功能,同時也借由對turtle功能的展示,厘清了Python的一些語法特點,以利于新手入門。但是短短幾個例子,闡述得還是有限,這里再展開兩個知識點,一方面對turtle做個補遺,另一方面把Python語法的大框架過完一遍。
第一個是畫橢圓。上一節(jié)中描述了如何用turtle畫一個圓,或者是一段弧線,但是在很多圖形中需要用到橢圓,如何畫出一段優(yōu)美的橢圓,是本篇的第一個知識點。
上節(jié)中有提到turtle中的circle()方法,其核心就是割圓術(shù),也就是用正多邊形來模擬一個圓。我們知道,正8邊形比正6邊形肯定要更接近一個圓,正16邊形比正8邊形又更接近一個圓,如果我們能畫出一個正120邊形,或者正360邊形的話,那是非常接近一個圓的。下面就沿著這個思路,來畫一個正120邊形。不用說,在普通個人電腦上,“正120邊形”在我們眼里肯定它就是一個“圓”了。上代碼:
import turtle as t t.pendown() t.setheading(90) # 朝上(正北方向) for j in range(120): # 重復(fù)執(zhí)行120次 t.forward(3) # 移動3個單位 t.left(3) # 左轉(zhuǎn)3度 t.penup() t.done()
運行這個例子,可以看到turtle從原點出發(fā),按逆時針方向畫了一個圓。如果修改forward()中的參數(shù),可以畫出不同半徑的圓。
這個畫法跟circle()本質(zhì)上沒有區(qū)別。但是,卻給了我們更大的自由度,來操控這段曲線,例如,修改代碼如下:
import turtle as t t.pendown() t.setheading(90) for j in range(60): # 重復(fù)執(zhí)行60次 t.forward(3) t.left(3) t.penup() t.done()
將重復(fù)運行的次數(shù)改為60次,每次還是轉(zhuǎn)動3度,我們就可以得到一段60*3=180度的弧線。在不同的角度區(qū)間內(nèi),修改畫弧的速度,也即修改forward()走的快慢,我樣就可以得到一段橢圓弧,看代碼:
import turtle as t t.pendown() t.setheading(90) len = 1 # 設(shè)置初始走的速度為1 for j in range(60): if j < 30: # 當j<30,也就是畫前一半的弧線 len += 0.2 # 讓速度越走越快 else: # 畫后一半弧線 len -= 0.2 # 讓速度越走越慢 t.forward(len) t.left(3) t.penup() t.done()
運行這段代碼,可以看到turtle畫出了一段橢圓弧。能畫成橢圓弧的關(guān)鍵是if-else條件語言的應(yīng)用。if-else屬于分支語句,跟前面學(xué)過的順序、循環(huán)共同構(gòu)成Python語言的三大控制結(jié)構(gòu)。在這個例子中,我們一共畫60步弧線,在前30步,讓畫弧的速度由慢到快,后30步,速度由快到慢,這樣不勻速的畫法,就形成了一條橢圓弧。
接下來完善這段代碼,畫出一個完整的橢圓來:
import turtle as t t.pendown() t.setheading(90) len = 1 for k in range(2): # 將相同的動作重復(fù)做一遍 for j in range(60): if j < 30: len += 0.2 else: len -= 0.2 t.forward(len) t.left(3) t.penup() t.done()
運行這段代碼,可以看到turtle畫出了一個完美的橢圓。相對于上一個例子,我們只增加了一條語句,即“for k in range(2):”,也就是將畫上一半弧的方法,在下一半上重復(fù)使用一次即可。當然,你也可以通過改變if-else的方法來實現(xiàn),只會邏輯上要復(fù)雜一點。
從這里我們也可以看到,turtle繪圖用的方法還是比較簡單,適合于初學(xué)者入門使用,基本上不涉及計算機圖形學(xué)的內(nèi)容,要真正好出漂亮和復(fù)雜的弧線,turtle庫還是不夠。
第二個是用turtle實現(xiàn)遞歸繪圖。
現(xiàn)實生活中,有很多圖形是非常有規(guī)律性的,這樣的圖形如果使用遞歸算法來實現(xiàn),程序就會非常簡潔,運行效果也會很好。下面我們來用turtle畫一棵樹,感受一下Python中的遞歸算法和turtle的克隆功能。樹的最大特點就是每個樹干都會左右分叉成兩枝,而每枝又會再次分叉,這樣循環(huán)往復(fù)一直進行。我們先來畫一個樹干分叉的小例子:
import turtle p = turtle.Pen() # 第一支畫筆 p.penup() p.goto(0, -200) # 移動到初始位置 p.setheading(90) # 向上(正北方向) p.pensize(7) p.pencolor("green") p.pendown() # 落筆 p.forward(200) # 畫第一條樹干 q = p.clone() # 克隆出第二支筆來 p.left(65) # 第一支筆往左轉(zhuǎn) q.right(65) # 第二支筆往右轉(zhuǎn) p.forward(200 * 0.65) q.forward(200 * 0.65) turtle.done()
運行這個小例子,可以看到,turtle在界面上畫出一個Y形的樹支,這個就是我們遞歸的基礎(chǔ),后面所有的小樹枝是都這樣畫出來。這里用到一個很重要的知識點,就是clone()方法,我們用clone()克隆出第二筆,以便于從樹干分別往兩邊畫。
接下來,改造上面的小例子,應(yīng)用遞歸函數(shù),讓turtle幫我們不斷的畫出更多的樹枝來,上代碼:
#-*- coding:utf-8 –*- #用遞歸函數(shù)實現(xiàn)turtle畫一棵樹。 #所有遞歸函數(shù)都可以轉(zhuǎn)化為非遞歸來實現(xiàn), #如果需要非遞歸方法的代碼,請加公眾號:see_goal 留言“turtle畫樹” import turtle p = turtle.Pen() p.penup() p.goto(0, -200) p.setheading(90) p.pensize(7) p.pencolor("green") p.pendown() def branch(plist, len): # 自定義函數(shù),畫樹枝 if (len > 15): # 遞歸的退出條件 list = [] # 新畫筆列表 for p in plist: # 遍歷舊畫筆列表 p.forward(len) q = p.clone() p.left(65) q.right(65) list.append(p) # 存入新畫筆列表 list.append(q) # 存入新畫筆列表 branch(list, len * 0.65) # 遞歸,list為新畫筆列表,樹枝長65% branch([p], 200) turtle.done()
運行這段代碼,可以看到turtle在界面上遞歸的畫出一棵樹。
這棵樹上的每一個小箭頭,都代表著一個turtle的Pen對象。也就是說,我們通過不斷的克隆Pen,來實現(xiàn)讓每個樹枝都能向左右兩邊伸展。而每一次伸展的長度都是上一個樹枝的0.65倍,也就是越伸越短。當短到<15時,遞歸結(jié)束。每次克隆出的新Pen,都通過list.append()方法存到列表中,傳遞給下一次調(diào)用,這樣就給人一種樹枝不斷發(fā)芽生長的動畫效果。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/43009.html
摘要:比如把上面畫正方形的例子稍做變化重復(fù)執(zhí)行次畫正方形開始畫正方形結(jié)束右轉(zhuǎn)度執(zhí)行后,可以看到,畫出一個非常規(guī)整漂亮的組合圖案。 turtle圖形庫源于1966年誕生的Logo語言,是入門Python的有趣工具。因其簡單便捷的圖形化方法、和立即反饋式的繪畫效果,成為眾多編程入門者的首選。相對于大多數(shù)入門教材中枯燥的語法學(xué)習(xí),和函數(shù)、方法的演練來說,turtle的趣味性顯得別具一格、極富效...
摘要:也就是說明這個參數(shù)除了表示圓的半徑面,其正負性還定義了畫圓的方向。入門篇中有個小彩蛋,也就是可以修改的指針外形。通過初始化出多只新,可以同時在一個界面上以不同的繪圖。下面給出一段繪制實時時鐘的代碼,重點部分我已給出注釋。 到目前為止我們通過turtle庫了解了Python的基本語法,包括順序與循環(huán)、函數(shù)的調(diào)用與方法的定義、列表與簡單的數(shù)學(xué)運算等;也學(xué)習(xí)了用turtle庫繪圖的基本用...
摘要:但今年不能老送同樣的東西啊,那就給大家送上幾棵圣誕樹吧。極簡版這個可算是最簡單的圣誕樹了。例如上面這棵圣誕樹,每一個樹枝又是一個小的圣誕樹。這與編程中的遞歸思想很像頂部五角星略過炫彩版一般圣誕樹上都會掛上的小彩燈。 今天是圣誕節(jié),先祝大家圣誕快樂! 有人要說了,圣誕節(jié)是耶穌誕生的日子,我又不信基督教,有啥好慶祝的。這你就有所不知了,Python 的誕生也跟圣誕節(jié)有關(guān):1989 年,那是...
摘要:啥是佩奇已不重要。佩奇是他用搜集的所有信息,一點一滴的用心創(chuàng)造編織愛的過程。畫佩奇的代碼已經(jīng)上傳到后臺,公眾號后臺回復(fù)社會人即可獲取。 你告訴爺爺你需要什么東西呀,爺爺給你準備,佩奇,什么是佩奇呀?... 這是一個發(fā)生在大山里的故事,但故事的情節(jié)所有人都不會陌生??爝^年了,在農(nóng)村爺爺給城里的孫子打電話,孫子說想要佩奇,為了滿足孩子的心愿,爺爺開始滿村子找佩奇… 當除夕夜家人團聚,爺爺開...
摘要:啥是佩奇已不重要。佩奇是他用搜集的所有信息,一點一滴的用心創(chuàng)造編織愛的過程。畫佩奇的代碼已經(jīng)上傳到后臺,公眾號后臺回復(fù)社會人即可獲取。 你告訴爺爺你需要什么東西呀,爺爺給你準備,佩奇,什么是佩奇呀?... 這是一個發(fā)生在大山里的故事,但故事的情節(jié)所有人都不會陌生??爝^年了,在農(nóng)村爺爺給城里的孫子打電話,孫子說想要佩奇,為了滿足孩子的心愿,爺爺開始滿村子找佩奇… 當除夕夜家人團聚,爺爺開...
閱讀 1328·2021-11-15 18:14
閱讀 3299·2021-08-25 09:38
閱讀 2734·2019-08-30 10:55
閱讀 2787·2019-08-29 16:39
閱讀 1369·2019-08-29 15:07
閱讀 2503·2019-08-29 14:14
閱讀 874·2019-08-29 12:36
閱讀 971·2019-08-29 11:21