見出し画像

Hyperboloid Shower ~ 直線が曲面を作る ~ MATLABで双曲面アニメーション

・前書き

突然ですが、双曲面は直線で作れます。

Twitterで、「スクリュー付きシャワーの水の軌跡が双曲面になる」という話題がありました。

子供の頃、ヒモか細い竹?を張った太鼓みたいのをネジって遊んだ覚えがあります。

・直線をねじる

早速、MATLABでやってみましょう。
直線を3Dプロットして、終点の角度を変えるだけで良いですね。

直線をねじる

直線をねじるだけで双曲面となるのがお分かりになるかと思います。

・スクリュー回転

これだけではなんなので、水を出してスクリューが回転して段々ねじれてくる感じをシミュレーションしてみましょう。物理シミュレーションは一切なしです。(^-^;

スクリュー回転

・MATLABスクリプト

スクリプト的には、「Christmas Tree Illusion」のを簡素化してちょっと変えただけです。

we = false;  % file write enable
N = 80;
filename = ['Hyperboloid_Shower_' num2str(N) '.gif']
close all
f = figure(1);
f.Color = [1 1 1];
% f.Visible = 'on';
f.Position(2) = f.Position(2) - f.Position(4);
f.Position(4) = f.Position(4) * 2;

dAz = pi/80;
maxAz = 2*pi/N * 10;

w = 30 * 1.5;
edth = 2/4*pi;
st = true;  % 1st frame
for off = [0:dAz:maxAz*2 maxAz*2:-dAz:0]
    if off <= maxAz
        dAz = off/maxAz;
        z = dAz;
    else
        dAz = 1-max((off-maxAz*1.5),0)/maxAz;
        z = 1;
    end
    for n=1:3
        for l=1:N
            th = off + l*2*pi/N;
            r = 10*n;
            x1 = r * cos(th);
            y1 = r * sin(th);
            x2 = r * cos(th+edth*dAz);
            y2 = r * sin(th+edth*dAz);
            p = plot3([x1 x2],[y1 y2],[0 z],'b-.');
            if (n==1 && l==1)
                hold on
            end
        end
    end
    hold off
    axis off
    xlim([-w w])
    ylim([-w w])
    zlim([0 1])
    
    drawnow

    if we
        frame = getframe(gca);  % take image only
        gr = frame2im(frame);
        [bA,map] = rgb2ind(gr,256);
        if (st)
            imwrite(bA,map,filename,'gif','LoopCount',Inf,'DelayTime',1/20);
            st = false;
        else
            imwrite(bA,map,filename,'gif','WriteMode','append','DelayTime',1/20);
        end
    end

end


Christmas Tree Illusion」でも書きましたが、ライブスクリプトにするとあとから実行結果を再生スピードを変えて再生・巻き戻しもできます。

ライブエディター画面

ライブスクリプトを新規作成して、上のコードをコピペするだけでOKです。we や N に「コントロール」を追加すれば簡単GUIになり、それを操作すると自動的に更新実行されます。


振幅比率や位相比率を変えるとさらに色々変化します。

MATLAB/Simulinkで動画Picture In Picture」で PIP位置を動かすのにも使いましたが、位相に比率を付けるとリサージュ図形という複雑な形になります。

-振幅比率を付けた例

N=100;

x2 = r * off*dAz*5*cos(th+edth*dAz);
y2 = r * off*dAz*6*sin(th+edth*dAz);
p = plot3([x1 x2],[y1 y2],[0 z],color=hsv2rgb([l/N n/3*0.5+0.5 z*0.8+0.2]));
振幅比率

-リサージュの例

N=100;

x2 = r * cos(th*dAz);
y2 = r * sin(1.2*th*dAz);
p = plot3([x1 x2],[y1 y2],[0 z],color=hsv2rgb([l/N n/3*0.5+0.5 z*0.8+0.2]));
リサージュ応用


こういった図形は、sin/cos さえ分かれば描けます。

MATLABだと、アニメーションも簡単です。たまには難しい数式は忘れて、色々描いて遊んでみませんか?(-.-)

それでは、よいお年をお迎えください!

タイトル画像モデル:綾夏

この記事が参加している募集

つくってみた

やってみた

この記事が気に入ったらサポートをしてみませんか?