2016-07-04 14 views
0

私はMatlabで3Dヘリカルフラックスチューブをアニメーション化することを任されていましたが、その方法はわかりません。サーフプロットをアニメ化する

私が持っていた唯一のアニメーション体験は、9つの太陽系惑星軌道の2d軌道をプロットすることでした。私は以下のコードを使用しました(ここで、zは列x、y次のように、だから9つの惑星を表すために9回としてZ)

% 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') 

:)感謝です!

答えて

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) 

作成されたプロットの形式は変わりませんが、彼は軸を動かすので、それはあなたのサーフェス三角測量の様々な形のためにもそのように動作すると思います。

+0

申し訳ありませんが、フラックスチューブが時間の経過と共に成長していることを示すアニメーションが表示されているため、表面(基点)からの浮き上がりを示します –

+0

上記のことを実行すると、 pは定義されていません –

+0

申し訳ありませんが、私はatmにいるコンピュータにmatlabを持っていませんので、私はテストを行うことはできません、これをもう一度試してください...あなたは後で変数名を追加することができます(この質問はアニメーションの詳細です) – KiW

0

次のコマンドだけ

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

numel(p) 
% 1 

1つのsurfオブジェクトを作成し、それはあなたが望むなら、あなたは'{XData}'表記を使用する必要はありませんが、単なる'XData'ので、あなたは、そのエラーを取得しています

ただし、の場合オブジェクトを複数作成する場合は、ループ内で行うことをお勧めします。 あなたは好きなように更新する必要があります。

+0

これは間違いなく正常に実行されますが、私は以前に尋ねたことが間違っていたと思います。あなたの修正を使用すると、2次元のらせんの周りのフラックスチューブの構築が示されます。私が本当に望んでいたのは、もともと基点の円であったものを見せて、これを経て、フラックスチューブが時間の経過とともにどのようにねじれて上昇するかを見ることでした。それは意味がある場合? –

+0

@RThompsonあなたはいくつの 'surf'オブジェクトを作りたいと思っていましたか? – Suever

+0

ちょうど1つのヘリカルなフラックスチューブ、私は間違っていた場所を知っているかもしれないと思っています。コードを素早く読んでいます。 –

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 

を取得し、アニメーションは、時間を通してこの初期円上昇(およびねじれ)として形成チューブを示します。

以前の9個のオブジェクトではなく、1個のオブジェクトのサーフィンが必要なため、「XData」などの周りに{}は必要ありません。

この回答にお寄せいただきありがとうございます。

関連する問題