Main Content

表面のアニメーション化

以下の例では、表面をアニメーション化する方法を示します。具体的には、この例では球面調和関数をアニメーション化します。球面調和関数はフーリエ級数の球面バージョンであり、これを使用して地球自由振動をモデル化できます。

球面グリッドの定義

調和関数を計算するために、球面グリッド上に一連の点を定義します。

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 ループを使用してプロットのデータを変化させます。表面データを置き換えるには、表面の XDataYData、および 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

参考

|