zoukankan      html  css  js  c++  java
  • 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("
    ","")
        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

  • 相关阅读:
    设计模式课程 设计模式精讲 3-7 接口隔离原则讲解及Coding
    如果你的css文件这么分类,可维护性大大增强!--摘抄
    你如果知道这些css常用命名,绝对事半功倍!--摘抄
    前端开发 CSS中你所不知道的伪类与伪元素的区别--摘抄
    腾讯浏览服务
    CSS3动画那么强,requestAnimationFrame还有毛线用--摘抄
    浏览器的 16ms 渲染帧--摘抄
    了解Chrome扩展程序开发--摘抄
    HTML 文档之 Head 最佳实践--摘抄
    安卓版微信视频播放全屏处理--摘抄
  • 原文地址:https://www.cnblogs.com/keepcode/p/14452126.html
Copyright © 2011-2022 走看看