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だと、アニメーションも簡単です。たまには難しい数式は忘れて、色々描いて遊んでみませんか?(-.-)
それでは、よいお年をお迎えください!
タイトル画像モデル:綾夏
この記事が気に入ったらサポートをしてみませんか?