Path: blob/devel/ElmerGUI/netgen/libsrc/gprim/transform3d.cpp
3206 views
#include <mystdlib.h>12#include <myadt.hpp>3#include <gprim.hpp>4#include <linalg.hpp>56namespace netgen7{89Transformation3d :: Transformation3d ()10{11int i, j;12for (i = 0; i < 3; i++)13{14offset[i] = 0;15for (j = 0; j < 3; j++)16lin[i][j] = 0;17}18}1920Transformation3d :: Transformation3d (const Vec3d & translate)21{22int i, j;23for (i = 0; i < 3; i++)24for (j = 0; j < 3; j++)25lin[i][j] = 0;26for (i = 0; i < 3; i++)27{28offset[i] = translate.X(i+1);29lin[i][i] = 1;30}31}323334Transformation3d ::35Transformation3d (const Point3d & c, double alpha,36double beta, double gamma)37{38// total = T_c x Rot_0 x T_c^{-1}39// Use Euler angles, see many books from tech mech, e.g.40// Shabana "multibody systems"4142Transformation3d tc(c);43Transformation3d tcinv;44tc.CalcInverse (tcinv);4546Transformation3d r1, r2, r3, ht, ht2;47r1.SetAxisRotation (3, alpha);48r2.SetAxisRotation (1, beta);49r3.SetAxisRotation (3, gamma);5051ht.Combine (tc, r3);52ht2.Combine (ht, r2);53ht.Combine (ht2, r1);54Combine (ht, tcinv);5556cout << "Rotation - Transformation:" << (*this) << endl;57// (*testout) << "Rotation - Transformation:" << (*this) << endl;58}5960616263Transformation3d :: Transformation3d (const Point3d ** pp)64{65int i, j;66for (i = 1; i <= 3; i++)67{68offset[i-1] = (*pp[0]).X(i);69for (j = 1; j <= 3; j++)70lin[i-1][j-1] = (*pp[j]).X(i) - (*pp[0]).X(i);71}72}7374Transformation3d :: Transformation3d (const Point3d pp[])75{76int i, j;77for (i = 1; i <= 3; i++)78{79offset[i-1] = pp[0].X(i);80for (j = 1; j <= 3; j++)81lin[i-1][j-1] = pp[j].X(i) - pp[0].X(i);82}83}848586void Transformation3d :: CalcInverse (Transformation3d & inv) const87{88static DenseMatrix a(3), inva(3);89static Vector b(3), sol(3);90int i, j;9192for (i = 1; i <= 3; i++)93{94b.Elem(i) = offset[i-1];95for (j = 1; j <= 3; j++)96a.Elem(i, j) = lin[i-1][j-1];97}9899::netgen::CalcInverse (a, inva);100inva.Mult (b, sol);101102for (i = 1; i <= 3; i++)103{104inv.offset[i-1] = -sol.Get(i);105for (j = 1; j <= 3; j++)106inv.lin[i-1][j-1] = inva.Elem(i, j);107}108}109110111void Transformation3d::112Combine (const Transformation3d & ta, const Transformation3d & tb)113{114int i, j, k;115116// o = o_a+ m_a o_b117// m = m_a m_b118119for (i = 0; i <= 2; i++)120{121offset[i] = ta.offset[i];122for (j = 0; j <= 2; j++)123offset[i] += ta.lin[i][j] * tb.offset[j];124}125126for (i = 0; i <= 2; i++)127for (j = 0; j <= 2; j++)128{129lin[i][j] = 0;130for (k = 0; k <= 2; k++)131lin[i][j] += ta.lin[i][k] * tb.lin[k][j];132}133}134void Transformation3d :: SetAxisRotation (int dir, double alpha)135{136double co = cos(alpha);137double si = sin(alpha);138dir--;139int pos1 = (dir+1) % 3;140int pos2 = (dir+2) % 3;141142int i, j;143for (i = 0; i <= 2; i++)144{145offset[i] = 0;146for (j = 0; j <= 2; j++)147lin[i][j] = 0;148}149150lin[dir][dir] = 1;151lin[pos1][pos1] = co;152lin[pos2][pos2] = co;153lin[pos1][pos2] = si;154lin[pos2][pos1] = -si;155}156157ostream & operator<< (ostream & ost, Transformation3d & trans)158{159int i, j;160ost << "offset = ";161for (i = 0; i <= 2; i++)162ost << trans.offset[i] << " ";163ost << endl << "linear = " << endl;164for (i = 0; i <= 2; i++)165{166for (j = 0; j <= 2; j++)167ost << trans.lin[i][j] << " ";168ost << endl;169}170return ost;171}172}173174175