月(moon)の姿を描画するプログラム

 

コンピュータらしいプログラムというと、天文計算(予測)や
コンピュータグラフィックを連想する人が多いのではないかと思います。

毎度、管理人イガジーです。

そんな訳で、月の満ち欠けを表示するプログラムを作ってみましょう。
こんな↓感じのものです。
月の姿
月齢の求め方を解説しているサイトはいくつもありますが
その月齢に対応する「月の形」の描画方法は見つけられませんでした。
(と、言ってもそんなに大げさな処理ではありませんけれど。)
いつもは、整数処理ばかりなので、たまには浮動小数点(double)を使う
コードも書いてみたかった。というのもあります。

月齢は、新月を0としてそこからの経過日数を表したものです。
新月(朔)から新月(朔)までの平均日数は、29.53日なのだそうで
月齢14〜15あたりが満月になります。

Javaプログラミングで、年月日から月齢を求めるには、
Calendar.getTimeInMillis() を使うのが誤差が少なくて良いでしょう。

Apollonさんの 簡易月齢計算 の Moon Age6.1±0.6 を参考にさせて頂くと
(int)((((c.getTimeInMillis()/1000L)-929332980L)%2551442L)/8640L+adj);で、月齢を10倍した値が得られます(ここで、adj は補正値で 4L です)。

実際にいくつか計算させてみると分かりますが、時刻によっても
月齢は変わる(1時間あたり、約 1/24=0.042、3時間で0.126 増える)ので、
計算結果はあくまでも目安とするのが良いでしょう。

月の形の、光っている部分は、r*sin(θ)*cos(α)で求められます。
ここで、r は描画する月の半径、θは、月の緯度(北極が0で、赤道が
π/2)、αは、月齢に対応する月の位置(新月の時α=0で、満月の時
α=π)です。
三角関数(sin, cosなど)は Mathクラスにあり、static なのでいきなり
double x=Math.cos(alpha); の様に使うことができます。
以上のことを参考に作ってみてください。

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。