本日のお題は『2ベクトルに直交するベクトルの取得』です。
直交については以前の直交判定の記事でも触れましたので、何となく分かって頂けているかなと思います。
今回は直交するベクトル自体を算出してみようと思います。
1. 環境
- FreeCAD 0.18
2. 直交方向の取得する方法
直交方向の取得と聞いて途方にくれるかもしれませんが、実はやり方を知っているとそんな大変なことではありません。
先に答えを言ってしまうと、『ベクトルの外積』を使います。
ベクトルの外積を使うと、以下の画像のように、直交方向を取得できます。
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プログラミングのトップページに飛びます。
よろしければご参照くださいませ。