興味があろうがなかろうが。

なるべく役に立つ、とがった内容を記していきたいと思います。

【FreeCADプログラミング】2ベクトルに直交するベクトルの取得

本日のお題は『2ベクトルに直交するベクトルの取得』です。

直交については以前の直交判定の記事でも触れましたので、何となく分かって頂けているかなと思います。

今回は直交するベクトル自体を算出してみようと思います。

1. 環境

  • FreeCAD 0.18

2. 直交方向の取得する方法

直交方向の取得と聞いて途方にくれるかもしれませんが、実はやり方を知っているとそんな大変なことではありません。

先に答えを言ってしまうと、『ベクトルの外積』を使います。

ベクトルの外積を使うと、以下の画像のように、直交方向を取得できます。

f:id:appli-get:20191010102336j:plain

AとBの外積を取得すると、直交するCの方向が取得できる

A方向のベクトルと、B方向のベクトルで外積を取ると、直交するC方向が取得できます。

なお、今回はFreeCADに合わせて『右手系』という概念で考えています。気になる方は検索してみてください。

3. プログラムを書いてみよう

今回もFreeCADのAPIを使って、検算していきます。ベクトルの外積にはcrossというAPIを使います。

# -*- coding: utf-8 -*-

import FreeCAD

vector1 = FreeCAD.Vector(1,0,0)
vector2 = FreeCAD.Vector(0,1,0)
crossVector = vector1.cross(vector2)

FreeCAD.Console.PrintMessage(str(crossVector))

 

Vector (0.0, 0.0, 1.0)

見たまんまですが、X軸とY軸に直交する方向、つまりZ軸方向が算出されましたね。

4. 補足

4.1 外積に使う2ベクトルは直交している必要はない

上記の例では、直交した2ベクトルで外積を取得しましたが、実は直交していなくても、外積は取得できます

例えば、先ほどのソースコードのvector2の方向を直交しないベクトルに変更してみます。

# -*- coding: utf-8 -*-

import FreeCAD

vector1 = FreeCAD.Vector(1,0,0)
vector2 = FreeCAD.Vector(1,1,0#直交しないベクトルに変更
unitVec = vector2.normalize()

crossVector = vector1.cross(unitVec)
unitCrossVec = crossVector.normalize()

FreeCAD.Console.PrintMessage(str(unitCrossVec))

 

Vector (0.0, 0.0, 1.0)

ただし、2つとも全く同じ方向を向いていたり、ゼロベクトルの場合は、計算できませんので注意しましょう。

4.2. 入力の順番を逆にすると、結果が変わるので注意

APIに入力するベクトルの順番を下記のように逆にすると、算出されるベクトルが反転します。

# -*- coding: utf-8 -*-

import FreeCAD

vector1 = FreeCAD.Vector(1,0,0)
vector2 = FreeCAD.Vector(1,1,0)
unitVec = vector2.normalize()

crossVector = unitVec.cross(vector1) #順番を逆にしてみる
unitCrossVec = crossVector.normalize()

FreeCAD.Console.PrintMessage(str(unitCrossVec))

 

Vector (0.0, 0.0, -1.0)

これは外積計算の落とし穴ですので、十分注意してください。

5. まとめ

  • 2ベクトルに直交するベクトルが欲しい時はcrossを使う
  • 外積を取得する時は必ずしも2ベクトルが直交している必要はない
  • crossに入力する方向の順番を誤ると、算出される直交方向が反転するので注意

6. 最後に

私自身、高校数学の外積・内積はすごく難しいものと捉えており、最近まで全く意味が分かっていませんでした。

しかし、ベクトル関係のAPIを使うことで、少しずつ理解し始め、頭の中で計算ロジックを組めるようになり、楽しくなってきています。

これからCADを始める皆様にも、この感覚を感じていただけたら嬉しいです。

更なる情報をお探しの方は!

下記のリンクから、FreeCADプログラミングのトップページに飛びます。

よろしければご参照くださいませ。

www.interested-or-not.com