表面のアニメーション化
以下の例では、表面をアニメーション化する方法を示します。具体的には、この例では球面調和関数をアニメーション化します。球面調和関数はフーリエ級数の球面バージョンであり、これを使用して地球自由振動をモデル化できます。
球面グリッドの定義
調和関数を計算するために、球面グリッド上に一連の点を定義します。
theta = 0:pi/40:pi; phi = 0:pi/20:2*pi; [phi,theta] = meshgrid(phi,theta);
球面調和関数の計算
半径 5 の球の表面上で、度数 6、次数 1、振幅 0.5 の球面調和関数を計算します。次に、値を直交座標に変換します。
degree = 6; order = 1; amplitude = 0.5; radius = 5; Ymn = legendre(degree,cos(theta(:,1))); Ymn = Ymn(order+1,:)'; yy = Ymn; for kk = 2: size(theta,1) yy = [yy Ymn]; end yy = yy.*cos(order*phi); order = max(max(abs(yy))); rho = radius + amplitude*yy/order; r = rho.*sin(theta); x = r.*cos(phi); y = r.*sin(phi); z = rho.*cos(theta);
球の表面での球面調和関数のプロット
関数 surf
を使用して、球の表面上に球面調和関数をプロットします。
figure s = surf(x,y,z); light lighting gouraud axis equal off view(40,30) camzoom(1.5)
表面のアニメーション化
表面をアニメーション化するには、for ループを使用してプロットのデータを変化させます。表面データを置き換えるには、表面の XData
、YData
、および ZData
プロパティを新しい値に設定します。アニメーションの速度を制御するには、表面データを更新した後に pause
を使用します。
scale = [linspace(0,1,20) linspace(1,-1,40)]; for ii = 1:length(scale) rho = radius + scale(ii)*amplitude*yy/order; r = rho.*sin(theta); x = r.*cos(phi); y = r.*sin(phi); z = rho.*cos(theta); s.XData = x; s.YData = y; s.ZData = z; pause(0.05) end