Path: blob/devel/ElmerGUI/netgen/libsrc/gprim/transform3d.hpp
3206 views
#ifndef FILE_TRANSFORM3D1#define FILE_TRANSFORM3D23/* *************************************************************************/4/* File: transform3d.hh */5/* Author: Joachim Schoeberl */6/* Date: 22. Mar. 98 */7/* *************************************************************************/89/*10Affine - Linear mapping in 3D space11*/1213class Transformation3d;14ostream & operator<< (ostream & ost, Transformation3d & trans);1516class Transformation3d17{18double lin[3][3];19double offset[3];20public:21///22Transformation3d ();23/// Unit tet is mapped to tet descibed by pp24Transformation3d (const Point3d ** pp);25/// Unit tet is mapped to tet descibed by pp26Transformation3d (const Point3d pp[]);27/// translation28Transformation3d (const Vec3d & translate);29/// rotation with ...30Transformation3d (const Point3d & c, double alpha, double beta, double gamma);31///32void CalcInverse (Transformation3d & inv) const;33/// this = ta x tb34void Combine (const Transformation3d & ta, const Transformation3d & tb);35/// dir = 1..3 (== x..z)36void SetAxisRotation (int dir, double alpha);37///38void Transform (const Point3d & from, Point3d & to) const39{40for (int i = 1; i <= 3; i++)41{42to.X(i) = offset[i-1] + lin[i-1][0] * from.X(1) +43lin[i-1][1] * from.X(2) + lin[i-1][2] * from.X(3);44}45}4647///48void Transform (Point3d & p) const49{50Point3d hp;51Transform (p, hp);52p = hp;53}5455/// transform vector, apply only linear part, not offset56void Transform (const Vec3d & from, Vec3d & to) const57{58for (int i = 1; i <= 3; i++)59{60to.X(i) = lin[i-1][0] * from.X(1) +61lin[i-1][1] * from.X(2) + lin[i-1][2] * from.X(3);62}63}64friend ostream & operator<< (ostream & ost, Transformation3d & trans);65};666768697071727374757677787980template <int D>81class Transformation82{83Mat<D> m;84Vec<D> v;85public:86///87Transformation () { m = 0; v = 0; }8889/// Unit tet is mapped to tet descibed by pp90Transformation (const Point<D> * pp);9192/// translation93Transformation (const Vec<D> & translate)94{95v = translate;96m = 0;97for (int i = 0; i < D; i++)98m(i,i) = 1;99}100101// rotation with ...102Transformation (const Point<D> & c, double alpha, double beta, double gamma)103{104// total = T_c x Rot_0 x T_c^{-1}105// Use Euler angles, see many books from tech mech, e.g.106// Shabana "multibody systems"107108Vec<D> vc(c);109Transformation<D> tc(vc);110Transformation<D> tcinv(-vc);111// tc.CalcInverse (tcinv);112113Transformation<D> r1, r2, r3, ht, ht2;114r1.SetAxisRotation (3, alpha);115r2.SetAxisRotation (1, beta);116r3.SetAxisRotation (3, gamma);117118ht.Combine (tc, r3);119ht2.Combine (ht, r2);120ht.Combine (ht2, r1);121Combine (ht, tcinv);122123// cout << "Rotation - Transformation:" << (*this) << endl;124// (*testout) << "Rotation - Transformation:" << (*this) << endl;125}126127///128void CalcInverse (Transformation & inv) const;129130/// this = ta x tb131void Combine (const Transformation & ta, const Transformation & tb)132{133v = ta.v + ta.m * tb.v;134m = ta.m * tb.m;135}136137138139/// dir = 1..3 (== x..z)140void SetAxisRotation (int dir, double alpha)141{142double co = cos(alpha);143double si = sin(alpha);144dir--;145int pos1 = (dir+1) % 3;146int pos2 = (dir+2) % 3;147148int i, j;149for (i = 0; i <= 2; i++)150{151v(i) = 0;152for (j = 0; j <= 2; j++)153m(i,j) = 0;154}155156m(dir,dir) = 1;157m(pos1, pos1) = co;158m(pos2, pos2) = co;159m(pos1, pos2) = si;160m(pos2, pos1) = -si;161}162163///164void Transform (const Point<D> & from, Point<D> & to) const165{166to = Point<D> (v + m * Vec<D>(from));167}168169void Transform (Point<D> & p) const170{171p = Point<D> (v + m * Vec<D>(p));172}173174175176/// transform vector, apply only linear part, not offset177void Transform (const Vec<D> & from, Vec<D> & to) const178{179to = m * from;180}181};182183template <int D>184ostream & operator<< (ostream & ost, Transformation<D> & trans);185186187188189#endif190191192