今天用50行Python代碼繪制了星空滿天的動圖。解釋下為什么要做這樣一件事,因為昨天是青年節,希望通過這樣的方式去表達出每個年輕人都像是星空中的一顆星星,散發這自己的光芒照亮整個夜空。效果如下:
我用的是 turtle 工具,它是 Python 的標准庫,可以描繪繪圖軌跡,操作簡單、快捷,api通俗易懂。
下面來看下具體代碼,首先做一些全局的設置
import turtle
import random
import time
# 設置畫筆大小,數值越小畫出的線條越細 turtle.pensize(1) # 繪畫延遲,單位:毫秒,數值越小繪畫速度越快 turtle.delay(1) # 隱藏畫筆 turtle.hideturtle() # 設置畫布大小 turtle.setup(800, 800)
這里主要設置 turtle 的畫筆大小、繪圖延遲和畫布大小。
繪制星空最關鍵的就是五角星,下面我們就來創建一個繪制五角星的函數
def star(x, y, left_angle, edge_len, color='yellow'):
""" 畫一個五角星 :param x: 起始x坐標 :param y: 起始y坐標 :param left_angle: 畫筆方向逆時針轉動度數 :param edge_len: 五角星邊的長度 :param color: 五角星顏色 :return: """
# 五角星邊的顏色
turtle.pencolor(color)
# 五角星內部填充色
turtle.fillcolor(color)
# 繪制速度,0代表最快,1-10:數字越大越快
turtle.speed(0)
turtle.pu() # 抬起畫筆 turtle.goto(x, y) # 移動到初始位置 turtle.pd() # 放下畫筆 turtle.begin_fill() # 開始填充圖形 # 畫筆方向以水平方向為基准 # 逆時針轉動 left_angle 度 turtle.left(left_angle) # 循環繪制五角星的 5 條邊 for _ in range(5): # 向畫筆方向移動edge_len像素長度 # 即:繪制五角星的一條邊 turtle.forward(edge_len) # 畫筆方向順時針旋轉144度 # 由於五角星內角是36度,因此旋轉180-36=144度 turtle.right(144) turtle.end_fill() # 填充完成 # 將畫筆方向恢復為水平方向,以免影響后續畫圖 turtle.left(-left_angle)
上述代碼主要涉及 tutle api 的使用,代碼注釋已有說明,這里就不再贅述了。
單獨解釋下為什么調用turtle.left(left_angle)
函數來旋轉畫筆的方向。默認畫筆的方向是水平的,如果不旋轉,那么畫出來的五角星都是同一個方向的,整個畫面看起來沒有層次感。下圖是這兩種效果的對比 另外,調用
turtle.speed(1)
可以看到慢速的繪圖過程。
有了五角星之后,我們就可以不斷調用star()
函數實現漫天星空的效果了,代碼如下
# 繪制滿天星
# 添加背景圖,需要是gif格式
turtle.bgpic('./bg.gif')
# 繪制 200 顆星星
for _ in range(200):
# 隨機生成起始坐標、畫筆方向和五角星邊長
rand_x = random.randint(-400, 400)
rand_y = random.randint(0, 400)
edge_len = random.randint(3, 8)
left_angle = random.randint(0, 180)
star(rand_x, rand_y, left_angle, edge_len, '#B7C5D2')
上述代碼比較簡單這里就不解釋了,下面繼續繪制五星紅旗
# 繪制五星紅旗
# 清空之前圖形
turtle.clear()
# 重新設置背景圖
turtle.bgpic('./red_bg.gif')
# 一次繪制國旗上的五顆星 star(-360, 320, 0, 80) star(-260, 350, 40, 18) star(-235, 330, 20, 18) star(-235, 295, 0, 18) star(-260, 270, -10, 18) # 讓畫布停留 turtle.done()
這樣,整個代碼就介紹完了,代碼量不大且比較容易理解,需要源碼的朋友可以在公眾號回復關鍵字 星空 獲取。
五四青年節快樂,補一個問候。
歡迎公眾號「渡碼」,輸出別地兒看不到的干貨。
