用Matlab/Octave如何制作动态图或轨迹动画?

5
我正在尝试使用Matlab/Octave来制作这个螺旋动画,我想让它向上或向下螺旋。
t = 0:0.1:10*pi;
r = linspace (0, 1, numel (t));
z = linspace (0, 1, numel (t));
plot3 (r.*sin(t), r.*cos(t), z);

螺旋

我尝试使用for循环来制作动画,但这只会给我一个锥形。请参见下面的代码和图像。

clear all, clc,clf,tic
t = 0:0.1:10*pi;
r = linspace (0, 1, numel (t));
z = linspace (0, 1, numel (t));

for ii=1:length(r)
    ii
    plot3 (r.*sin(t(ii)), r.*cos(t(ii)), z);
    hold on
    %pause (.00001)
end

图片 在此输入图片描述

1
请查看这个回答:http://stackoverflow.com/questions/16426378/how-to-animate-this-3d-plot-in-matlab/16426623#16426623 - David K
4个回答

4
你也可以使用comet3()包,它可以通过绘图来动态显示轨迹:
delay = 0.001  % seconds
figure
comet3(r.*sin(t), r.*cos(t), z, delay);

这个动画呈现了一个连续的轨迹,相较于离散的星号序列更为优秀。
唯一的缺点是,无论你使用多少延迟,Octave 3.6.4附带的cometcomet3版本速度都很慢。但可以通过使用andyras在此SO问题中提供的技巧来克服这个问题:
% plot the first point to get started
h = plot3(x(1),y(1),z(1),"b");
axis([min(x), max(x), min(y), max(y), min(z), max(z)]);

% refresh the plot in a loop through the rest of the data
for k = 1:length(z);
   set(h, 'XData', x(1:k));
   set(h, 'YData', y(1:k));
   set(h, 'ZData', z(1:k));
   pause (0.001); % delay in seconds
       % alternatively could provide a velocity function
       % pause(sqrt(vx(k)^2+vy(k)^2+vz(k)^2));  
endfor
小提示: 修改函数后,您需要强制Octave重新加载它,因为默认情况下它不会这样做。 您可以重新启动,或者更好的方法是使用clear cometclear comet3。 然后,下次调用这些函数时,它们的定义将被刷新。

2
以下内容看起来在Octave 3.6.2中可行。
t = 0:0.1:10*pi;
r = linspace (0, 1, numel (t));
z = linspace (0, 1, numel (t));

figure
axis([-1 1 -1 1 0 1])
hold on

for ii=1:length(r)
    plot3 (r(ii)*sin(t(ii)), r(ii)*cos(t(ii)), z(ii),'*');
    pause (.001)
end

1
这很好,但它并没有提供一个轨迹,只有一系列点。请参见 https://dev59.com/Q3LYa4cB1Zd3GeqPUCjz#17773313 以了解动画轨迹的解决方案。 - Assad Ebrahim

1
当然不是最好看的,但这些是您需要对代码进行的第一次更改,以使其尽可能接近您想要的效果。
t = 0:0.1:10*pi;
z = linspace (1, 0, numel (t));
for ii=1:length(t)
    plot3 (z(ii)*sin(t(ii)),z(ii)*cos(t(ii)), z(ii));
    hold on
    pause (.00001)
end

Davin 这只是给了我一个错误信息:"第 0 行:所有边界未定义或超出范围,因此没有绘图。" - Rick T
@RickT,我以前从未使用过Octave,在Matlab上执行它,可能是兼容性/版本问题。您可以尝试添加clear ...行,或将plot3替换为scatter3,也许会有所帮助。如果不行,我就没有更多的想法了。 - davin

0

这不是轨迹解决方案,但这里有一个旋转的龙卷风。

phi = linspace(0, 10*pi, 300);
r = linspace (0, 1, 300);
z = linspace (0, 1, 300);
s = 100; %speed of turning
for t = 0:0.01:10 %t is time
  plot3 (r.*sin(phi+t*s), r.*cos(phi+t*s), z);
  pause(0.01)
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接