matlab动态绘图Animation

主要是查看matlab帮助的Animation动画页面

1、函数

movie 播放录制的电影桢
getframe 将轴或图形捕获为影片帧
frame2im 返回与电影帧相关联的图像数据
im2frame 将图像转换为电影帧
animatedline 创建动画线
comet 二维彗星图
comet3 三维彗星图
drawnow 更新数据并处理回调
refreshdata 指定数据源后刷新图中的数据
Animated Line 线动画

2、官方例子

(1)画出sin(x)图像,并且追踪一个点

%%%创建sinx
x = linspace(0,10,1000); y = sin(x); plot(x,y) hold on p = plot(x(1),y(1),'o','MarkerFaceColor','red'); %标记第一个点,设置为红色 hold off axis manual %将轴限制模式设置为手动,以避免在整个动画循环中重新计算限制。

%%%使用drawnow动态画图
for k = 2:length(x) p.XData = x(k); p.YData = y(k); drawnow end

(2)画出sin(x)图像,追踪一个点,显示坐标变换

%%%画出sin(x)图像
x = linspace(-6,6,1000);
y = sin(x);
plot(x,y)
axis manual

%%%设置图片格式
ax = gca;
h = hgtransform('Parent',ax);
hold on
plot(x(1),y(1),'o','Parent',h);
hold off
t = text(x(1),y(1),num2str(y(1)),'Parent',h,...
    'VerticalAlignment','top','FontSize',14);


%%%使用drawnow动态画图
for k = 2:length(x)
    m = makehgtform('translate',x(k)-x(1),y(k)-y(1),0);
    h.Matrix = m;
    t.String = num2str(y(k));
    drawnow
end

  

  (3)这个例子展示了如何通过更新三角形的数据属性来让一个三角形在圆的内部循环。绘制圆并设置轴限制,以便在两个方向上的数据单位是相同的。

%%%绘制
theta = linspace(-pi,pi);
xc = cos(theta);
yc = -sin(theta);
plot(xc,yc);
axis equal


%%%动态显示
xt = [-1 0 1 -1];
yt = [0 0 0 0];
hold on
t = area(xt,yt); % initial flat triangle
hold off
for j = 1:length(theta)-10
    xt(2) = xc(j); % determine new vertex value
    yt(2) = yc(j);
    t.XData = xt; % update data properties
    t.YData = yt;
    drawnow limitrate % display updates
end

  

(4)这个例子展示了如何创建两条生长线的动画。animatedline函数可以帮助您优化行动画。它允许您在不重新定义现有点的情况下向行添加新点。

%创建两条不同颜色的动画线。 然后,将点添加到循环中的线上。 在循环之前设置轴极限,以免每次通过循环都重新计算极限。 添加新点后,请使用drawow或drawow limitrate命
%令在屏幕上显示更新。


a1 = animatedline('Color',[0 .7 .7]);
a2 = animatedline('Color',[0 .5 .5]);

axis([0 20 -1 1])
x = linspace(0,20,10000);
for k = 1:length(x);
    % first line
    xk = x(k);
    ysin = sin(xk);
    addpoints(a1,xk,ysin);

    % second line
    ycos = cos(xk);
    addpoints(a2,xk,ycos);

    % update screen
    drawnow limitrate
end

  

(5)这些示例展示了如何将动画记录为可以重放的电影

%在一个循环中创建一系列的情节,并将每个情节捕获为一个框架。通过每次在循环中设置轴限制,确保轴限制保持不变。将帧存储在M中。
for k = 1:16
	plot(fft(eye(k+16)))
	axis([-1 1 -1 1])
	M(k) = getframe;
end


%使用短片功能播放短片五次。
figure
movie(M,5)

%捕获电影的整个人物在图的左侧包括一个滑块。 通过将图形指定为getframe函数的输入参数来捕获整个图形窗口

figure
u = uicontrol('Style','slider','Position',[10 50 20 340],...
    'Min',1,'Max',16,'Value',1);
for k = 1:16
    plot(fft(eye(k+16)))
    axis([-1 1 -1 1])
    u.Value = k;
    M(k) = getframe(gcf);
end


%把电影回放五遍。电影在当前轴中回放。创建一个新的图形和一个轴来填充图形窗口,使电影看起来像原来的动画。
figure
axes('Position',[0 0 1 1])
movie(M,5)

(6)创建流粒子动画,流粒子动画对于可视化矢量场的流向和速度很有用。 “粒子”(由任何线标记表示)跟踪沿特定流线的流量。 动画中每个粒子的速度与沿流线任意给定点的矢量场的大小成比例。

%1.指定数据范围的起点
%本示例通过指定适当的起点来确定要绘制的体积区域。 在这种情况下,流图从x = 100开始,y在z = 5平面中跨越20到50,这不是完整的体积边界
load wind [sx sy sz] = meshgrid(100,20:2:50,5);
%2.创建流线以指示粒子路径 %本示例使用流线(stream3,streamline)跟踪动画粒子的路径,从而为动画添加了可视背景。 verts = stream3(x,y,z,u,v,w,sx,sy,sz); sl = streamline(verts); %3.定义视图 %尽管所有流线均始于z = 5平面,但某些流的值逐渐降低到较低的值。 以下设置提供了动画的清晰视图:选定的视点(视图)显示了包含最多流线的平面和螺旋线。 %选择[2 2 0.125]的数据纵横比(daspect)可在z方向上提供更高的分辨率,以使流粒子更容易在螺旋形中看到。设置轴限制以匹配数据限制(轴)并绘制轴框(框)。 view(-10.5,18) daspect([2 2 0.125]) axis tight; set(gca,'BoxStyle','full','Box','on')
%4.计算流粒子顶点 %确定沿流线绘制粒子的顶点。 interpstreamspeed函数根据流线顶点和矢量数据的速度返回此数据。 本示例将速度缩放0.05,以增加插值顶点的数量。
%将轴SortMethod属性设置为childorder,以便动画运行更快。 %streamparticles函数设置以下属性: %设置为10动画,以运行10次动画。启用“ ParticleAlignment”以一起开始所有粒子轨迹。将MarkerEdgeColor设置为none可仅绘制圆形标记的面。 当未绘制标记边缘时,动画通常运行得更快。 %MarkerFaceColor为红色。o的标记,绘制一个圆形标记。 您也可以使用其他线标记。 iverts = interpstreamspeed(x,y,z,u,v,w,verts,0.01); set(gca,'SortMethod','childorder'); streamparticles(iverts,15,... 'Animate',10,... 'ParticleAlignment','on',... 'MarkerEdgeColor','none',... 'MarkerFaceColor','red',... 'Marker','o');

  

原文地址:https://www.cnblogs.com/andrew-address/p/12790141.html