Matlab动画初探

来源:互联网 发布:usb网络转换器买多少兆 编辑:程序博客网 时间:2024/06/06 13:00

Matlab动画初探

时隔几天,终于把matlab的动画初步弄懂了。再次吐槽数学实验!搞得我头晕脑胀滴。

关于getframe

getframe的功能很强大很给力,但是现在我能用到的只是最最基本的功能:获得当前坐标轴的图像信息。所有的信息将汇集成一个或者是一系列特殊的数据,因此往往需要建立一个特殊的矩阵来存储这些数据。在存储好之后呢,就可以用下来要说到的movie这个函数来“播放”这个特殊的矩阵了。

特殊的矩阵的创建:一般是在循环中新建矩阵,将每一个循环的图片状态存储到矩阵的相应元素中。一般形式如下:

for k=m:n

    ... %这里是图像绘制部分

    frame(k) = getframe;

end

其中的frame就是所谓的特殊矩阵了。

关于movie

movie函数的用法相当简单。一般用法有:

1、movie(frame)

这里的frame就是刚刚所谓的特殊矩阵了。这个的意思是说播放frame

2、movie(frame,n)

frame播放n遍。

3、movie(frame,n,fps)

frame以每秒fps帧的速度播放n遍。

一些常用的动画

先以最简单的正弦函数的生成为例。

新建一个script文件,输入一下内容:

x = -pi:.1:pi;

y = sin(x);

for k=1:size(x,2)

    plot(x(1:k),y(1:k))

    axis ([-pi pi -1 1])

    f(k) = getframe;

end

执行之后会发现在Workspace窗口中出现了f这个特殊矩阵:


然后在Command Window中输入:movie(f,1,24),这样就将刚刚生成的f矩阵以24的帧频播放了一遍。

注意:

在函数生成动画中不要写成:

x = -pi;

for k=1:50

    y(k) = sin(x);

    plot(x,y(k))

    hold on

    axis ([-pi pi -1 1])

    x = x+2*pi/50;

    f(k) = getframe;

end

这样将无法连线。

不过可以在plot中加入’s’参数,会得到很有趣的结果。

再看如下动画:

x = -pi:.1:pi;

y = sin(x);

t = [1:-.1:-1 -1:.1:1];

for k = 1:size(t,2)

    plot(x,t(k)*sin(y))

    axis ([-pi pi -1 1])

    f(k) = getframe;

end

要是感觉不流畅的话可以改成如下形式:

x = -pi:.1:pi;

y = sin(x);

t = 0:.1:2*pi;

for k = 1:size(t,2)

    plot(x,cos(t(k))*sin(y))

    axis ([-pi pi -1 1])

    f(k) = getframe;

end

在来点3D的:

figure('Renderer','zbuffer')

[x,y] = meshgrid(-2*pi:.1:2*pi);

z = sin(x)+cos(y);

t = 0:.1:2*pi;

for k = 1:size(t,2)

    mesh(x,y,cos(t(k))*z)

    axis ([-2*pi 2*pi -2*pi 2*pi -2 2])

    f(k) = getframe;

end

这里说一下第一句,是设置窗口的渲染器(‘Renderer’)zbuffer(Z深度算法,一种渲染方法),了解一下即可。因为3d动画对渲染要求较高,因此需要设置渲染器。如果不设置的话可能无法正常播放动画。

再说一下另一个常见的动画,旋转。

说到旋转,要用到view这个命令:

view(az, el)

azel为视角,az为方位角,el为仰角,均以角度为单位。绕z轴旋转的话让az变化即可,速度为负则逆时针旋转。当az=0时,y轴垂直于观察者身体。

于是,旋转马鞍面的程序如下:

figure('Renderer','zbuffer')

[x,y] = meshgrid(-1:.1:1);

z = x.*y;

az = -20;

for k=1:50

    mesh(x,y,z)

    axis square off

    view(az,20)

    f(k) = getframe;

    az = az+360/50;

end

以上就是常见的动画生成方法了。