Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/ElmerGUI/netgen/libsrc/gprim/transform3d.cpp
3206 views
1
#include <mystdlib.h>
2
3
#include <myadt.hpp>
4
#include <gprim.hpp>
5
#include <linalg.hpp>
6
7
namespace netgen
8
{
9
10
Transformation3d :: Transformation3d ()
11
{
12
int i, j;
13
for (i = 0; i < 3; i++)
14
{
15
offset[i] = 0;
16
for (j = 0; j < 3; j++)
17
lin[i][j] = 0;
18
}
19
}
20
21
Transformation3d :: Transformation3d (const Vec3d & translate)
22
{
23
int i, j;
24
for (i = 0; i < 3; i++)
25
for (j = 0; j < 3; j++)
26
lin[i][j] = 0;
27
for (i = 0; i < 3; i++)
28
{
29
offset[i] = translate.X(i+1);
30
lin[i][i] = 1;
31
}
32
}
33
34
35
Transformation3d ::
36
Transformation3d (const Point3d & c, double alpha,
37
double beta, double gamma)
38
{
39
// total = T_c x Rot_0 x T_c^{-1}
40
// Use Euler angles, see many books from tech mech, e.g.
41
// Shabana "multibody systems"
42
43
Transformation3d tc(c);
44
Transformation3d tcinv;
45
tc.CalcInverse (tcinv);
46
47
Transformation3d r1, r2, r3, ht, ht2;
48
r1.SetAxisRotation (3, alpha);
49
r2.SetAxisRotation (1, beta);
50
r3.SetAxisRotation (3, gamma);
51
52
ht.Combine (tc, r3);
53
ht2.Combine (ht, r2);
54
ht.Combine (ht2, r1);
55
Combine (ht, tcinv);
56
57
cout << "Rotation - Transformation:" << (*this) << endl;
58
// (*testout) << "Rotation - Transformation:" << (*this) << endl;
59
}
60
61
62
63
64
Transformation3d :: Transformation3d (const Point3d ** pp)
65
{
66
int i, j;
67
for (i = 1; i <= 3; i++)
68
{
69
offset[i-1] = (*pp[0]).X(i);
70
for (j = 1; j <= 3; j++)
71
lin[i-1][j-1] = (*pp[j]).X(i) - (*pp[0]).X(i);
72
}
73
}
74
75
Transformation3d :: Transformation3d (const Point3d pp[])
76
{
77
int i, j;
78
for (i = 1; i <= 3; i++)
79
{
80
offset[i-1] = pp[0].X(i);
81
for (j = 1; j <= 3; j++)
82
lin[i-1][j-1] = pp[j].X(i) - pp[0].X(i);
83
}
84
}
85
86
87
void Transformation3d :: CalcInverse (Transformation3d & inv) const
88
{
89
static DenseMatrix a(3), inva(3);
90
static Vector b(3), sol(3);
91
int i, j;
92
93
for (i = 1; i <= 3; i++)
94
{
95
b.Elem(i) = offset[i-1];
96
for (j = 1; j <= 3; j++)
97
a.Elem(i, j) = lin[i-1][j-1];
98
}
99
100
::netgen::CalcInverse (a, inva);
101
inva.Mult (b, sol);
102
103
for (i = 1; i <= 3; i++)
104
{
105
inv.offset[i-1] = -sol.Get(i);
106
for (j = 1; j <= 3; j++)
107
inv.lin[i-1][j-1] = inva.Elem(i, j);
108
}
109
}
110
111
112
void Transformation3d::
113
Combine (const Transformation3d & ta, const Transformation3d & tb)
114
{
115
int i, j, k;
116
117
// o = o_a+ m_a o_b
118
// m = m_a m_b
119
120
for (i = 0; i <= 2; i++)
121
{
122
offset[i] = ta.offset[i];
123
for (j = 0; j <= 2; j++)
124
offset[i] += ta.lin[i][j] * tb.offset[j];
125
}
126
127
for (i = 0; i <= 2; i++)
128
for (j = 0; j <= 2; j++)
129
{
130
lin[i][j] = 0;
131
for (k = 0; k <= 2; k++)
132
lin[i][j] += ta.lin[i][k] * tb.lin[k][j];
133
}
134
}
135
void Transformation3d :: SetAxisRotation (int dir, double alpha)
136
{
137
double co = cos(alpha);
138
double si = sin(alpha);
139
dir--;
140
int pos1 = (dir+1) % 3;
141
int pos2 = (dir+2) % 3;
142
143
int i, j;
144
for (i = 0; i <= 2; i++)
145
{
146
offset[i] = 0;
147
for (j = 0; j <= 2; j++)
148
lin[i][j] = 0;
149
}
150
151
lin[dir][dir] = 1;
152
lin[pos1][pos1] = co;
153
lin[pos2][pos2] = co;
154
lin[pos1][pos2] = si;
155
lin[pos2][pos1] = -si;
156
}
157
158
ostream & operator<< (ostream & ost, Transformation3d & trans)
159
{
160
int i, j;
161
ost << "offset = ";
162
for (i = 0; i <= 2; i++)
163
ost << trans.offset[i] << " ";
164
ost << endl << "linear = " << endl;
165
for (i = 0; i <= 2; i++)
166
{
167
for (j = 0; j <= 2; j++)
168
ost << trans.lin[i][j] << " ";
169
ost << endl;
170
}
171
return ost;
172
}
173
}
174
175