13

如果使用 MATLAB 的坐标随时间变化(例如椭圆体),我如何为表面设置动画?

4

4 回答 4

15

以下是一些可以在 MATLAB 中为绘图设置动画的方法示例...

在 for 循环中修改绘图:

您可以创建一个循环,在其中更改表面坐标,使用命令更新绘图对象set,并使用该pause命令暂停每个循环迭代一小段时间。这是一个例子:

[x, y, z] = ellipsoid(0, 0, 0, 4, 1, 1);  % Make an ellipsoid shape
hMesh = mesh(x, y, z);                    % Plot the shape as a mesh
axis equal                                % Change the axis scaling
for longAxis = 4:-0.1:1
  [x, y, z] = ellipsoid(0, 0, 0, longAxis, 1, 1);  % Make a new ellipsoid
  set(hMesh, 'XData', x, 'YData', y, 'ZData', z);  % Update the mesh data
  pause(0.25);                                     % Pause for 1/4 second
end

当你运行上面的代码时,你应该看到椭圆体的长轴收缩直到它变成一个球体。


使用计时器修改绘图:

您还可以使用计时器对象而不是循环来执行绘图的更新。在此示例中,我将首先创建一个timer_fcn我希望在每次计时器触发时执行的函数:

function timer_fcn(obj,event,hMesh)
  n = get(obj, 'TasksExecuted');  % The number of times the
                                  %   timer has fired already
  [x, y, z] = ellipsoid(0, 0, 0, 4-(3*n/40), 1, 1);  % Make a new ellipsoid
  set(hMesh, 'XData', x, 'YData', y, 'ZData', z);    % Update the mesh data
  drawnow;                                           % Force the display to update
end

现在我可以创建情节和计时器并按如下方式启动计时器:

[x, y, z] = ellipsoid(0, 0, 0, 4, 1, 1);  % Make an ellipsoid shape
hMesh = mesh(x, y, z);                    % Plot the shape as a mesh
axis equal                                % Change the axis scaling
animationTimer = timer('ExecutionMode', 'fixedRate', ...  % Fire at a fixed rate
                       'Period', 0.25, ...                %   every 0.25 seconds
                       'TasksToExecute', 40, ...          %   for 40 times and
                       'TimerFcn', {@timer_fcn, hMesh});  %   run this function
start(animationTimer);  % Start timer, which runs on its own until it ends

这将显示与 for 循环示例相同的动画。完成计时器对象后,请记住始终删除它:

delete(animationTimer);
于 2010-04-26T21:04:38.907 回答
3

您想在屏幕上显示动画还是将其保存为视频文件?如果您希望动画显示在屏幕上,您可以让您的程序重复重绘您正在绘制的情节,并在那里暂停,就像 gnovice 在他刚刚弹出的答案中所说的那样。

如果您想保存到文件中进行重播,我建议您查看movie函数(此处为教程)以及可能来自 MATLAB 文件交换的辅助mpgwrite工具。

于 2010-04-26T21:09:03.853 回答
2

如果您想要一种创建动画的简单方法,请查看文件交换中的ANYMATE。查看文件的帮助和示例,了解如何在图形中制作动画或创建动画 gif。

在本周的文件交换精选中查看 anymate 的评论

编辑

这是您如何使用 anymate 为@gnovice的示例中的椭球设置动画

%# create an sphere
[xs,ys,zs] = sphere; %# default is center at 0, radius 1
%# create an ellipsoid
[xe,ye,ze] = ellipsoid(0,0,0,4,1,1);

%# use anymate to interpolate between the two
anymate(@surf,{cat(3,xe,xs) cat(3,ye,ys) cat(3,ze,zs)});
%# color the surface
colormap(jet);
%# fix axes
axis equal

在图中,会有一个“电影”工具栏,您可以在其中点击“播放”并观看动画。或者您可以将其保存到文件中。

于 2010-04-26T21:20:29.763 回答
0

我想概述上面给出的 2 个实现之间的一个小区别:

1)暂停():

pause() 可用于数据很少的简单动画。这是我的首选方法,因为它简单明了。但是我只在动画需要很少数据的情况下使用暂停,因为 pause() 会在给定的时间内阻塞处理。

2)计时器:如果我想为频谱图或频谱设置动画并“实时”计算它们或将它们与音频同步,我通常使用计时器对象,它不会同时阻止处理。如果我对此类动画使用 pause(),音频和动画之间的同步会很快丢失......

于 2013-02-26T15:14:45.513 回答