1. 問題分析
需求:根據腳本來繪制圖形
Python的 turtle 庫通過寫代碼的方式來繪圖,現在我們要根據數據來繪制軌跡。
使用數據腳本時自動化最重要的第一步。例如,根據下面的幾組數據繪制出的圖形:
300,0,144,1,0,0
300,0,144,0,1,0
300,0,144,0,0,1
300,0,144,1,1,0
300,0,108,0,1,1
184,0,72,1,0,1
繪制結果:
2.實例講解
讀取文件-->解析數據-->繪制圖形
實現思路:
- 步驟1:定義數據文件格式(接口)
- 步驟2:編寫程序,根據文件接口解析參數繪制圖形
- 步驟3:編制數據文件
數據接口的定義:
- 一行表示一次操作
- 每行有6個數據,中間使用逗號分隔
- 第1個數據:行進距離
- 第2個數據:轉向判斷,0表示左轉,1表示右轉
- 第3個數據:轉向絕對角度
- 第4、5、6個數據:RGB三個通道顏色,取值范圍0-1之間的浮點數
如下:
300,0,144,1,0,0
300,0,144,0,1,0
下面使用海龜繪圖體系來加載文件和繪制圖形:
#AutoTraceDraw.py
import turtle as t
t.title('自動軌跡繪制')
t.setup(800, 600, 0, 0)
t.pencolor("red")
t.pensize(5)
#數據讀取
datals = []
f = open("data.txt")
for line in f:
line = line.replace("\n","")
datals.append(list(map(eval, line.split(","))))
f.close()
#自動繪制
for i in range(len(datals)):
t.pencolor(datals[i][3],datals[i][4],datals[i][5])
t.fd(datals[i][0])
if datals[i][1]:
t.right(datals[i][2])
else:
t.left(datals[i][2])
其中 data.txt 文件的數據:
300,0,144,1,0,0
300,0,144,0,1,0
300,0,144,0,0,1
300,0,144,1,1,0
300,0,108,0,1,1
184,0,72,1,0,1
184,0,72,0,0,0
184,0,72,0,0,0
184,0,72,0,0,0
184,1,72,1,0,1
184,1,72,0,0,0
184,1,72,0,0,0
184,1,72,0,0,0
184,1,72,0,0,0
184,1,720,0,0,0
對上面部分代碼的詳細講解:
for line in f:
line = line.replace("\n","")
datals.append(list(map(eval, line.split(","))))
print(datals)
f.close()
line = line.replace("\n","") 將文件最后的換行符轉換為空字符串,去掉換行的信息,然后再賦給 line
此時 line 的信息存儲的是我們定義的每一行的數據接口的值,我們需要將數據接口的值進行分隔、處理並提取其中的信息。
使用 for line in f 拿到的是字符串,但是我們希望得到的是數字。此時我們該怎么做?
由於這個字符串中的每個數字之間用逗號 "," 進行分隔,可以使用 line.split() 並使用逗號作為分隔符,將這樣一個字符串分隔成若干個字符串。split() 函數更多解釋請看:https://www.runoob.com/python/att-string-split.html
map函數:將第一個參數的功能作用於第二個參數的每一個元素。簡單地說就是對一個列表或者一個集合,這樣的組合數據類型的每一個元素,都執行一次第一個參數所對應的函數。map()函數更多解釋請看:https://www.runoob.com/python/python-func-map.html
eval函數:將一個字符串的兩側的引號去掉。eval函數更多解釋請看:https://www.runoob.com/python/python-func-eval.html
3. 自動軌跡繪制實例的舉一反三
理解方法思維
- 自動化思維:數據和功能分離,數據驅動的自動運行
- 接口化設計:格式化設計接口,清晰明了
- 二維數據應用:應用維度組織數據,二維數據最常用
應用問題擴展
- 擴展接口設計,增加更多控制接口
- 擴展功能設計,增加弧形等更多功能
- 擴展應用需求,發展自動軌跡繪制到動畫繪制
以上內容資料均來源於中國大學MOOC網-北京理工大學Python語言程序設計課程
課程地址:https://www.icourse163.org/course/BIT-268001