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("
","")
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("
","")
datals.append(list(map(eval, line.split(","))))
print(datals)
f.close()
line = line.replace(" ","") 将文件最后的换行符转换为空字符串,去掉换行的信息,然后再赋给 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