前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何用matlab制作演示动画并存储

如何用matlab制作演示动画并存储

作者头像
巴山学长
发布2019-07-15 15:07:38
2.4K0
发布2019-07-15 15:07:38
举报
文章被收录于专栏:巴山学长巴山学长

之前给大家介绍过如何使用matlab绘制静态图像,但是实际应用过程中往往可能需要动态的展示计算结果,因此推出本期内容来介绍如何使用matlab制作演示动画并存储演示结果。

先给大家说明实现的思路以方便大家阅读程序:我们知道动画的原理就是多张静态连贯图像在短时间内快速播放而形成的影片。因此我们需要具备三个条件:静态图像、图像连贯、快速展示。matlab就天然具备这样的条件,使用绘图命令可以获得静态图像,自变量取不同的值可以保证图像空间上的连贯性,使用循环可以达到快速播放效果。

具体实现过程如下:定义自变量的取值情况,根据自变量初始化因变量(一般用zeros函数),定义一个for循环构架,取k为循环计次,每次绘制各变量1至k大小的图像(一般使用hold on和hold off组合命令来保持图像帧)。由于matlab绘制速度极快,肉眼几乎分辨不处重画造成的画面顿挫感。每绘制完成一次获取当前图像帧,使用imwrite命令来保存当前帧,并使用gif图像格式,因为保存视频格式既浪费存储空间又没得必要。

基于以上思路,以绘制李萨如图和三维螺旋线图来分别演示二维三维的如何具体实现。

源代码:

这里只注释李萨如图绘制部分代码,螺旋线绘制类似,无需赘述。

% 李萨如图动画演示代码

代码语言:javascript
复制
close all;clc;clear;
% 定义自变量
t=0:0.02:2*pi;
lenT = length(t);
m = 3;
n = 5;
figure;
xlabel('X 轴');
ylabel('Y 轴');
xlim([-1 1]);
ylim([-1 1]);
title('李萨如图动画演示');
% 使用hold on保持图像帧
hold on;
gg = 1;
% 初始化因变量
lx = zeros(1,lenT);
ly = zeros(1,lenT);
% 实现动画过程的核心部分
% 这里的循环计次就相当于时间序列将各个静态图像串联起来
for k = 1:lenT
    % 李萨如方程
    lx(k) = cos(m*t(k));
    ly(k) = sin(n*t(k));
    % 绘制1至k的曲线
    plot(lx(1:k),ly(1:k),'r.-');
    % 为了防止程序假死,暂停适当时间
    pause(0.001);
    % 获取当前图像帧
    F = getframe(gcf);
    %转成gif图片,只能用256色
    im = frame2im(F);
    [I,map] = rgb2ind(im,256);
    %写入 GIF格式文件
    if gg == 1
        % 第一次运行需要设置文件名创建文件等

        imwrite(I,map,'lsr.gif','GIF', 'Loopcount',inf,'DelayTime',0.1);
        gg = gg + 1;
    else
        % 此后直接附加到上一帧后面即可

        imwrite(I,map,'lsr.gif','WriteMode','append','DelayTime',0.1);
    end
end
hold off

效果图:

% 螺旋线动画演示代码

代码语言:javascript
复制
close all;clc;clear;
t=0:0.05:10*pi;
lenT = length(t);
x = zeros(1,lenT);
y = zeros(1,lenT);
z = zeros(1,lenT);
plot3(x(1),y(1),z(1),'ro');
hold on;
xlabel('X 轴');
ylabel('Y 轴');
zlabel('Z 轴');
xlim([-1 1]);
ylim([-1 1]);
zlim([0 80]);
title('螺旋线动画演示');
gg = 1;
for k = 1:lenT
    x(k) = cos(t(k));
    y(k) = sin(t(k));
    z(k) = t(k)*2;
    plot3(x(1:k),y(1:k),z(1:k),'r.-');
    pause(0.005);
    % 保存为动画
    F = getframe(gcf);
    %转成gif图片,只能用256色
    im = frame2im(F);
    [I,map] = rgb2ind(im,256);
    %写入 GIF格式文件
    if gg == 1
        imwrite(I,map,'lxx.gif','GIF', 'Loopcount',inf,'DelayTime',0.1);
        gg = gg + 1;
    else
        imwrite(I,map,'lxx.gif','WriteMode','append','DelayTime',0.1);
    end
end
hold off;

效果图:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 巴山学长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档