动画冲浪地块

时间:2016-07-04 13:12:17

标签: matlab animation matlab-figure

我的任务是在Matlab中制作一个3d螺旋磁通管动画,我不知道该怎么做。

我唯一拥有的动画体验是用于绘制9个太阳系行星轨道的2d轨迹,我使用下面的代码(其中z是27列矩阵,其列按照x序列排序, y,z代表9个行星的9倍)

% Plot 9 empty plots
p = plot3(nan(9), nan(9), nan(9));

for k = 1:size(z, 1)
    % Update all of the plot objects at once
    set(p, {'XData'}, num2cell(z(1:k, 1:3:25), 1).', ...
           {'YData'}, num2cell(z(1:k, 2:3:26), 1).', ...
           {'ZData'}, num2cell(z(1:k, 3:3:27), 1).')
    drawnow
end

所以,直觉上,我已经尝试将其调整为我所具有的螺旋通量管如下(其中x,y和z是21 x 301矩阵,因此我假设在每个时间步骤我必须冲浪行x,y和z因此达到所需的时间步长):

p = surf(nan(21,301), nan(21,301), nan(21,301));

for k = 1:size(x,1)
    % Update all of the plot objects at once
    set(p, {'XData'}, num2cell(x(1:k, :), [1 301]), ...
           {'YData'}, num2cell(y(1:k, :), [1 301]), ...
           {'ZData'}, num2cell(z(1:k, :), [1 301]))
    drawnow
end

然而,这样做我不断收到错误

Error using matlab.graphics.chart.primitive.Surface/set
Size mismatch in Param Cell / Value Cell pair.

我知道我可能在某个地方犯了一个愚蠢的错误,但任何人都可以帮忙吗?或者,如果我完全采用这种方式,任何人都可以通过错误的方式让我知道吗?!

(NB如果有帮助,在原始脚本中绘制螺旋通量管,代码为:)

surf(x,y,z,'facecolor', Colour, 'edgecolor',EdgeColour,...
    'facelighting','gouraud')

谢谢!

3 个答案:

答案 0 :(得分:0)

我不是100%确定我得到你想要的东西,但你可以尝试:

for k = 1:size(x,1)
    surf(num2cell(x(1:k, :) ,num2cell(y(1:k, :), num2cell(z(1:k, :);
    M(i)=getframe;
end

然后通过以下方式将其显示为电影:

numberofrepitions=3 % as often as you want to have it play in a row
movie(M,numberofrepetitions)

可能更容易在某些随机数据上显示,因为您没有提供任何数据:

x=[1 2 3; 2 3 4; 3 4 5];
y=[19 17 15; 13 11 9; 7 5 3];
z=[1 1 2; 2 1 1; 3 3 3];

for i=1:10
    surf(x,y,z);

    M(i)=getframe;
    x=x+10;
    y=y+20;
    z=z+25;
end 
movie(M,3)

创建的绘图的形式没有改变,但你可以看到轴移动,所以我想它也可以用于表面三角测量的不同形式。

答案 1 :(得分:0)

您收到该错误,因为以下命令仅创建一个surf对象

p = surf(nan(21,301), nan(21,301), nan(21,301));

numel(p)
%   1

如果这是您想要的,那么您不想使用'{XData}'符号,而只需使用普通'XData'等。

但是,如果执行想要创建多个surf对象,则需要在循环内执行此操作。 然后您应该能够按照自己喜欢的方式更新它们。

答案 2 :(得分:0)

此代码获得了所需的动画

p = surf(nan(21,301), nan(21,301), nan(21,301));

 for k = 1:301
     % Update all of the plot objects at once
     set(p, 'XData', x(:, 1:k), ...
            'YData', y(:, 1:k), ...
            'ZData', z(:, 1:k))

        drawnow
 end

因此,从基点的初始圆圈开始,动画显示随着时间的推移,这个初始圆圈上升(并扭曲)时形成的管道。

我们不再需要围绕'XData'等的{},因为我们只需要一个对象的冲浪,而不是之前的9个。

感谢您获得此答案的所有帮助!