日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python画椭圆形_Python易学就会(五)turtle绘制椭圆与递归

發布時間:2023/12/16 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python画椭圆形_Python易学就会(五)turtle绘制椭圆与递归 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前兩篇文章基本涵蓋了turtle的大部分功能,同時也借由對turtle功能的展示,厘清了Python的一些語法特點,以利于新手入門。但是短短幾個例子,闡述得還是有限,這里再展開兩個知識點,一方面對turtle做個補遺,另一方面把Python語法的大框架過完一遍。

第一個是畫橢圓。上一節中描述了如何用turtle畫一個圓,或者是一段弧線,但是在很多圖形中需要用到橢圓,如何畫出一段優美的橢圓,是本篇的第一個知識點。

上節中有提到turtle中的circle()方法,其核心就是割圓術,也就是用正多邊形來模擬一個圓。我們知道,正8邊形比正6邊形肯定要更接近一個圓,正16邊形比正8邊形又更接近一個圓,如果我們能畫出一個正120邊形,或者正360邊形的話,那是非常接近一個圓的。下面就沿著這個思路,來畫一個正120邊形。不用說,在普通個人電腦上,“正120邊形”在我們眼里肯定它就是一個“圓”了。上代碼:

import turtle as t

t.pendown()

t.setheading(90) # 朝上(正北方向)

for j in range(120): # 重復執行120次

t.forward(3) # 移動3個單位

t.left(3) # 左轉3度

t.penup()

t.done()

運行這個例子,可以看到turtle從原點出發,按逆時針方向畫了一個圓。如果修改forward()中的參數,可以畫出不同半徑的圓。

這個畫法跟circle()本質上沒有區別。但是,卻給了我們更大的自由度,來操控這段曲線,例如,修改代碼如下:

import turtle as t

t.pendown()

t.setheading(90)

for j in range(60): # 重復執行60次

t.forward(3)

t.left(3)

t.penup()

t.done()

將重復運行的次數改為60次,每次還是轉動3度,我們就可以得到一段60*3=180度的弧線。在不同的角度區間內,修改畫弧的速度,也即修改forward()走的快慢,我樣就可以得到一段橢圓弧,看代碼:

import turtle as t

t.pendown()

t.setheading(90)

len = 1 # 設置初始走的速度為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畫出了一段橢圓弧。能畫成橢圓弧的關鍵是if-else條件語言的應用。if-else屬于分支語句,跟前面學過的順序、循環共同構成Python語言的三大控制結構。在這個例子中,我們一共畫60步弧線,在前30步,讓畫弧的速度由慢到快,后30步,速度由快到慢,這樣不勻速的畫法,就形成了一條橢圓弧。

接下來完善這段代碼,畫出一個完整的橢圓來:

import turtle as t

t.pendown()

t.setheading(90)

len = 1

for k in range(2): # 將相同的動作重復做一遍

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):”,也就是將畫上一半弧的方法,在下一半上重復使用一次即可。當然,你也可以通過改變if-else的方法來實現,只會邏輯上要復雜一點。

從這里我們也可以看到,turtle繪圖用的方法還是比較簡單,適合于初學者入門使用,基本上不涉及計算機圖形學的內容,要真正好出漂亮和復雜的弧線,turtle庫還是不夠。

第二個是用turtle實現遞歸繪圖。

現實生活中,有很多圖形是非常有規律性的,這樣的圖形如果使用遞歸算法來實現,程序就會非常簡潔,運行效果也會很好。下面我們來用turtle畫一棵樹,感受一下Python中的遞歸算法和turtle的克隆功能。樹的最大特點就是每個樹干都會左右分叉成兩枝,而每枝又會再次分叉,這樣循環往復一直進行。我們先來畫一個樹干分叉的小例子:

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) # 第一支筆往左轉

q.right(65) # 第二支筆往右轉

p.forward(200 * 0.65)

q.forward(200 * 0.65)

turtle.done()

運行這個小例子,可以看到,turtle在界面上畫出一個Y形的樹支,這個就是我們遞歸的基礎,后面所有的小樹枝是都這樣畫出來。這里用到一個很重要的知識點,就是clone()方法,我們用clone()克隆出第二筆,以便于從樹干分別往兩邊畫。

接下來,改造上面的小例子,應用遞歸函數,讓turtle幫我們不斷的畫出更多的樹枝來,上代碼:

#-*- coding:utf-8 –*-

#用遞歸函數實現turtle畫一棵樹。

#所有遞歸函數都可以轉化為非遞歸來實現,

#如果需要非遞歸方法的代碼,請加公眾號: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): # 自定義函數,畫樹枝

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,來實現讓每個樹枝都能向左右兩邊伸展。而每一次伸展的長度都是上一個樹枝的0.65倍,也就是越伸越短。當短到<15時,遞歸結束。每次克隆出的新Pen,都通過list.append()方法存到列表中,傳遞給下一次調用,這樣就給人一種樹枝不斷發芽生長的動畫效果。

總結

以上是生活随笔為你收集整理的python画椭圆形_Python易学就会(五)turtle绘制椭圆与递归的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。