2016-08-17 5 views
1

1DのN点の動きをアニメーション化しました。問題は、以前のプロットを取り除き、動きで作成されたトラックを削除する方法を見つけることができないということです。Nポイントmatlabアニメーションのトラックを削除するには

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 

答えて

1

MATLAB手続きアニメーションのための一般的なガイドラインは次のとおりアニメーションループに可能な限りグラフィカルオブジェクトを作成または削除

避けます。あなたが最も可能性の高いアニメーションループでplotimagesurfまたはdeleteを呼び出す場合

したがって、あなたが最適にそれをやっていません。

ここで、アニメーションループの前にプロットを作成し、set(plot_handle、 'XData'、...)を使用してプロットポイントのx座標を更新することをお勧めします。

また、rand(1,1)をN回追加するのではなく、PointsPosにrand(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 
+0

あなたがそれを指摘いただきありがとうございます@EBHアニメーション – EBH

+0

としてこれを見たい場合は、ループ内で一時停止を置く必要があります。私はOPのコードで直接編集し、間違った「終わり」を削除しました。今修正されました。 –

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. 、ベクトル化を使用します一度にポイントのすべての位置(すなわち、すべてのPointsPosマトリックス)を計算するためにcumsumを使用します。
  2. 無関係な円をプロットする場合は、scatterを使用するのが適切です。
  3. pauseを任意の時間で使用する代わりに、drawnowを使用してプロットを更新できます。
関連する問題