绘图系统六:动态三维展示

news2024/11/25 14:40:43

文章目录

    • 时间轴
    • 单帧跳转
    • 动图绘制函数
    • 接口优化

  • 📈一 三维绘图系统 📈二 多图绘制系统📈三 坐 标 轴 定 制
  • 📈四 定制绘图风格 📈五 数据生成导入
  • 源码地址 Python打造动态绘图系统

时间轴

三维并不是人类理解的极限,毕竟我们生活在思维时空中。所以接下来要做的,就是四维图形——加一个时间轴。

实际上,这个项目创建之初就已经考虑到动图绘制的问题,毕竟默认的绘图坐标是txyz。但是,如果想实现动图绘制,就必须要先设置一个额外的线程,用于动态更新图像,否则绘图循环压迫主进程,会导致界面变得奇卡无比。

接下来,就开始实现绘制动图的需求,第一步,绘制UI。先在setFrmCtrl中添加

# 动画控制
frm = ttk.Frame(frmCtrl, width=320)
frm.pack(side=tk.TOP, fill=tk.X)
self.setAnimateFrame(frm)

然后实现具体的self.setAnimateFrame

def setAnimateFrame(self, frm):
    pDct = dict(side=tk.LEFT, fill=tk.X, padx=2)

    self.aniDelay = tk.StringVar()
    self.aniDelay.set(100)
    ttk.Label(frm, text="延时/毫秒").pack(**pDct)
    ttk.Entry(frm, width=5, textvariable=self.aniDelay).pack(**pDct)

    self.aniFrameNum = tk.StringVar()
    self.aniFrameNum.set(100)
    ttk.Label(frm, text="帧数").pack(**pDct)
    ttk.Entry(frm, width=5, textvariable=self.aniFrameNum).pack(**pDct)
    self.tIndex = 0   # 当前帧数


    ttk.Button(frm, width=3, text=  "⇦", 
        command=self.btnPreFrame).pack(**pDct)
    ttk.Button(frm, width=3, text="▶", 
        command=self.btnAniStart).pack(**pDct)
    ttk.Button(frm, width=3, text="⇨", 
        command=self.btnNextFrame).pack(**pDct)

def btnAniStart(self): pass

def btnPreFrame(self): pass

def btnNextFrame(self): pass

在这里插入图片描述

延时表示当自动绘制动图时,两帧间隔时间;帧数表示总共绘制的时间个数。三个按钮,分别用于向前一帧、向后一帧以及动态播放。

单帧跳转

坐标t的工作原理和xyz并不相同,毕竟每次调用时间参数的时候,都只需要调用某一点的时间。所以,现有的设置坐标数据的方法就不适用了,需要更改readDatas函数

# 读取坐标轴al的数据
def readDatas(self, al):
    dct = {}
    data = {}
    for flag in self.drawTypeDim.getDim():
        data[flag] = al.setData(flag, **dct)
        if flag=='t': 
            dct['t'] = data['t'][self.tIndex]
        else:
            dct[flag] = data[flag]
    return data

然后再更新一下绘图函数:其实只是取消t作为绘图坐标轴的地位

def btnDrawImg(self):
    self.fig.clf()
    self.axDct = {}
    for al in self.als:
        ax = self.setDrawAxis(al)
        data = self.readDatas(al)
        draw = self.drawDct[al.getDrawType()]
        style = al.getStyle()
        keys = al.getDrawDim().replace('t',"")
        draw(ax, data, keys, style)
    self.fig.subplots_adjust(left=0.1, right=0.95, top=0.95, bottom=0.08)
    self.canvas.draw()

最后,实现一下btnNextFrame

def btnNextFrame(self): 
    num = int(self.aniFrameNum.get())
    self.tIndex = (self.tIndex + 1) % num
    self.btnDrawImg()

效果如下,至此,我们离自动化动态绘图,只剩下一个多线程了。

在这里插入图片描述

动图绘制函数

所谓动图绘制,其实只需要一个循环,并且每次绘图之前,要有一定的延时。启用多线程和延时,需要导入下面两个模块

from threading import Thread
import time

接下来,就是self.btnAniStart函数和具体的动图绘制函数了

def btnAniStart(self): 
    Thread(target=self.btnDrawCycle, daemon=True).start()

def btnDrawCycle(self):
    dt = self.aniDelay.get()/1000.0
    for i in range(self.aniFrameNum.get()):
        self.tIndex = i
        self.btnDrawImg()
        time.sleep(dt)

点击播放按钮后效果如下

在这里插入图片描述

但是从图像播放的角度来说,这个设计并不十分合理,因为点击播放的三角号之后,应该要给出一个停止播放的按钮,相应地DrawCycle函数也应该新增一个无尽循环模式。

为了实现播放控制,为播放按钮绑定一个可变字符串

self.btnStartText = tk.StringVar()
self.btnStartText.set("▶")
ttk.Button(frm, width=3, textvariable=self.btnStartText,
    command=self.btnAniStart).pack(**pDct)

然后修改btnAniStart,大致改成下面的形式,但这里只是添加了暂停的逻辑,但并没有真正实现暂停的功能

def btnAniStart(self):
    if self.btnStartText.get() == "▶":
        Thread(target=self.drawCycle, daemon=True).start()
        self.btnStartText.set("⏸")
    else:
        self.btnStartText.set("▶")

而真正实现暂停功能,就需要修改drawCycle函数了

def drawCycle(self):
    dt = self.aniDelay.get()/1000.0
    num = self.aniFrameNum.get()
    while self.btnStartText.get() == "⏸":
        self.tIndex = (self.tIndex + 1) % num
        self.btnDrawImg()
        time.sleep(dt)

在这里插入图片描述

接口优化

开发过程中会经常遇到新增的需求,这些需求的实现,会对原来的设计形成干扰,而且这些需求累加在一起,会导致代码变得十分畸形。比如一开始DrawType类只包含绘图类型和维度,所以在AxisList中做对象的时候,变量名取为drawTypeDim。但后来DrawType又加入了其他功能,使得drawTypeDim这个变量变得很蠢,所以接下来要重新命名。

主要变更如下

  • AxisList类

    • drawTypeDim 变为 drawType
  • DrawSystem类

    • drawTypeDim 变为 drawType
  • AxisList类中定义的函数,但DrawSystem中有调用

    • getDrawType -> getType
    • getDrawDim -> getDim

另外,由于t轴和xyz在绘图时的作用相去甚远,所以将getDim函数拆分成xyz和t两个函数。在AxisList中新增两个函数

def getXYZ(self):
    return self.getDim().replace("t", "")

def hasTimeAxis(self):
    return "t" in self.getDim()

更改DrawSystem中的调用,btnDrawImgal.getDim().replace('t',"")改为al.getXYZ()readDatas改写如下

def readDatas(self, al):
    dct = {}
    data = {}
    if al.hasTimeAxis():
        data['t'] = al.setData('t')
        dct['t'] = data['t'][self.tIndex]
    for flag in al.getXYZ():
        data[flag] = al.setData(flag, **dct)
        dct[flag] = data[flag]
    return data

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1033604.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 Substance Painter中实现Unity Standard Shader

由于有需要在Substance Painter中显示什么样的效果,在Unity就要显示什么样的效果的需求,最近研究了几天,总算在Substance Painter中实现Unity standard的材质的渲染效果。具体效果如下: 在Unity中: Substance Painte…

as 加载aar(包含so文件)遇到问题的解决方法

""" r java.lang.UnsatisfiedLinkEnror :No implementation found for void com.example.myapplication2.Model.init(java.lang .Storing, java.lang .string) 原来是so文件里的Model类的所属的包名,跟我java里的不一样。linux里,可以用 …

AI数字人:最强声音驱动面部表情模型VideoReTalking

目录 1 VideoReTalking论文解读 1.1 介绍 1.2 相关工作 1.2.1 视频编辑中的音频配音 1.2.2 基于音频的单图像面部动画 1.3 框架 1.3.1 语义引导重演网络 1.3.2 口型同步网络 1.3.3 身份感知增强网络 1.3.4 后期处理 1.4 训练 1.4.1 每个模块的训练 1.4.2 评估 1.…

vue组件页面没有加载出来

现象:加载一个组件,生命周期走完,界面没有出来。 由于生命周期都走完,接口也都有请求,最初怀疑,样式原因导致dom元素被吞,然后修改样式无效。 定位方法:dom元素一一移除&#xff0…

Python爬虫技术系列-01请求响应获取-urllib库

Python爬虫技术系列-01请求响应获取-urllib库 1 urllib库1.1 urllib概述1.1.1 urllib简介1.1.2 urllib的robotparser模块1.1.3 request模块1.1.4 Error1.1.5 parse模块 1.2 urllib高级应用1.2.1Opener1.2.2 代理设置 1 urllib库 参考连接: https://zhuanlan.zhihu.…

继往开来,图鸟UI又推出一款高颜值、兼容多平台、丰富组件的图表组件模板

大家好,今天分享的主题是图表统计。图表统计是使用图表和图形来可视化和呈现数据的方法。它通过将数据转化为柱状图、折线图、饼图等形式来展示各种统计指标和趋势。 图表统计可以帮助我们更好地理解和分析数据,发现数据之间的关联和规律,并…

Qt5开发及实例V2.0-第十七章-Qt版MyWord字处理软件

Qt5开发及实例V2.0-第十七章-Qt版MyWord字处理软件 第17章-Qt版MyWord字处理软件17.1 运行界面17.1.1 菜单设计基本操作17.1.2.MyWord系统菜单 17.2 工具栏设计17.2.1 与菜单对应的工具条17.2.2 附加功能的工具条 这段代码的作用是加载系统标准字号集,只要在主窗体构…

景联文科技:2023人工智能数据标注行业现状分析?

随着人工智能产业的快速发展,AI数据标注行业也呈现出蓬勃生机。人工智能算法的不断开发和迭代,离不开结构化数据的支持,AI数据标注行业的发展也得到了人工智能核心产业的带动。预计2027年市场规模有望达到130-160亿元。 随着算法的不断演进和…

记一次CTF入门练习

前言 学习CTF有一段时间了,现在做个小小的总结,加深印象。 习题下载(只含第一部分) 链接:https://pan.baidu.com/s/1j-_TlAek4Q9IlEwbMWv2GA?pwd47pk 提取码:47pk 正文 1.1、MISC——找到证据 解压缩…

JavaWeb 学习笔记 7:Filter

JavaWeb 学习笔记 7:Filter 1.快速开始 使用过滤器的方式与 Servlet 类似,要实现一个Filter接口: WebFilter("/*") public class FirstFilter implements Filter {public void init(FilterConfig filterConfig) throws ServletE…

UOS Deepin Ubuntu Linux 开启 ssh 远程登录

UOS Deepin Ubuntu Linux 开启 ssh 远程登录 打开控制台 安装 openssh-server sudo apt -y install openssh-server修改 /etc/ssh/ssh_config 文件 sudo vim /etc/ssh/ssh_config找到 # Port 22 去掉 # 注释后 保存 重启 ssh 服务 sudo systemctl restart ssh设置 ssh 服务 开机…

pytorch学习------常见的优化算法

优化算法 优化算法就是一种调整模型参数更新的策略,在深度学习和机器学习中,我们常常通过修改参数使得损失函数最小化或最大化。 优化算法介绍 1、梯度下降算法(batch gradient descent BGD) 每次迭代都需要把所有样本都送入&…

VINS中的观测性问题

文章目录 一、背景二、BA problem的观测性问题1、不可观方向2、解决方案3、优化问题中信息矩阵物理意义 三、Keyframe-based Visual-Inertial SLAM的观测性问题1、不可观问题2、解决方案 四、MSCKF观测性分析1、观测性分析2、解决方案3、小结 一、背景 本文档分析以下VINS中的…

行业追踪,2023-09-22

自动复盘 2023-09-22 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

软考软件设计师-存储管理-文件管理-计算机网络(中

文章目录 一、存储管理页面置换算法 (最佳OPT)存储页面-先进先出置换算法(FIFO)最久未使用算法(最近最久未使用LRU) 二、文件管理初识文件管理文件目录-绝对路径文件管理-文件的结构文件管理-索引的分配 空闲存储空间的管理(位示图法)三、计算…

Spring | 事件监听器应用与最佳实践

引言 在复杂的软件开发环境中,组件之间的通信和信息交流显得尤为重要。Spring框架,作为Java世界中最受欢迎的开发框架之一,提供了一种强大的事件监听器模型,使得组件间的通信变得更加灵活和解耦。本文主要探讨Spring事件监听器的…

数据治理-组织触点

协调工作的一部分包括为数据治理工作制定组织接触点 采购和合同:首席数据官与供应商/合作伙伴的管理部门或者采购部门合作,制定和执行有关数据管理合同的标准文本。 预算和资金:如果首席数据官没有直接孔子所有与数据采购相关的预算&#xff…

sns.load_dataset(“iris“)报错原因探究+解决办法

问题描述 import seaborn as sns # 读取数据 iris sns.load_dataset("iris")在代码中使用了seaborn ,并加载iris数据,结果产生了报错信息如下所示 问题分析 原因很简单,我们使用了sns.load_dataset("iris")来加载数据…

在Python中创建相关系数矩阵的6种方法

相关系数矩阵(Correlation matrix)是数据分析的基本工具。它们让我们了解不同的变量是如何相互关联的。在Python中,有很多个方法可以计算相关系数矩阵,今天我们来对这些方法进行一个总结 Pandas Pandas的DataFrame对象可以使用c…

解决编译中遇到的问题:Please port gnulib freadahead.c to your platform

今天在编译旧版的gzip-1.7时遇到了一个错误: error: #error "Please port gnulib freadahead.c to your platform! Look at the definition of fflush, fread, ungetc on your system, then report this to bug-gnulib." 在网上搜了一下解决方法&#xf…