成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python易學(xué)就會(huì)(五)turtle繪制橢圓與遞歸

lk20150415 / 2418人閱讀

摘要:現(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

相關(guān)文章

  • Python易學(xué)就會(huì)(三)turtle繪圖入門(mén)--初級(jí)篇

    摘要:比如把上面畫(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的趣味性顯得別具一格、極富效...

    周?chē)?guó)輝 評(píng)論0 收藏0
  • Python易學(xué)就會(huì)(四)turtle繪圖入門(mén)--高級(jí)篇

    摘要:也就是說(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ù)繪圖的基本用...

    Miracle 評(píng)論0 收藏0
  • Python 送你一棵圣誕樹(shù)

    摘要:但今年不能老送同樣的東西啊,那就給大家送上幾棵圣誕樹(shù)吧。極簡(jiǎn)版這個(gè)可算是最簡(jiǎn)單的圣誕樹(shù)了。例如上面這棵圣誕樹(shù),每一個(gè)樹(shù)枝又是一個(gè)小的圣誕樹(shù)。這與編程中的遞歸思想很像頂部五角星略過(guò)炫彩版一般圣誕樹(shù)上都會(huì)掛上的小彩燈。 今天是圣誕節(jié),先祝大家圣誕快樂(lè)! 有人要說(shuō)了,圣誕節(jié)是耶穌誕生的日子,我又不信基督教,有啥好慶祝的。這你就有所不知了,Python 的誕生也跟圣誕節(jié)有關(guān):1989 年,那是...

    miya 評(píng)論0 收藏0
  • 除了畫(huà)佩奇我們還要玩點(diǎn)更高級(jí)的

    摘要:啥是佩奇已不重要。佩奇是他用搜集的所有信息,一點(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)...

    Dean 評(píng)論0 收藏0
  • 除了畫(huà)佩奇我們還要玩點(diǎn)更高級(jí)的

    摘要:啥是佩奇已不重要。佩奇是他用搜集的所有信息,一點(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)...

    tomener 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<