三次元ベクトルを扱っていると外積やら内積やら単位化やら必要に
なってきますよね?
自分だったらベクトルクラス作って、メソッドにそれらを実装します。
外積や内積や単位化は、ベクトルの為の関数なので、ベクトルクラスに
責任持ってもらうのが筋だと思いませんか?
ですが、訳あって関数で必要になりそうなので、切り出したのですが
今まで気が付きませんでした・・・。
内積と長さを求める関数です。
'三次元ベクトルの内積 'param: vec1_array(double)-ベクトル 'param: vec2_array(double)-ベクトル 'return: スカラー Private Function dot_3d( _ ByVal vec1 As Variant, _ ByVal vec2 As Valiant) As Double dot_3d = _ vec1(0) * vec2(0) + _ vec1(1) * vec2(1) + _ vec1(2) * vec2(2) End Function '三次元ベクトルの長さ 'param: vec_array(double)-ベクトル 'return: 長さ Private Function get_length_3d( _ ByVal vec As Variant) As Double get_length_3d = Sqr( _ vec(0) * vec(0) + _ vec(1) * vec(1) + _ vec(2) * vec(2) _ ) End Function
長さの計算の際に二乗で計算させると気が付きにくいのですが
長さの計算式って、自身同士の内積の平方根なんですね。
だからこんな風に関数を作っても良さそう。
'三次元ベクトルの長さ 'param: vec_array(double)-ベクトル 'return: 長さ Private Function get_length_3d( _ ByVal vec As Variant) As Double get_length_3d = Sqr( _ dot_3d(vec, vec) _ ) End Function
無関係だけど、外積はこちら
'三次元ベクトルの外積 'param: vec1_array(double)-ベクトル 'param: vec2_array(double)-ベクトル 'return: array(double)-ベクトル Private Function cross_3d( _ ByVal vec1 As Variant, _ ByVal vec2 As Valiant) As Variant cross_3d = Array( _ vec1(1) * vec2(2) - vec1(2) * vec2(1), _ vec1(2) * vec2(0) - vec1(0) * vec2(2), _ vec1(0) * vec2(1) - vec1(1) * vec2(0) _ ) End Function
Xの成分を求める計算はお互いのYZの利用して・・・
って感じで不思議な事は印象に残ってます。
(計算式はいつまでたっても覚えない)