如何删除N点matlab动画的轨迹

时间:2016-08-17 18:32:21

标签: matlab animation plot matlab-figure

我在1D中动画了N点的运动。问题是我无法找到摆脱之前情节的方法并删除动画中创建的曲目。

function sol=Draw(N)
    %N is the number of points
    PointsPos=1:N
    for s=1:1000
        for i=1:N
            PointsPos(i)=PointsPos(i)+ rand(1,1)
            %The position of the point is increased.
        end
        for i=1:N
            %loop to draw the points after changing their positions
            hold on
            plot(PointsPos,1,'.')
        end
        pause(0.005) 
        %here I want to delete the plots of the previous frame s
    end     
    end

2 个答案:

答案 0 :(得分:1)

MATLAB程序动画的一般准则是:

  

避免在动画循环中尽可能多地创建或删除图形对象。

因此,如果您在动画循环中调用plot image surfdelete,那么很可能您没有以最佳方式执行此操作。

这里,最佳做法是在动画循环之前创建绘图,然后使用set(plot_handle,' XData',...)来更新绘图点的x坐标。

此外,您应该将兰特(1,N)添加到PointsPos,而不是添加兰特(1,1)N次。

因此,您的代码看起来应该与以下内容类似:

function sol=Draw(N)
    PointsPos=1:N
    h = plot(PointsPos, ones(1, N), '.');
    for s=1:1000
        PointsPos=PointsPos+ rand(1,N)
        set(h, 'XData', PointsPos);

        pause(0.005) 
    end
end 

答案 1 :(得分:0)

如果我了解你的目标,那么这应该做你想要的:

function sol = Draw(N)
steps = 1000;
% N is the number of points
PointsPos = cumsum([1:N; rand(steps-1,N)],1);
p = scatter(PointsPos(1,:),ones(N,1),[],(1:N).');
colormap lines
for s = 2:steps
    p.XData = PointsPos(s,:);
    drawnow
end
end

请注意:

  1. 无需计算循环内的任何内容,使用向量化和cumsum一次计算点的所有位置(即所有PointsPos矩阵)。
  2. 为了绘制不相关的圈子,scatter将是更好的选择。
  3. 您可以使用drawnow更新您的情节,而不是在任意时间内使用pause