行列は単なる行列でありそれ以上の意味付けは実装されていない.行列同士の演算ルールが定義されているのみである.
計算順序を間違わずにコーディングできるのであれば機能としては必要十分であるが計算順序のルール自体を明示的にコーディングする方がバグの可能性を減らすことができよう.
計算順序を間違わずにコーディングできるのであれば機能としては必要十分であるが計算順序のルール自体を明示的にコーディングする方がバグの可能性を減らすことができよう.
座標系や基準座標系とそこからの変換行列で定義する.そのため,親座標系へのポインタを持つリンクリストとした.
Full Code
他にイテレータを実装するほうが使い勝手がよいだろう.今回のCoordinatesクラスはグローバルまでの計算のみを提供する.
全ての子座標系がグローバルにつながるのであれば子座標系同士の変換行列の容易に求めることが可能である.
Full Code
class Coordinate
{
public:
Coordinate();
Coordinate(const Coordinate& arg);
Coordinate(Coordinate* parent, Matrix4x4& mat);
Coordinate* Parent();
const Coordinate* Parent() const;
Matrix4x4 GetMatrixFromGlobal() const;
protected:
Coordinate* parent;
Matrix4x4 mat;
};
//Sample
#include "coordinate.hpp"
int main()
{
Matrix4x4 matx1, matx2, matx3;
/* load or set matrix element here */
Coordinate c1(nullptr, matx1); // o_T_c1
Coordinate c2(&c1, matx2); // c1_T_c2
Coordinate c3(&c2, matx3); // c2_T_c3
Matrix4x4 transform_global_c3 = c3.GetGlobalMatrix();
// you can get the transformation matrix, o_T_c1 * c1_T_c2 * c2_T_c3;
}
他にイテレータを実装するほうが使い勝手がよいだろう.今回のCoordinatesクラスはグローバルまでの計算のみを提供する.
全ての子座標系がグローバルにつながるのであれば子座標系同士の変換行列の容易に求めることが可能である.
さらに,一歩すすめるならば現在の座標系が有効であるか,座標変換が有効であるか実装することが考えられる.
- operator*のオーバーロード.行列の積を求める前に親子関係の妥当性をチェックする.
- 現在の行列の有効性のチェック.位置センサなどの計測値を使う場合は有効であろう.
- nullptrではないstaticなグローバル座標系の定義.座標系Tを親としたグローバル座標系を表現するために必要である.

コメントをかく