お世話になっております。
現在私は、テンプレートクラスとして3次元のベクトルクラス(STLではなく、数学のベクトル)を作成しています。
そこで、皆様の意見を頂きたいと思いましたので投稿させていただきます。
この3次元ベクトルクラスは、メンバ関数としてベクトルの回転を含んでいます。
ですが、これは右手系と左手系では関数の内部が変わってしまいます。
従って、私は両方の系に対応するために、
1. 回転を含まない3次元ベクトルクラスから、右手系・左手系専用のベクトルクラスを作成する。
2. 3次元ベクトルクラスに左手系・右手系用のメンバ関数を両方とも作成する。
3. 回転というメンバ関数に、左手系か右手系かを表すフラグを引数に取らせて、関数内部でそれぞれの処理を行うようわける。
ということを考えました。
このクラスは何度も呼び出されるため、出来るだけ実行速度を速くしたいと考えています。
これ以外の方法でも構いませんので、どのような方法がよいか意見を頂けないでしょうか?
よろしくお願いします。
継承かメンバ関数か
Re:継承かメンバ関数か
本当に実行速度が大事ならば、3種類作ってみて、実行速度を比較してください。
私の予想だと有意な差は見られないと思います。
それと、回転が右手系・左手系を持つのでしょうか?
ベクトルが右手系・左手系を持つのでしょうか?
それとも、一連の計算が全て右手系(あるいは)左手系で行われるのでしょうか?
回転毎に右手系・左手系を定義するのではないならば、
「回転というメンバ関数に、左手系か右手系かを表すフラグを引数に取らせて」というのは、
設計的にどうかと思います。
ソースコードを見せてもらえれば、より具体的なアドバイスが増えると思いますよ。
私の予想だと有意な差は見られないと思います。
それと、回転が右手系・左手系を持つのでしょうか?
ベクトルが右手系・左手系を持つのでしょうか?
それとも、一連の計算が全て右手系(あるいは)左手系で行われるのでしょうか?
回転毎に右手系・左手系を定義するのではないならば、
「回転というメンバ関数に、左手系か右手系かを表すフラグを引数に取らせて」というのは、
設計的にどうかと思います。
ソースコードを見せてもらえれば、より具体的なアドバイスが増えると思いますよ。
Re:継承かメンバ関数か
補足
有意な差が無いだろうという予想の根拠ですが、
回転の計算に必要な浮動小数点数(整数かも)の演算に必要な処理時間と比較して、
系の判定に必要な処理時間は無視できると思われるからです。
あくまでも予想・憶測ですが。
有意な差が無いだろうという予想の根拠ですが、
回転の計算に必要な浮動小数点数(整数かも)の演算に必要な処理時間と比較して、
系の判定に必要な処理時間は無視できると思われるからです。
あくまでも予想・憶測ですが。
Re:継承かメンバ関数か
めるぽんさん、たいちうさん、たかぎさん返信ありがとうございます。
いろいろ考えた結果、2の方法で行うことにします。
さまざまなコメントをしていただきありがとうございます。
ところでたかぎさんのテンプレート引数による右手系・左手系の作成をする方法がいまだによくわからないので、このあたりをもう少し考えてみることにします。
Strategyパターンのことなのでしょうか?
いろいろ考えた結果、2の方法で行うことにします。
さまざまなコメントをしていただきありがとうございます。
ところでたかぎさんのテンプレート引数による右手系・左手系の作成をする方法がいまだによくわからないので、このあたりをもう少し考えてみることにします。
Strategyパターンのことなのでしょうか?
Re:継承かメンバ関数か
> ところでたかぎさんのテンプレート引数による右手系・左手系の作成をする方法がいまだによくわからないので、このあたりをもう少し考えてみることにします。
> Strategyパターンのことなのでしょうか?
Strategyパターンにできなくもないでしょうが、もっと単純な話です。
例えば、int func() という関数があった場合、
func<LH>() または func<RH>() のように、左手系か右手系かをテンプレート引数で与えればよいということです。
動的に左手系か右手系かを切り替えなければならないケースはそうないはずですので、これなら、どちらを選択するかはコンパイル時に決定され、(選択にかかる)実行時のコストはまったくありません。
> Strategyパターンのことなのでしょうか?
Strategyパターンにできなくもないでしょうが、もっと単純な話です。
例えば、int func() という関数があった場合、
func<LH>() または func<RH>() のように、左手系か右手系かをテンプレート引数で与えればよいということです。
動的に左手系か右手系かを切り替えなければならないケースはそうないはずですので、これなら、どちらを選択するかはコンパイル時に決定され、(選択にかかる)実行時のコストはまったくありません。
Re:継承かメンバ関数か
たかぎさん返信ありがとうございます。
テンプレート引数でコンパイル時に条件分岐するということですね。
この方法は試したことがないので試してみようかと思います。
貴重なコメントありがとうございました。
テンプレート引数でコンパイル時に条件分岐するということですね。
この方法は試したことがないので試してみようかと思います。
貴重なコメントありがとうございました。