本日のお題は『行列の平行移動』です。
行列(マトリックス)の扱いに関するもので、数学Cや線形代数学の学習をしていない方には少々とっつきにくい分野となります。
しかしながら、CADのプログラミングを行う上で、この知識を持っている/持っていないでかなりの差がつきます。
実は私はあまり得意ではないですが、一緒に学習していければと思います。
1. 環境
- FreeCAD 0.18
2. 行列の平行移動とは?
プログラムを書く前に、行列の平行移動とは何か少々おさらいしておきましょう。
行列の平行移動というのは、簡単に言えば、座標系をある軸に対して平行に移動することを言います。
3次元だと書きにくいので、2次元的に表現します。
例えば、以下のようにXY軸があったとして、軸を回転させずに移動します。
3. どういうときに使う?
基本的には、平行移動のみを使って何かをすることは、ほぼありません。
(以前勉強したベクトルの計算ができれば大抵、事足りてしまうからです。)
今回は説明しませんが、元の座標系と、この平行移動した座標系を組み合わせることで得られる、相対位置の計算に使用することが多いです。
(個人的な意見ですよ。)
4. プログラムを書いてみよう
平行移動にはMatrixクラスのmoveメソッドを使用します。
# -*- coding: utf-8 -*- #import ptvsd #print("Waiting for debugger attach") # 5678 is the default attach port in the VS Code debug configurations #ptvsd.enable_attach(address=('localhost', 5678), redirect_output=True) #ptvsd.wait_for_attach() ################ # 平行移動 ################ import FreeCAD import math # マトリックスの位置を取得 def GetMovedPoint(mtx): return FreeCAD.Vector(mtx.A14,mtx.A24,mtx.A34) # 絶対座標系のXYZを取得 baseMtx = FreeCAD.Matrix() FreeCAD.Console.PrintMessage("based" + str(baseMtx) + "\n") # X,Y,Z方向に移動 baseMtx.move(FreeCAD.Vector(5,10,0)) FreeCAD.Console.PrintMessage("moved" + str(baseMtx) + "\n") # 移動後の位置を取得 movedPnt = GetMovedPoint(baseMtx) FreeCAD.Console.PrintMessage("movedPoint" + str(movedPnt) + "\n")
based ((1,0,0,0),(0,1,0,0),(0,0,1,0),(0,0,0,1)) moved ((1,0,0,5),(0,1,0,10),(0,0,1,0),(0,0,0,1)) movedPoint (5.0, 10.0, 0.0)
basedは、作り立てのマトリックス、つまり絶対座標系の向きを表しています。
movedは、(5,10,0)の移動量を加算したマトリックスです。
movedPointは、現在のマトリックスの位置だけを抽出して表示しています。
ひとまず、移動ができていることは確認できましたね。
5. 補足
5.1. 4×4マトリックスの各要素の意味
もうお分かりの方もいらっしゃるかもしれませんが、マトリックスの各要素の意味合いは以下のようになります。
つまり、『XYZ軸の方向』と『座標系がいる位置』を表しています。
6. まとめ
- 平行移動をするには、Matrixクラスのmoveメソッドを使用する
- CADで扱うマトリックスは、『XYZ軸の方向』と『座標系がいる位置』の情報を持っている
- 平行移動だけ行って何かするケースは割と少ない
7. 最後に
今回はマトリックスを移動しただけで、あまり面白みは無かったかもしれませんが、かなり重要な技法です。忘れずに覚えておきましょう。
更なる情報をお探しの方は!
下記のリンクから、FreeCADプログラミングのトップページに飛びます。
よろしければご参照くださいませ。