Python实例:自动轨迹绘制

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

绘制结果:

image-20210226141959964


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

posted @ 2021-02-26 14:22  狸帅  阅读(2621)  评论(0编辑  收藏  举报