• ベストアンサー

天文計算と、オブジェクト指向

趣味で天文計算をしたい、まずは入門用に人工衛星の軌道を計算したい.その際オブジェクトをどうやって設計したらよいか迷ってます. 衛星は典型的な6軌道要素(NASA TLE)を用います. C、他ですとそう迷いませんがオブジェクトには余り慣れていないのでどなたか助け船を~よろしくお願いします.

質問者が選んだベストアンサー

  • ベストアンサー
  • mydummy
  • ベストアンサー率59% (55/92)
回答No.2

人工衛星の計算では要素は基本は3つだけで、軌道ごとの初期状態の変数、それをセットする関数、現在時刻の位置を返す関数、この3つだけでしょう。あとはGUIを操作する関数を付け加えるだけですね。あえてオブジェクト指向を使う面白みは少ないかもしれません。 私自身はC++を使っていますが、日曜プログラマには適さない言語だと思います。強力ですが飼いならすのは面倒です。組み込み用途に使うとかC++自体に興味があるのでなければ選択肢からは外せると思います。 Javaは便利ですがかゆいところに手が届かないのと、GUIがやや弱いのが難ですね。普及度が高いのがいいところです。ネットに繋ぐのも簡単です。 C#はJavaをWindows GUIになじませてかゆいところを改善したような言語です。VBやC++/CLIと互換性があったり、SilverlightというMSが出す予定のFlashみたいなウェブアプリに移植できる予定であるなど、日曜プログラマであれば楽に使えるのではないかと思います。 個人的にはD言語という新しい言語を盛り上げたいのですが、環境が未整備なので初心者には向かないかもしれません。プログラミングに慣れているなら使うのは簡単です。 C++以外はforeach構文などC言語以外に由来する要素がいろいろあって面白いので、組み込みや時間クリティカル業務で使うのでなければ試してみてはいかがでしょうか。

_cosmic_
質問者

お礼

ありがとうございます。 そうですね、両氏の話を聞いて少し楽になりました。いうところのオブジェクト指向のうま味を生かす場面は少なそうです。 最近とにかく私的に某言語のオブジェクトがどうのこうの~とか言っていたから、あれはどうする?これはどうしよう?と言うようなループに陥っていた可能性アリです。 C++、実は少しだけ使った事は有るけどそれだけでは到底遠いなという感じでした、便利だけど、多分その便利さも難しいですね(言語の仕様もですが)あ、本も持ってないや、だめじゃん…。 >MSが出す予定のFlashみたいな C#は面白そうですね!どう展開されるかも面白そうです 天文は完全に趣味です、時間はあります、納期も無い!が為に全然完成しないのも困っちゃうけど^^(←ありがち

その他の回答 (1)

  • mydummy
  • ベストアンサー率59% (55/92)
回答No.1

人工衛星のように制御されていて解析的に位置が決まるものであればオブジェクト指向を使う意味はあまりない気もします。Cの構造体で十分です。便利なのはプロパティに関数が使えることくらいですかね。原始太陽系での微惑星の衝突といった多体問題を扱うには適していると思いますが。 オブジェクト指向に限りませんが、「最終的に欲しい情報」が何かを決めて、それを求めるのに必要な演算を関数に書き込んでいくことになるかと思います。 オブジェクト指向が生きてくるのは、 * 多態 計算方法は違うけど意味しているものは同じとき、同じ名前が使える。例えば静止軌道と極軌道それぞれの衛星の現在位置が欲しいとき、 interface Orbit { Point currentPosition(); } //抽象的な名前 class GSO : Orbit { Point currentPosition(); } //静止軌道の具体的計算つき class PEO : Orbit { Point currentPosition(); } //極軌道の具体的計算つき と定義しておくと、 Orbit satellites[2] = { new GSO(), new PEO() }; foreach(sat ; satellites) { printf(sat.currentPosition()); } と実際の計算が違っても同じ名前で扱うことが出来ます。 * カプセル化 あるオブジェクト(例えば衛星)の状態を示す変数の中に、他のオブジェクトから操作されると計算が狂うので隠したいものを、protectedなメンバにすることで隠す * クラスの継承 中身の大半が同じカスタムバージョンを作りたいときに、継承して作ると偏向部分だけ変えられて便利です。 最終的にどういうものを作りたいかで決まってくると思いますが、言語は何を使われますか? まあいろいろあると思いますが、WindowsユーザかLinuxでMonoを導入できる知識があるなら、趣味の範囲内ならC#あたりが適しているかと思います。

_cosmic_
質問者

お礼

丁寧なご助言感謝します! ターゲット・プラットホームはWindowsでC++にて考えています、まずはwin32コンソールで後にGUIへと移行します 概要は ・TLE軌道要素を使った入門的な物 ・最終的にはGUIにて地図も表示しリアルタイムで衛星直下点と観測位置での視位置の表示…など、簡易版Orbitronライクな物が出来ればと思ってます オブジェクト指向を使おうと思った理由は以下の感じになります ・オブジェクト指向を練習理解する為 ・将来主にJavaへの移植も考えて ・(WinGUIは自作のクラスのストックが少しあるので流用も) 以下余り自信なしの理由ですが ・マルチ・スレッド化が容易になるのではないか?(後述) という感じです。おっしゃる通り多体問題を扱うにはオブジェクト指向にはスレッドも含め都合が良さそうなのは直感的に感じます、が、それほどの事はまだ出来ず伝統的な軌道要素(TLE)にて作りたいと思ってます。現代のPCならかなりの数の衛星をリアルタイムで追従できる計算能力は持ってますので、あえてマルチスレッドしなくても…というツッコミは無しでねがいます^^; 一番まごついてしまったのは、衛星の位置を推算するには、変数は色々ありますが、最終的に引数としては”時刻”これのみですからメソッドはどういう風になるのか?やっぱCか?いやオブジェクトに出来るだろ?みたいな感じに成ってしまいまして。 長くなりましたが解答ありがとうございました。

関連するQ&A