今年是牛年,祝大家新年牛氣沖天!嗨皮牛Year!
前幾天在百度圖片里下載了一張金牛的圖片,就是封面的這張,想著用Python標準庫turtle肯定可以畫出這張圖,所以說干就干,花兩天時間實作了,
畫圖雖然不是Python的主要功能,但繪制這頭金牛還是展示了Python無所不能的強大屬性,接下來介紹實作的程序,
圖片分析
初看圖片,深紅色的背景下,一頭金光閃閃的金牛,簡單分析,圖形主要分為兩大部分,外面的圓環和內部的金牛,
圓環由同心圓和折線形的圓盤構成,同心圓直接畫圓就可以,折線形的圓盤是旋轉對稱的,每一個部分由圓弧和半徑方向的線組成,一共有26個相同的部分,計算出每個部分的弧形比例即可依次繪制,
金牛圖形是不規則的,里面有很多不同弧度和不同長度的不規則曲線,控制畫筆邊前進邊旋轉,每次前進不同的距離和旋轉不同的角度,可以繪制出這些曲線,里面的圖案,如五瓣花就是用這種方式完成,
對圖形有了基本的了解,就看turtle中有哪些方法可以用于實作這些操作了,
用到的Turtle方法介紹
turtle是Python的標準庫,直接匯入即可使用,
from turtle import *
1. 畫布設定
setup(width, height, x, y): 設定視窗大小和視窗左上角在螢屏中的位置,
title(): 設定視窗的標題,
screensize(width, height, color): 設定畫布大小,背景顏色,
done(): 繪圖結束后,不自動關閉視窗,
2. 畫筆設定
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))可以設定畫筆指向原點,
3. 畫筆操作
circle(radius[, extent=arc]): 畫一個圓,傳入圓的半徑,根據畫筆的方向控制圓心的位置,圓心與畫筆的方向垂直,傳入弧度值可以畫出指定弧度的圓弧,
left(angle): 畫筆左轉,傳入任意一個目標角度,
right(angle): 畫筆右轉,
forward(distance): 畫筆前進一段距離,
backward(distance): 畫筆后退一段距離,
goto(x, y): 移影片筆到指定坐標,
4. 顏色填充
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/261616.html
標籤:Python
下一篇:Python---記憶體管理
