More than 3 years have passed since last update.
MATLAB で描いてみる「金星の薔薇」
はじめに
金星と地球の位置を定期的に結ぶと浮き上がってくる「金星の薔薇」、金星と地球は公転周期が 8:13 という関係あることから、一定時間毎に金星と地球の位置を線で結ぶと「五弁花」が描けるんだとか。この描画過程を MATLAB で再現してみます!
コードは GitHub: minoue-xx/The-Rose-of-Venus にあります。試してみたい方はどうぞ!
地球と金星を 4 日おきに 8 年間結線したものです。静止画であれば 260 文字程度で終わるんですが(参照:先日行われた MATLAB Mini Hack での投稿)アニメーションならではのポイントをお伝えできればと思います。
MATLABic ポイント
主な MATLAB のコツは以下の通り
- 極座標への変換
- オブジェクト位置関係の変更
- アニメーション作成
- 文字の挿入方法
使用環境
- MATLAB R2021b
まずは諸設定
地球・金星それぞれの軌道は円として、極座標で考えるとよさそうですね。Wikipedia を参考にするとそれぞれ
- 金星:平均公転半径 1.082 億 km 公転周期 224.7 日 (Wikipedia: 金星)
- 地球:平均公転半径 1.495 億 km 公転周期 365.2 日 (Wikipedia: 地球)
だそうな。
close all
clear
rhoE = 1.495;
rhoV = 1.082;
periodE = 365.2; % 364
periodV = 224.7; % 224
h_figure = figure;
h_axes = axes;
hold on;
まずは地球と金星の軌道から
簡単なところから。ここでは軌道は円と仮定します。座標は極座標系を用いて表現し、plot 関数で描くために pol2cart で変換します。
[xE,yE] = pol2cart(linspace(0,2*pi,100), rhoE);
[xV,yV] = pol2cart(linspace(0,2*pi,100), rhoV);
h1orbit = plot(xE,yE,xV,yV);
惑星も追加
軌道が綺麗な円には見えませんね。axis equal で縦と横の比率を 1:1 に設定し、さらに枠があると色気がないので axis off で消します。軌道と同じ色になるよう既定の色順を colors に確保しておき、1番目と2番目の色を使います。
colors = colororder;
hE_point = plot(rhoE,0,'o',MarkerFaceColor = colors(1,:));
hV_point = plot(rhoV,0,'o',MarkerFaceColor = colors(2,:));
axis off equal
annotation('textarrow',[0.8732 0.7536],[0.7942 0.5357],'String','金星')
annotation('textarrow',[0.9125 0.8375],[0.6657 0.5333],'String','地球')
それぞれの点(惑星)は後で動かすのでハンドルを変数(hE_point, hV_point)として確保しておきますね。ここまでの処理は繰り返し使いたいので
[hE_point, hV_point] = drawOrbits(rhoE, rhoV)
としてまとめておきます。ページ下部参照。
文字と矢印の挿入
上のコードでは annotation を使っていますが、この位置設定が地味に面倒くさい。ここは Live Editor の機能を使って楽します。こんな感じ。間違って火星って入れちゃってますけどね。
地球と金星を結ぶ
4 日置きに、地球と金星を結ぶ線を追加してみることにします。まずは一日当たりの回転角度を定義。
dthetaE = 2*pi/periodE;
dthetaV = 2*pi/periodV;
4日置きに、というところは mod(ii,4) == 0 という条件を満たす時に plot で追加。
if mod(ii,4) == 0
plot([xE xV],[yE yV], LineStyle="-", Color=[0.8 0.8 0.8]);
end
地球と金星(hE_point/hV_point)の座標が変わるたびに改めて plot してもできますが、効率よくいくならそれぞれの XData/YData プロパティを直接編集してやるのがおススメです。pol2cart で極座標系から変換して XData/YData に代入します。
hE_point.XData = xE;
hE_point.YData = yE;
for ループの毎ステップきちんと絵を描くには drawnow を忘れずに。とりあえず 2 年回してみます。
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme
