今年是牛年,祝你們新年牛氣沖天!嗨皮牛Year!javascript
前幾天在百度圖片裏下載了一張金牛的圖片,就是封面的這張。想着用Python標準庫turtle確定能夠畫出這張圖,因此說幹就幹,花兩天時間實現了。java
畫圖雖然不是Python的主要功能,但繪製這頭金牛仍是展現了Python無所不能的強大屬性。接下來介紹實現的過程。python
初看圖片,深紅色的背景下,一頭金光閃閃的金牛。簡單分析,圖形主要分爲兩大部分,外面的圓環和內部的金牛。git
圓環由同心圓和折線形的圓盤構成,同心圓直接畫圓就能夠,折線形的圓盤是旋轉對稱的,每個部分由圓弧和半徑方向的線組成,一共有26個相同的部分,計算出每一個部分的弧形比例便可依次繪製。github
金牛圖形是不規則的,裏面有不少不一樣弧度和不一樣長度的不規則曲線,控制畫筆邊前進邊旋轉,每次前進不一樣的距離和旋轉不一樣的角度,能夠繪製出這些曲線。裏面的圖案,如五瓣花就是用這種方式完成。動畫
對圖形有了基本的瞭解,就看turtle中有哪些方法能夠用於實現這些操做了。spa
turtle是Python的標準庫,直接導入便可使用。3d
from turtle import *
setup(width, height, x, y): 設置窗口大小和窗口左上角在屏幕中的位置。調試
title(): 設置窗口的標題。code
screensize(width, height, color): 設置畫布大小,背景顏色。
done(): 繪圖結束後,不自動關閉窗口。
pencolor(color): 設置畫筆顏色。
penup(): 提起畫筆,提起後移動畫筆不會留下痕跡。
pendown(): 落下畫筆,開始繪圖前先將畫筆落下。
speed(int): 設置畫筆的速度,傳入1~10的數字,1最慢,10最快。傳入其餘值會更快,可是沒有鼠標移動的動畫效果。
setx(value): 設置畫筆的x軸座標。
sety(value): 設置畫筆的y軸座標。
towards(x, y): 設置畫筆指向的點。
setheading(): 設置畫筆的方向。與towards()配合能夠設置畫筆指向某個點,如setheading(towards(0, 0))能夠設置畫筆指向原點。
circle(radius[, extent=arc]): 畫一個圓,傳入圓的半徑,根據畫筆的方向控制圓心的位置,圓心與畫筆的方向垂直。傳入弧度值能夠畫出指定弧度的圓弧。
left(angle): 畫筆左轉,傳入任意一個目標角度。
right(angle): 畫筆右轉。
forward(distance): 畫筆前進一段距離。
backward(distance): 畫筆後退一段距離。
goto(x, y): 移動畫筆到指定座標。
begin_fill(): 開始填充。
fillcolor(color): 設置圖形中填充的顏色。
end_fill(): 結束填充。
有了這些方法,就能夠實現金牛圖中的各類圖案了。如畫五瓣花輪廓的代碼以下:
def draw_flower(a, color): pencolor('red') begin_fill() for j in range(5): for i in range(40): if 0 <= i < 20: a = a - 0.08 else: a = a + 0.08 forward(a) left(6) right(168) fillcolor(color) end_fill()
個人繪圖順序是從外到內,這樣較小的圖形會置於較大的圖形之上,填充的顏色不會被遮擋。
最開始繪製的是外圍的同心圓。先penup()提起畫筆,sety()將畫筆從圓心向下移動半徑的距離,而後調整畫筆方向,pendown()落下畫筆,circle()畫圓。
整個過程分了不少張截圖,爲了不篇幅過長,就不所有放了。再放一張最後畫眼睛的動圖,能夠參照上面同心圓的方式拆分步驟。
其餘的圖案,若是會相互覆蓋,要先畫大的圖形,再畫小的圖形。若是不會相互覆蓋,順序能夠隨意調整。
對比原圖和turtle繪製的圖形,總體上仍是很像的,但部分細節並無徹底還原。由於沒有原圖的任何參數,繪製過程當中全靠目測(像素尺子),很難避免偏差,再花一些時間調試應該能夠更像。
附代碼:
https://github.com/bigtigeryo/gold-cow