16#include "CLHEP/Geometry/defs.h"
17#include "CLHEP/Geometry/Transform3D.h"
27 if (j == 0) {
return xx_; }
28 if (j == 1) {
return xy_; }
29 if (j == 2) {
return xz_; }
30 if (j == 3) {
return dx_; }
32 if (j == 0) {
return yx_; }
33 if (j == 1) {
return yy_; }
34 if (j == 2) {
return yz_; }
35 if (j == 3) {
return dy_; }
37 if (j == 0) {
return zx_; }
38 if (j == 1) {
return zy_; }
39 if (j == 2) {
return zz_; }
40 if (j == 3) {
return dz_; }
42 if (j == 0) {
return 0.0; }
43 if (j == 1) {
return 0.0; }
44 if (j == 2) {
return 0.0; }
45 if (j == 3) {
return 1.0; }
47 std::cerr <<
"Transform3D subscripting: bad indices "
48 <<
"(" << i <<
"," << j <<
")" << std::endl;
83 x1 = (fr1 - fr0).unit();
84 y1 = (fr2 - fr0).unit();
85 x2 = (to1 - to0).unit();
86 y2 = (to2 - to0).unit();
94 if (std::abs(1.0-cos1) <= 0.000001 || std::abs(1.0-cos2) <= 0.000001) {
95 std::cerr <<
"Transform3D: zero angle between axes" << std::endl;
98 if (std::abs(cos1-cos2) > 0.000001) {
99 std::cerr <<
"Transform3D: angles between axes are not equal"
105 z1 = (x1.
cross(y1)).unit();
108 z2 = (x2.
cross(y2)).unit();
111 double detxx = (y1.
y()*z1.
z() - z1.
y()*y1.
z());
112 double detxy = -(y1.
x()*z1.
z() - z1.
x()*y1.
z());
113 double detxz = (y1.
x()*z1.
y() - z1.
x()*y1.
y());
114 double detyx = -(x1.
y()*z1.
z() - z1.
y()*x1.
z());
115 double detyy = (x1.
x()*z1.
z() - z1.
x()*x1.
z());
116 double detyz = -(x1.
x()*z1.
y() - z1.
x()*x1.
y());
117 double detzx = (x1.
y()*y1.
z() - y1.
y()*x1.
z());
118 double detzy = -(x1.
x()*y1.
z() - y1.
x()*x1.
z());
119 double detzz = (x1.
x()*y1.
y() - y1.
x()*x1.
y());
121 double txx = x2.
x()*detxx + y2.
x()*detyx + z2.
x()*detzx;
122 double txy = x2.
x()*detxy + y2.
x()*detyy + z2.
x()*detzy;
123 double txz = x2.
x()*detxz + y2.
x()*detyz + z2.
x()*detzz;
124 double tyx = x2.
y()*detxx + y2.
y()*detyx + z2.
y()*detzx;
125 double tyy = x2.
y()*detxy + y2.
y()*detyy + z2.
y()*detzy;
126 double tyz = x2.
y()*detxz + y2.
y()*detyz + z2.
y()*detzz;
127 double tzx = x2.
z()*detxx + y2.
z()*detyx + z2.
z()*detzx;
128 double tzy = x2.
z()*detxy + y2.
z()*detyy + z2.
z()*detzy;
129 double tzz = x2.
z()*detxz + y2.
z()*detyz + z2.
z()*detzz;
133 double dx1 = fr0.
x(), dy1 = fr0.
y(), dz1 = fr0.
z();
134 double dx2 = to0.
x(), dy2 = to0.
y(), dz2 = to0.
z();
136 setTransform(txx, txy, txz, dx2-txx*dx1-txy*dy1-txz*dz1,
137 tyx, tyy, tyz, dy2-tyx*dx1-tyy*dy1-tyz*dz1,
138 tzx, tzy, tzz, dz2-tzx*dx1-tzy*dy1-tzz*dz1);
156 double det =
xx_*detxx -
xy_*detxy +
xz_*detxz;
158 std::cerr <<
"Transform3D::inverse error: zero determinant" << std::endl;
161 det = 1./det; detxx *= det; detxy *= det; detxz *= det;
169 (detxx, -detyx, detzx, -detxx*
dx_+detyx*
dy_-detzx*
dz_,
170 -detxy, detyy, -detzy, detxy*
dx_-detyy*
dy_+detzy*
dz_,
171 detxz, -detyz, detzz, -detxz*
dx_+detyz*
dy_-detzz*
dz_);
190 double sx = std::sqrt(xx_*xx_ + yx_*yx_ + zx_*zx_);
191 double sy = std::sqrt(xy_*xy_ + yy_*yy_ + zy_*zy_);
192 double sz = std::sqrt(xz_*xz_ + yz_*yz_ + zz_*zz_);
194 if (xx_*(yy_*zz_-yz_*zy_) -
195 xy_*(yx_*zz_-yz_*zx_) +
196 xz_*(yx_*zy_-yy_*zx_) < 0) sz = -sz;
197 scale.setTransform(sx,0,0,0, 0,sy,0,0, 0,0,sz,0);
198 rotation.setTransform(xx_/sx,xy_/sy,xz_/sz,0,
199 yx_/sx,yy_/sy,yz_/sz,0,
200 zx_/sx,zy_/sy,zz_/sz,0);
201 translation.setTransform(1,0,0,dx_, 0,1,0,dy_, 0,0,1,dz_);
207 return ( (std::abs(
xx_ - t.
xx_) <= tolerance) &&
208 (std::abs(
xy_ - t.
xy_) <= tolerance) &&
209 (std::abs(
xz_ - t.
xz_) <= tolerance) &&
210 (std::abs(
dx_ - t.
dx_) <= tolerance) &&
211 (std::abs(
yx_ - t.
yx_) <= tolerance) &&
212 (std::abs(
yy_ - t.
yy_) <= tolerance) &&
213 (std::abs(
yz_ - t.
yz_) <= tolerance) &&
214 (std::abs(
dy_ - t.
dy_) <= tolerance) &&
215 (std::abs(
zx_ - t.
zx_) <= tolerance) &&
216 (std::abs(
zy_ - t.
zy_) <= tolerance) &&
217 (std::abs(
zz_ - t.
zz_) <= tolerance) &&
218 (std::abs(
dz_ - t.
dz_) <= tolerance) );
224 return (
this == &t) ? true :
247 double cx = p2.
x()-p1.
x(), cy = p2.
y()-p1.
y(), cz = p2.
z()-p1.
z();
248 double ll = std::sqrt(cx*cx + cy*cy + cz*cz);
250 std::cerr <<
"Rotate3D: zero axis" << std::endl;
252 double cosa = std::cos(a), sina = std::sin(a);
253 cx /= ll; cy /= ll; cz /= ll;
255 double txx = cosa + (1-cosa)*cx*cx;
256 double txy = (1-cosa)*cx*cy - sina*cz;
257 double txz = (1-cosa)*cx*cz + sina*cy;
259 double tyx = (1-cosa)*cy*cx + sina*cz;
260 double tyy = cosa + (1-cosa)*cy*cy;
261 double tyz = (1-cosa)*cy*cz - sina*cx;
263 double tzx = (1-cosa)*cz*cx - sina*cy;
264 double tzy = (1-cosa)*cz*cy + sina*cx;
265 double tzz = cosa + (1-cosa)*cz*cz;
267 double tdx = p1.
x(), tdy = p1.
y(), tdz = p1.
z();
269 setTransform(txx, txy, txz, tdx-txx*tdx-txy*tdy-txz*tdz,
270 tyx, tyy, tyz, tdy-tyx*tdx-tyy*tdy-tyz*tdz,
271 tzx, tzy, tzz, tdz-tzx*tdx-tzy*tdy-tzz*tdz);
287 double ll = a*a+b*b+c*c;
289 std::cerr <<
"Reflect3D: zero normal" << std::endl;
293 double aa = a*a*ll, ab = a*b*ll, ac = a*c*ll, ad = a*d*ll,
294 bb = b*b*ll, bc = b*c*ll, bd = b*d*ll,
295 cc = c*c*ll, cd = c*d*ll;
297 -ab-ab, aa-bb+cc, -bc-bc, -bd-bd,
298 -ac-ac, -bc-bc, aa+bb-cc, -cd-cd);
BasicVector3D< T > cross(const BasicVector3D< T > &v) const