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