虎年到了,祝大家新年虎虎生威!大吉大利!
今年朋友問我什麼時候能畫一隻老虎。不能辜負朋友的期待,還是一樣的流程,在百度圖片裡下載了一張虎年的圖片(原圖局部見上圖),然後開始肝代碼。
結果與原圖對比
與原圖對比,我自己認為還原度是高于95%的。
用到的方法
使用的都是turtle庫中的函數,直接導入turtle庫即可調用。
1.畫布設置
setup(width, height, x, y): 設置窗口大小和窗口左上角在屏幕中的位置。
title(): 設置窗口的标題。
screensize(width, height, color): 設置畫布大小,背景顔色。
done(): 繪圖結束後,不自動關閉窗口。
2.畫筆設置
pencolor(color): 設置畫筆顔色。
width(): 設置畫筆寬度。
speed(int): 設置畫筆的速度,傳入1~10的數字,1最慢,10最快。傳入其他值會更快,但是沒有鼠标移動的動畫效果。
penup(): 提起畫筆,提起後移動畫筆不會留下痕迹。
pendown(): 落下畫筆,開始繪圖前先将畫筆落下。
setx(value): 設置畫筆的x軸坐标。
sety(value): 設置畫筆的y軸坐标。
towards(x, y): 設置畫筆指向的點。
setheading(): 設置畫筆的方向。與towards()配合可以設置畫筆指向某個點,如setheading(towards(0, 0))可以設置畫筆指向原點。
pos(): 返回畫筆當前的坐标。鼠标移動一段時間後可以print()打印此函數獲取鼠标位置。
heading(): 返回畫筆當前的方向。
3. 畫筆操作
circle(radius[, extent=arc]): 畫一個圓,傳入圓的半徑,根據畫筆的方向控制圓心的位置,圓心與畫筆的方向垂直。傳入弧度值可以畫出指定弧度的圓弧。
left(angle): 畫筆左轉,傳入任意一個目标角度。
right(angle): 畫筆右轉。
forward(distance): 畫筆前進一段距離。
backward(distance): 畫筆後退一段距離。
goto(x, y): 移動畫筆到指定坐标。
4. 顔色填充
begin_fill(): 開始填充。
fillcolor(color): 設置圖形中填充的顔色。
end_fill(): 結束填充。
自定義的函數
為了精簡代碼,我自己定義了幾個函數,在後面的代碼中重複利用。
1.設置畫筆到某一個點,每畫一部分圖形的開頭都可以直接調用,COLOR是定義的一個全局變量。
def set_start(x, y, w, c=COLOR):
penup()
setx(x)
sety(y)
setheading(towards(0, 0))
width(w)
pencolor(c)
pendown()
speed(0)
2.将轉向和移動的代碼封裝,轉不同角度和移動不同的距離可以畫出不同的弧線,封裝後會節省非常多的代碼。
def left_rotate(time, angle, length):
for i in range(time):
left(angle)
forward(length)
3.填充顔色定義成裝飾器,當某部分圖形完成時,加上裝飾器即可完成顔色填充。
def fill_color(color):
def decorator_all(func):
def wrapper(*args, **kwargs):
begin_fill()
func(*args, **kwargs)
fillcolor(color)
end_fill()
return wrapper
return decorator_all
4.填充顔色的補丁函數。
turtle庫填充顔色時會去關聯上一個圖形的終點,大部分情況填充顔色都沒有問題,但少數情況下填充結果不符合預期。
我沒有花時間去翻官方有沒有這樣的issue,自己寫了個補丁函數,重置上一個圖形的終點(重點:重置的是上一個),當填充顔色不符合預期時,打上補丁。補丁函數中調用了前面定義的set_start(),在要填充圖形的起點畫個點。
def fill_color_patch(x, y, c='#fffffb'):
set_start(x, y, 1, c=c)
forward(1)
經驗總結
1.畫圖前先分析一下圖形。
先定一個坐标原點,圖形的每個部分都根據原點去找位置,這樣可以避免圖形出現大的偏差。
2.順序很重要。
有些部分之間的先後順序不能反,主要影響的是顔色填充,這點也是圖形分析時要注意的,分析好圖層順序。
3.靈活運用。
目标是最大可能完成圖像,如果能畫得更好,代碼增加很多,也是值得的。自定義的函數,适用就用,不适用的地方就算了。
4.耐心很重要。
用的是基本庫,基本的函數,就那麼幾個,其實技術沒那麼重要,重要的是耐心。畫得不像不怕,多試幾次就行了。
代
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!