本日はベクトルの平行判定をお勉強していきたいと思います。
平行判定なんて言い方をすると、慣れていない方が見た時、引いてしまいそうですが、そんなご大層なものではありません。
私が高校生の頃は、数学Bという科目で教わりましたが、今はどうなんですかね?
1. 環境
今回はFreeCADのAPIを使って、平行判定をしてみたいと思います。
- FreeCAD 0.18
2. ベクトルの平行判定とは?
簡単に言ってしまえば、2つの方向が同じ方向(もしくは正反対方向)を向いているかということです。
例えば、2人の人が同じ方向を見ていて、その方向が数値的に同じ(もしくは正反対)かを判定するとか言えば分かりやすいですかね。
3. プログラムを書いてみよう
FreeCADのAPIを使って簡単に済ませようと思ったら、ベクトルの平行判定をできるものがありませんでした。
そのため、今回は平行判定のメソッドを自作して、確認していきたいと思います。
# -*- coding: utf-8 -*- import FreeCAD def IsParallel(vector1, vector2): tolerance = 0.0001 dotProduct = vector1.dot(vector2) #1から0.9999 もしくは -0.9999から-1 までの間であれば平行とする if((-1 <= dotProduct and dotProduct <= -1 + tolerance) or (1 - tolerance <= dotProduct and dotProduct <= 1 )): return True else: return False v1=FreeCAD.Vector(-1,0,0) v2 = FreeCAD.Vector(1,0,0) isPara = IsParallel(v1, v2) if(isPara == True): FreeCAD.Console.PrintMessage("平行です。\n") else: FreeCAD.Console.PrintMessage("平行ではありません\n")
平行です。
今回、平行判定処理には『内積』というベクトル計算の性質を利用しています。
この内容については、いずれ別の記事で説明するかもしれません。
何はともあれ、結局は最初にお話しした通り、同方向か正反対方向を向いているかを数値的に判定しているだけです。
プログラムで書くとすんなりしてますよね。
4. 同方向だけの判定をしたい場合
正反対方向は判定をfalseにしたい場合は、上記のIsParallelメソッドに少しだけ細工を加えます。
# -*- coding: utf-8 -*- import FreeCAD def IsEqual(vector1, vector2): tolerance = 0.0001 dotProduct = vector1.dot(vector2) if(1 - tolerance <= dotProduct and dotProduct <= 1): return True else: return False v1 = FreeCAD.Vector(1,0,0) v2 = FreeCAD.Vector(-1,0,0) isPara = IsEqual(v1, v2) if(isPara == True): FreeCAD.Console.PrintMessage("同方向です。\n") else: FreeCAD.Console.PrintMessage("同方向ではありません。\n")
同方向ではありません。
5. 補足
5.1 Numpyというライブラリがあるらしい
今回はベクトル判定のメソッドを自作しましたが、こんなことをしなくても、Numpyという有名なライブラリがPythonにはあるようで、こちらを使えばわざわざ自作しなくて済みそうです。
5.2 上記のサンプルコードはもう一段改造すると良い
上で書いたサンプルコードは、単位ベクトルでのみ使うことができ、大きさを持ったベクトルでは使用することができません。
そのため、IsParallelメソッドの最初に引数で与えられた2ベクトルを単位化するコードを入れると、さらに使いやすくなります。
6. まとめ
- ベクトルの平行判定は、2つのベクトルが同じ方向を向いているかを判定している
- ベクトルの平行判定は内積で求められる
- ベクトル演算であれば、FreeCADのAPIを使わなくても、自作で作れる可能性がある
7. 最後に
CADは座標とベクトル情報のかたまりです。
それ故に、ベクトルで何ができるのかを知っておくと、要求を提示されたとき、ロジックを頭に浮かべ、実現性を検討することができます。
苦手な方は、少しずつ覚えていきましょう。
※注意※
管理人は数学が相当苦手なため、ロジック的に間違っている箇所があるかもしれません。もし何かお気づきの点がありましたら、コメントを頂けると助かります。
更なる情報をお探しの方は!
下記のリンクから、FreeCADプログラミングのトップページに飛びます。
よろしければご参照くださいませ。