MATLAB将动画演示以及将过程保存为gif动态图片

news2024/11/26 22:24:40

平时想要做一个动画图片来演示,本人一般有两种方法:
一种是截很多张图之后,将这些图片合成为一张gif动画;
另一种就是录屏再制作成gif,我一般是录下视频之后,使用QQ影音,里面的影音工具箱有一个制作动画的功能。
这两种方法都比较繁琐,尤其是第一种需要慢慢截自己需要的图,所以这里介绍一种在MATLAB中使用代码来保存整个动画演示过程的gif图片的方法,这样就方便很多了。

1、机器人教学

依然使用p560六轴机械臂机器人来演示,首先就是加载机器人:

startup_rvc
mdl_puma560

没有下载MATLAB,想要学习的可以查阅:MatLab的下载、安装与使用(亲测有效)
需要研究机器人的,需要下载机器人工具包:MATLAB的rvctools工具箱熟悉运动学【机械臂机器人示例】

我们使用前面学过的运动学的正解确定起始位姿和目标位姿,规划出一条运动轨迹,然后画出来:

t=[0:0.05:2];%两秒完成轨迹,步长0.05
T1 = p560.fkine(qz);%起始位姿,qz零角度
%T2 = p560.fkine(qn)
T2 = p560.fkine([pi/2 pi/3 pi/6 0 0 0]);%目标位姿
J = p560.jtraj(T1,T2,t);%生成轨迹
p560.plot(J)

接下来我们就是将这个演示的动画给保存起来,制作成一个gif的动画:

%制作动画
filename = 'demo.gif';
for i = 1:length(t)
    pause(0.01)
    p560.plot(J(i,:));
    f = getframe(gcf);  %gcf获取当前图窗的句柄,getframe捕获坐标区或图窗作为影片帧
    imind = frame2im(f); %返回与影片帧关联的图像数据
    [imind,cm] = rgb2ind(imind,256); %将 RGB 图像转换为索引图像
    if i == 1
        imwrite(imind,cm,filename,'gif', 'Loopcount',inf,'DelayTime',0.1);
    else
        imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',0.1);
    end
end

制作动画的过程就是将动画的每一帧写入到gif这个动画图片里面去,原理如下:
开启动画演示,使用 gcf 函数获取当前图窗的句柄,然后通过 getframe 函数来捕获坐标区或图窗作为影片帧,再使用 frame2im 函数返回与影片帧关联的图像数据,以及使用 rgb2ind 函数将 RGB 图像转换为索引图像(此 MATLAB 函数 使用最小方差量化和抖动将 RGB 图像转换为索引图像 X。map 最多包含 n 个颜色。n 必须小于或等于 65,536。)
最后使用 imwrite 函数将图像数据写入图形文件中,这里是动画所以会一直不断的写入动态的图像数据到gif文件中。
另外这里面的for循环和if的用法,需要注意的是都需要end来匹配结束。

2、幂函数

x的一次方到x的6次方的动画演示:

x = -2:0.01:2;
n = 1:1:6;
filename = 'demo1.gif'
for i = 1:length(n)
    y = x.^(n(i));
    plot(x,y,'r','LineWidth',1)
    title(['y = x^' num2str(n(i))])
    drawnow
    frame = getframe(gcf);
    im{i} = frame2im(frame);
    [A,map] = rgb2ind(im{i},256); 
    if i == 1
        imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',1);%每帧播放时间
    else
        imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',1);
    end
end

 

3、正弦函数

filename = 'demo2.gif'
for i = 1:4
    x = 0:0.1:2*pi*i;
    y = sin(x);
    plot(x,y,'r','LineWidth',1)
    title('y = sinx')
    drawnow
    frame = getframe(gcf);
    im{i} = frame2im(frame);
    [A,map] = rgb2ind(im{i},256); 
    if i == 1
        imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',1);%每帧播放时间
    else
        imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',1);
    end
end

 

4、圆与正弦函数

圆周运动与正弦函数的关系(0到2π的一个圆也是正弦函数一个周期),所以三角函数也叫做圆函数,最初就是圆上的点做的运动而形成的轨迹吧。

theta = linspace(0,2*pi,200); 
%圆的坐标
x = cos(theta)-1;
y = sin(theta);
%正弦函数坐标
x1 = theta;
y1 = sin(x1);
 
for i = 1:length(theta)
    set(gcf,'outerposition',get(0,'screensize'));%全屏
    %圆和正弦函数之间的连接线
    connectLineX = linspace(x(i),x1(i),50);
    connectLineY = zeros(1,50)+y(i);

    AxisX = linspace(-2,10,50);
    AxisY = zeros(1,50);
    %圆中的箭头
    arrowX = [-1,x(i)];
    arrowY = [0,y(i)];
    
    %圆周上的点到横轴的垂线
    lineX = zeros(1,20)+x(i);
    lineY = linspace(0,y(i),20);
    %正弦函数上的点到横轴的垂线
    x3 = zeros(1,20)+x1(i);
    y3 = linspace(0,y1(i),20);
    %画图
    plot(x(1:i),y(1:i),'r',x1(1:i),y1(1:i),'g',connectLineX,connectLineY,'--',arrowX,arrowY,'-bo',lineX,lineY,'k',x3,y3,'k','LineWidth',3);
    text(x(i)+0.05,y(i),strcat(num2str(theta(i)/pi),'\pi'),'fontsize',14);
    text(x1(i)+0.05,y1(i),strcat(num2str(theta(i)/pi),'\pi'),'fontsize',14);
    grid on
    axis equal
    axis([-2.2 7 -1.2 1.2])
    set(gca,'XTick',[-2,-1,0:pi/8:2*pi]);
    set(gca,'xtickLabel',{'-2','-1','0','\pi/8','\pi/4','3\pi/8','\pi/2','5\pi/8','3\pi/4','7\pi/8','\pi','9\pi/8','5\pi/4','11\pi/8','3\pi/2','13\pi/8','7\pi/4','15\pi/8','2\pi'});
    title('圆周运动跟正弦函数','fontsize',22,'fontname','微软雅黑')
    drawnow
    f=getframe(gcf);
    imind=frame2im(f);
    [imind,cm] = rgb2ind(imind,256);
    if i == 1
        imwrite(imind,cm,'sin.gif','GIF', 'Loopcount',inf,'DelayTime',0.02);
    else
        imwrite(imind,cm,'sin.gif','GIF','WriteMode','append','DelayTime',0.02);
    end
end

由于动画超过5M,上传不过,截个图如下:

PS画圆:

t=0:0.1:2*pi
x = cos(t);
y = sin(t);
plot(x,y)
或者
ezplot('x^2+y^2=1')

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

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

相关文章

【玩转TableAgent 数据智能分析】-- 数据分析不再是专业人士的专利

文章目录 前言一、TableAgent介绍TableAgent 数据分析智能体融合创新应用的新成果Table Family 二、注册TableAgent访问TableAgent注册用量 三、 体验TableAgent样例数据集体验选择样例数据集样例数据集进行数据分析数据图 样例数据集进行数据分析规定图表格式数据图 自定义数据…

解决:IndentationError:unindent does not match any outer indentation level

解决:IndentationError:unindent does not match any outer indentation level 文章目录 解决:IndentationError:unindent does not match any outer indentation level背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在…

Ui自动化概念 + Web自动化测试框架介绍!

1.UI自动化测试概念:我们先明确什么是UI UI,即(User Interface简称UI用户界面)是系统和用户之间进行交互和信息交换的媒介 UI自动化测试: Web自动化测试和移动自动化测试都属于UI自动化测试,UI自动化测试就是借助自动化工具对程序UI层进行自动化的测试 …

Mysql之数据处理增删改

Mysql之数据处理增删改查 插入数据INSERT INTO语句的使用INSERT 与子查询结合 更新数据(修改数据)UPDATE SET语句 删除数据DELETE FROM语句 Mysql8新特性:计算列 插入数据 INSERT INTO语句的使用 用 INSERT INTO 语句,向表中插入数据 方式一:…

网络安全威胁——DDoS攻击

DDoS攻击 1. 定义2. DDoS攻击类型2.1 网络层攻击2.2 传输层攻击2.3 应用层攻击 3.DDoS攻击态势特点 1. 定义 分布式拒绝服务(DDoS)攻击是一种常见的网络攻击形式。攻击者利用恶意程序对一个或多个目标发起攻击,企图通过大规模互联网流量耗尽…

活动预告 | 中国数据库联盟(ACDU)中国行第四站定档西安,邀您探讨数据库前沿技术

作为墨天轮社区与中国数据库联盟的品牌活动之一,【ACDU 中国行】已走过深圳、杭州、成都三大城市,在线下汇集数据库领域的行业知名人士,共同探讨数据库前沿技术及其应用,促进行业发展和创新,同时也为开发者们提供一个友…

什么是HTTPS加密协议?

文章目录 应用层协议什么是HTTP?认识URL工具 什么是HTTPS协议?什么是“加密”? 应用层 我们程序猿写的一个个解决我们实际问题,满足我们日常需求的网络程序,都是在应用层。 协议 协议是一种 “约定”。socket api的…

富时中国a50指数准确吗

富时中国A50指数简介 富时中国A50指数(FTSE China A50 Index)是富时罗素指数有限公司(FTSE Russell)编制的,旨在反映中国A股市场50家市值较大、流动性较好的公司的股价表现。它是国际上对中国A股市场投资者影响较大的…

springbootmybatisPlus

分页 1.加 Configuration public class MybatisPlusConfig {Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return …

前端笔记(四)Flex 布局

标准流 标准流也叫文档流,指的是标签在页面中默认的派不规则,例如:块元素独占一行,行内元素可以一行显示多个。 但是很多的网页布局都是块元素在一行中显示的,这时候就需要浮动和 Flex 布局,浮动只需要了解…

【Java基础系列】JavaWeb入门

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【LeetCode】2629. 复合函数

复合函数 题目题解 题目 请你编写一个函数,它接收一个函数数组 [f1, f2, f3,…, fn] ,并返回一个新的函数 fn ,它是函数数组的 复合函数 。 [f(x), g(x), h(x)] 的 复合函数 为 fn(x) f(g(h(x…

MYSQL练题笔记-高级查询和连接-最后一个能进入巴士的人

一、题目相关内容 1)相关的表和题目 2)帮助理解题目的示例,提供返回结果的格式 二、自己初步的理解 一群人要上巴士但是巴士有体重限制,那只能有限个人才能上去 最后输出这个最后一个上去还不超重的人的名字 我认为首先要缩小…

Java+Swing: 登录和重置按钮的点击事件 整理6

1. 在Login类中给按钮添加事件 // 按钮添加鼠标点击事件loginButton.addActionListener();resetButton.addActionListener(); 2. 创建一个事件处理的类, 该类实现了ActionListener package com.handler;/*** Author:xiexu* Date:2023/12/7 13…

K8S 删除命令空间时 一直卡住怎么办?

当使用完一个命名空间后,想删除了又删除不掉,这个时候查看命名空间的状态一直是Terminating。使用强制删除,也是还是不行。(找了好多办法都不行) [rootk8s-master kubernetes-yaml]# kubectl delete ns mem-example Er…

3DMAX UV贴图修改插件安装卸载方法

3DMAX UV贴图修改插件安装卸载方法 3dMax贴图修改插件PolyUnwrapper是为纹理艺术家设计的一整套专业工具,尤其适用于建筑和游戏行业。 它包含许多功能,将大大帮助您改进UV展开的工作流程。 【主要功能特点】 -多重缝合。一次缝合多个壳 -自定义打包算…

MTTS | 多语言多人的VITS语音合成项目实现

----------------------------------🗣️ 语音合成 VITS相关系列直达 🗣️ ------------------------------------- 🫧VITS :TTS | 保姆级端到端的语音合成VITS论文详解及项目实现(超详细图文代码) 🫧MB-iSTFT-VITS&am…

2024年江苏省职业院校技能大赛 信息安全管理与评估 第二阶段教师组 (样卷)

2024年江苏省职业院校技能大赛 信息安全管理与评估 第二阶段教师组 (样卷) 项目竞赛样题 本文件为信息安全管理与评估项目竞赛-第二阶段样题,内容包括:网络安全事件响应、数字取证调查、应用程序安全。 本次比赛时间为180分钟。 介绍 GeekSec专注技能竞…

Java聊天程序(一对一)简单版

我们首先要完成服务端,不然出错,运行也要先运行服务端,如果不先连接服务端,就不监听,那客户端不知道连接谁 服务端 import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.Actio…

常见数据同步工具之实时同步

实时数据同步是现代数据处理中非常重要的一环。在常见的数据同步工具中,Flume、Flink CDC和DataX都是非常受欢迎的选择。它们各自有自己的工作原理、优势和劣势。 Flume主要用于日志传输,简单易用但对特定数据源可能有限;Flink CDC基于CDC技术…