C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

三次元ベクトルの内積と長さ

三次元ベクトルを扱っていると外積やら内積やら単位化やら必要に
なってきますよね?

自分だったらベクトルクラス作って、メソッドにそれらを実装します。
外積内積や単位化は、ベクトルの為の関数なので、ベクトルクラスに
責任持ってもらうのが筋だと思いませんか?

ですが、訳あって関数で必要になりそうなので、切り出したのですが
今まで気が付きませんでした・・・。
内積と長さを求める関数です。

'三次元ベクトルの内積
'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の利用して・・・
って感じで不思議な事は印象に残ってます。
(計算式はいつまでたっても覚えない)