2つの楕円体のアニメーションを作成するこのコードを作成しました。
これらの楕円体のパラメータk1は時間に依存する必要があります(したがって、非同期に移動します)が、1つの図でアニメーション化する必要があります。ループを使用できますか、それともタイマーとある種のコールバック関数を使用する方が良いですか?
2番目の問題-内側の楕円体を移動して、共通の側面が1つになるようにする必要があります。これどうやってするの?
3 に答える
ループを使用する必要があります。ほとんどの時間は、プロットと「getFrame」コマンドに費やされます。使用できます
プロフィールこれを確認します。for ループは大きなオーバーヘッドを追加せず、コーディングと理解が最も簡単です。
2番目の質問については、あなたが何を求めているのか正確にはわかりませんが、共通点を維持したい場合は、半径、傾斜角度など、および共通点に関してサーフェスをパラメータ化する必要があります.次に、ポイントを移動します。コードを簡素化して明確にする「drawEllipsoid」関数を作成することを検討してください。
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つ描画していたためです。そのため、透明度のレンダリング方法に問題が発生していました。
この仕事にはループは問題ないようです。タイマーも同様に機能します。
「共通点が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 を削除した場合に何が起こっているかを確認できるように、挿入しておくとよいでしょう。