2

2つの楕円体のアニメーションを作成するこのコードを作成しました。

これらの楕円体のパラメータk1は時間に依存する必要があります(したがって、非同期に移動します)が、1つの図でアニメーション化する必要があります。ループを使用できますか、それともタイマーとある種のコールバック関数を使用する方が良いですか?

2番目の問題-内側の楕円体を移動して、共通の側面が1つになるようにする必要があります。これどうやってするの?

4

3 に答える 3

1

ループを使用する必要があります。ほとんどの時間は、プロットと「getFrame」コマンドに費やされます。使用できます

プロフィール
これを確認します。for ループは大きなオーバーヘッドを追加せず、コーディングと理解が最も簡単です。


2番目の質問については、あなたが何を求めているのか正確にはわかりませんが、共通点を維持したい場合は、半径、傾斜角度など、および共通点に関してサーフェスをパラメータ化する必要があります.次に、ポイントを移動します。コードを簡素化して明確にする「drawEllipsoid」関数を作成することを検討してください。

于 2010-05-04T12:49:53.717 に答える
0

OK、これが以前のコメントで述べたトリミングされたサーフェスを実行するためのショートカットです。これから行うことは、サーフェスがドメインの外側にあるすべての座標にNaNを配置することです。次に、サーフェスオブジェクトは、それらの座標に接触するすべての四角形をドロップします。それはあなたに良いきれいなエッジを与えませんが、それは本当に簡単です。

a=5;
b=a;
c=10;
u = (0:0.05*pi:pi)'; %'
v = [0:0.05*pi:2*pi];
X = a*sin(u)*cos(v);
Y = a*sin(u)*sin(v);
Z = c*cos(u)*ones(size(v));
Z(Z>0)=0; % cut upper
V1=4/3*pi*a*b*c;
d=1/2;
e=2^d;
a2=a/e;
b2=a/e;
c2=c;
V2=4/3*pi*a2*b2*c2;
X2 = a2*sin(u)*cos(v);%-2.5;
Y2 = b2*sin(u)*sin(v);
Z2 = c2*cos(u)*ones(size(v));%+0.25;
Z2(Z2>0)=0; % cut
h=1/3;

hS1=surf(X,Y,Z);
alpha(.11)
hold on
hS2=surf(X2,Y2,Z2);
hold off
axis([-20 20 -20 20 -20 20]);

for j = 1:20
  k1=(sin(pi*j/20)+0.5)^h;
  a=a*k1;
  c=c*k1;
  X = a*sin(u)*cos(v);
  Y = a*sin(u)*sin(v);
  Z = c*cos(u)*ones(size(v));
  Z(Z>0)=0;
  a2=a2*k1;
  b2=a2*k1;
  c2=c2*k1;
  X2 = a2*sin(u)*cos(v)+5;%-2.5;
  Y2 = b2*sin(u)*sin(v);
  Z2 = c2*cos(u)*ones(size(v));%+0.25;
  Z2(Z2>0)=0;

  set(hS1,'XData',X,'YData',Y,'ZData',Z);

  % substitute into implicit form of 1st ellipsoid
  d = (X2.^2) / a^2 + (Y2.^2) / a^2 + (Z2.^2) / c^2;
  % and zap any that are outside [0 1]
  X2(d>1) = nan;
  Y2(d>1) = nan;
  Z2(d>1) = nan;
  set(hS2,'XData',X2,'YData',Y2,'ZData',Z2);
  drawnow;
  F(j) = getframe;
end
movie(F,4)

uの範囲も変更したことに注意してください。これは、実際にサーフェスのコピーを2つ描画していたためです。そのため、透明度のレンダリング方法に問題が発生していました。

于 2010-05-10T14:38:08.957 に答える
0

この仕事にはループは問題ないようです。タイマーも同様に機能します。

「共通点が1つある」というのがどういう意味なのかよくわかりません。X2 に 5 を追加することに近づいているように見えますが、同じ形状ではないため、スケーリング項が必要になります。詳しく教えていただけますか?

ただし、1つの提案。次のようにオブジェクトの作成をループの外に移動すると、もっと幸せになると思います。

a=5;
b=a;
c=10;
u = (0:0.05*pi:2*pi)'; %'
v = [0:0.05*pi:2*pi];
X = a*sin(u)*cos(v);
Y = a*sin(u)*sin(v);
Z = c*cos(u)*ones(size(v));
Z(Z>0)=0; % cut upper
V1=4/3*pi*a*b*c;
d=1/2;
e=2^d;
a2=a/e;
b2=a/e;
c2=c;
V2=4/3*pi*a2*b2*c2;
X2 = a2*sin(u)*cos(v);%-2.5;
Y2 = b2*sin(u)*sin(v);
Z2 = c2*cos(u)*ones(size(v));%+0.25;
Z2(Z2>0)=0; % cut
h=1/3;

hS1=surf(X,Y,Z);
alpha(.11)
hold on
hS2=surf(X2,Y2,Z2);
hold off
axis([-20 20 -20 20 -20 20]);

for j = 1:20
    k1=(sin(pi*j/20)+0.5)^h;
    a=a*k1;
    c=c*k1;
    X = a*sin(u)*cos(v);
    Y = a*sin(u)*sin(v);
    Z = c*cos(u)*ones(size(v));
    Z(Z>0)=0;
    a2=a2*k1;
    b2=a2*k1;
    c2=c2*k1;
    X2 = a2*sin(u)*cos(v)+5;%-2.5;
    Y2 = b2*sin(u)*sin(v);
    Z2 = c2*cos(u)*ones(size(v));%+0.25;
    Z2(Z2>0)=0;

    set(hS1,'XData',X,'YData',Y,'ZData',Z);
    set(hS2,'XData',X2,'YData',Y2,'ZData',Z2);
    drawnow;
    F(j) = getframe;
end
movie(F,4)

drawow は getframe に含まれているため、ここでは厳密には必要ありませんが、getframe を削除した場合に何が起こっているかを確認できるように、挿入しておくとよいでしょう。

于 2010-05-04T14:29:06.830 に答える