VOOZH about

URL: https://qiita.com/eigs/items/85c9b6d2899a08f0813e

⇱ MATLAB で描いてみる「金星の薔薇」 #MATLAB - Qiita


👁 Image
22

Go to list of users who liked

5

Share on X(Twitter)

Share on Facebook

Add to Hatena Bookmark

More than 3 years have passed since last update.

@eigs(michio)

MATLAB で描いてみる「金星の薔薇」

22
Last updated at Posted at 2021-11-25

はじめに

金星と地球の位置を定期的に結ぶと浮き上がってくる「金星の薔薇」、金星と地球は公転周期が 8:13 という関係あることから、一定時間毎に金星と地球の位置を線で結ぶと「五弁花」が描けるんだとか。この描画過程を MATLAB で再現してみます!

👁 image_0.png

コードは GitHub: minoue-xx/The-Rose-of-Venus にあります。試してみたい方はどうぞ!

地球と金星を 4 日おきに 8 年間結線したものです。静止画であれば 260 文字程度で終わるんですが(参照:先日行われた MATLAB Mini Hack での投稿)アニメーションならではのポイントをお伝えできればと思います。

MATLABic ポイント

主な MATLAB のコツは以下の通り

  • 極座標への変換
  • オブジェクト位置関係の変更
  • アニメーション作成
  • 文字の挿入方法

使用環境

  • MATLAB R2021b

まずは諸設定

地球・金星それぞれの軌道は円として、極座標で考えるとよさそうですね。Wikipedia を参考にするとそれぞれ

だそうな。

Code
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 で変換します。

Code
[xE,yE] = pol2cart(linspace(0,2*pi,100), rhoE);
[xV,yV] = pol2cart(linspace(0,2*pi,100), rhoV);
h1orbit = plot(xE,yE,xV,yV);

👁 figure_0.png

惑星も追加

軌道が綺麗な円には見えませんね。axis equal で縦と横の比率を 1:1 に設定し、さらに枠があると色気がないので axis off で消します。軌道と同じ色になるよう既定の色順を colors に確保しておき、1番目と2番目の色を使います。

Code
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','地球')

👁 figure_1.png

それぞれの点(惑星)は後で動かすのでハンドルを変数(hE_point, hV_point)として確保しておきますね。ここまでの処理は繰り返し使いたいので

Code(Display)
[hE_point, hV_point] = drawOrbits(rhoE, rhoV)

としてまとめておきます。ページ下部参照。

文字と矢印の挿入

上のコードでは annotation を使っていますが、この位置設定が地味に面倒くさい。ここは Live Editor の機能を使って楽します。こんな感じ。間違って火星って入れちゃってますけどね。

👁 AnnitationLiveeditor.gif

地球と金星を結ぶ

4 日置きに、地球と金星を結ぶ線を追加してみることにします。まずは一日当たりの回転角度を定義。

Code(Display)
dthetaE = 2*pi/periodE;
dthetaV = 2*pi/periodV;

4日置きに、というところは mod(ii,4) == 0 という条件を満たす時に plot で追加。

Code(Display)
 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 に代入します。

Code(Display)
 hE_point.XData = xE;
 hE_point.YData = yE;

for ループの毎ステップきちんと絵を描くには drawnow を忘れずに。とりあえず 2 年回してみます。

22

Go to list of users who liked

5
0

Go to list of comments

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22

Go to list of users who liked

5