Geant4  10.03.p03
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
HepGeom::Transform3D Class Reference

#include <Transform3D.h>

Inheritance diagram for HepGeom::Transform3D:
Collaboration diagram for HepGeom::Transform3D:

Classes

class  Transform3D_row
 

Public Member Functions

 Transform3D ()
 
 Transform3D (const CLHEP::HepRotation &m, const CLHEP::Hep3Vector &v)
 
 Transform3D (const Point3D< double > &fr0, const Point3D< double > &fr1, const Point3D< double > &fr2, const Point3D< double > &to0, const Point3D< double > &to1, const Point3D< double > &to2)
 
 Transform3D (const Transform3D &m)
 
 ~Transform3D ()
 
const Transform3D_row operator[] (int) const
 
double operator() (int, int) const
 
double xx () const
 
double xy () const
 
double xz () const
 
double yx () const
 
double yy () const
 
double yz () const
 
double zx () const
 
double zy () const
 
double zz () const
 
double dx () const
 
double dy () const
 
double dz () const
 
Transform3Doperator= (const Transform3D &m)
 
void setIdentity ()
 
Transform3D inverse () const
 
Transform3D operator* (const Transform3D &b) const
 
void getDecomposition (Scale3D &scale, Rotate3D &rotation, Translate3D &translation) const
 
bool isNear (const Transform3D &t, double tolerance=2.2E-14) const
 
CLHEP::HepRotation getRotation () const
 
CLHEP::Hep3Vector getTranslation () const
 
bool operator== (const Transform3D &transform) const
 
bool operator!= (const Transform3D &transform) const
 

Static Public Attributes

static const Transform3D Identity = Transform3D ()
 

Protected Member Functions

 Transform3D (double XX, double XY, double XZ, double DX, double YX, double YY, double YZ, double DY, double ZX, double ZY, double ZZ, double DZ)
 
void setTransform (double XX, double XY, double XZ, double DX, double YX, double YY, double YZ, double DY, double ZX, double ZY, double ZZ, double DZ)
 

Protected Attributes

double xx_
 
double xy_
 
double xz_
 
double dx_
 
double yx_
 
double yy_
 
double yz_
 
double dy_
 
double zx_
 
double zy_
 
double zz_
 
double dz_
 

Detailed Description

Class for transformation of 3D geometrical objects. It allows different translations, rotations, scalings and reflections. Several specialized classes are derived from it:

TranslateX3D, TranslateY3D, TranslateZ3D, Translate3D,
RotateX3D, RotateY3D, RotateZ3D, Rotate3D,
ScaleX3D, ScaleY3D, ScaleZ3D, Scale3D,
ReflectX3D, ReflectY3D, ReflectZ3D, Reflect3D.

The idea behind these classes is to provide some additional constructors for Transform3D, they normally should not be used as separate classes.

Example:

Remark: For the reason that the operator* is left associative, the notation

* v2 = m3*(m2*(m1*v1));
*

is much more effective then the notation

* v2 = m3*m2*m1*v1;
*

In the first case three operations Transform3D*Vector3D are executed, in the second case two operations Transform3D*Transform3D and one Transform3D*Vector3D are performed. Transform3D*Transform3D is roughly three times slower than Transform3D*Vector3D.

Author
Evgue.nosp@m.ni.T.nosp@m.chern.nosp@m.iaev.nosp@m.@cern.nosp@m..ch

Definition at line 171 of file Transform3D.h.

Constructor & Destructor Documentation

HepGeom::Transform3D::Transform3D ( double  XX,
double  XY,
double  XZ,
double  DX,
double  YX,
double  YY,
double  YZ,
double  DY,
double  ZX,
double  ZY,
double  ZZ,
double  DZ 
)
inlineprotected

Definition at line 178 of file Transform3D.h.

181  : xx_(XX), xy_(XY), xz_(XZ), dx_(DX),
182  yx_(YX), yy_(YY), yz_(YZ), dy_(DY),
183  zx_(ZX), zy_(ZY), zz_(ZZ), dz_(DZ) {}
HepGeom::Transform3D::Transform3D ( )
inline

Default constructor - sets the Identity transformation.

Definition at line 211 of file Transform3D.h.

Here is the caller graph for this function:

HepGeom::Transform3D::Transform3D ( const CLHEP::HepRotation m,
const CLHEP::Hep3Vector v 
)
inline

Constructor: rotation and then translation.

HepGeom::Transform3D::Transform3D ( const Point3D< double > &  fr0,
const Point3D< double > &  fr1,
const Point3D< double > &  fr2,
const Point3D< double > &  to0,
const Point3D< double > &  to1,
const Point3D< double > &  to2 
)

Constructor: transformation of basis (assumed - no reflection).

Definition at line 63 of file Transform3D.cc.

80  {
81  Vector3D<double> x1,y1,z1, x2,y2,z2;
82  x1 = (fr1 - fr0).unit();
83  y1 = (fr2 - fr0).unit();
84  x2 = (to1 - to0).unit();
85  y2 = (to2 - to0).unit();
86 
87  // C H E C K A N G L E S
88 
89  double cos1, cos2;
90  cos1 = x1*y1;
91  cos2 = x2*y2;
92 
93  if (std::abs(1.0-cos1) <= 0.000001 || std::abs(1.0-cos2) <= 0.000001) {
94  std::cerr << "Transform3D: zero angle between axes" << std::endl;
95  setIdentity();
96  }else{
97  if (std::abs(cos1-cos2) > 0.000001) {
98  std::cerr << "Transform3D: angles between axes are not equal"
99  << std::endl;
100  }
101 
102  // F I N D R O T A T I O N M A T R I X
103 
104  z1 = (x1.cross(y1)).unit();
105  y1 = z1.cross(x1);
106 
107  z2 = (x2.cross(y2)).unit();
108  y2 = z2.cross(x2);
109 
110  double detxx = (y1.y()*z1.z() - z1.y()*y1.z());
111  double detxy = -(y1.x()*z1.z() - z1.x()*y1.z());
112  double detxz = (y1.x()*z1.y() - z1.x()*y1.y());
113  double detyx = -(x1.y()*z1.z() - z1.y()*x1.z());
114  double detyy = (x1.x()*z1.z() - z1.x()*x1.z());
115  double detyz = -(x1.x()*z1.y() - z1.x()*x1.y());
116  double detzx = (x1.y()*y1.z() - y1.y()*x1.z());
117  double detzy = -(x1.x()*y1.z() - y1.x()*x1.z());
118  double detzz = (x1.x()*y1.y() - y1.x()*x1.y());
119 
120  double txx = x2.x()*detxx + y2.x()*detyx + z2.x()*detzx;
121  double txy = x2.x()*detxy + y2.x()*detyy + z2.x()*detzy;
122  double txz = x2.x()*detxz + y2.x()*detyz + z2.x()*detzz;
123  double tyx = x2.y()*detxx + y2.y()*detyx + z2.y()*detzx;
124  double tyy = x2.y()*detxy + y2.y()*detyy + z2.y()*detzy;
125  double tyz = x2.y()*detxz + y2.y()*detyz + z2.y()*detzz;
126  double tzx = x2.z()*detxx + y2.z()*detyx + z2.z()*detzx;
127  double tzy = x2.z()*detxy + y2.z()*detyy + z2.z()*detzy;
128  double tzz = x2.z()*detxz + y2.z()*detyz + z2.z()*detzz;
129 
130  // S E T T R A N S F O R M A T I O N
131 
132  double dx1 = fr0.x(), dy1 = fr0.y(), dz1 = fr0.z();
133  double dx2 = to0.x(), dy2 = to0.y(), dz2 = to0.z();
134 
135  setTransform(txx, txy, txz, dx2-txx*dx1-txy*dy1-txz*dz1,
136  tyx, tyy, tyz, dy2-tyx*dx1-tyy*dy1-tyz*dz1,
137  tzx, tzy, tzz, dz2-tzx*dx1-tzy*dy1-tzz*dz1);
138  }
139  }
void setTransform(double XX, double XY, double XZ, double DX, double YX, double YY, double YZ, double DY, double ZX, double ZY, double ZZ, double DZ)
Definition: Transform3D.h:186

Here is the call graph for this function:

HepGeom::Transform3D::Transform3D ( const Transform3D m)
inline

Copy constructor.

Definition at line 231 of file Transform3D.h.

232  : xx_(m.xx_), xy_(m.xy_), xz_(m.xz_), dx_(m.dx_),
233  yx_(m.yx_), yy_(m.yy_), yz_(m.yz_), dy_(m.dy_),
234  zx_(m.zx_), zy_(m.zy_), zz_(m.zz_), dz_(m.dz_) {}
static constexpr double m
Definition: G4SIunits.hh:129
HepGeom::Transform3D::~Transform3D ( )
inline

Destructor. Virtual for now as some persistency mechanism needs that, in future releases this might go away again.

Definition at line 241 of file Transform3D.h.

241 { /* nop */ }

Member Function Documentation

double HepGeom::Transform3D::dx ( ) const
inline

Gets dx-element of the transformation matrix.

Definition at line 279 of file Transform3D.h.

279 { return dx_; }

Here is the caller graph for this function:

double HepGeom::Transform3D::dy ( ) const
inline

Gets dy-element of the transformation matrix.

Definition at line 282 of file Transform3D.h.

282 { return dy_; }

Here is the caller graph for this function:

double HepGeom::Transform3D::dz ( ) const
inline

Gets dz-element of the transformation matrix.

Definition at line 285 of file Transform3D.h.

285 { return dz_; }

Here is the caller graph for this function:

void HepGeom::Transform3D::getDecomposition ( Scale3D scale,
Rotate3D rotation,
Translate3D translation 
) const

Decomposition of general transformation. This function gets decomposition of the transformation in three consequentive specific transformations: Scale3D, then Rotate3D, then Translate3, i.e.

* Transform3D = Translate3D * Rotate3D * Scale3D
*
Parameters
scaleoutput: scaling transformation; if there was a reflection, then scale factor for z-component (scale(2,2)) will be negative.
rotationoutput: rotation transformaion.
translationoutput: translation transformaion.

Definition at line 174 of file Transform3D.cc.

188  {
189  double sx = std::sqrt(xx_*xx_ + yx_*yx_ + zx_*zx_);
190  double sy = std::sqrt(xy_*xy_ + yy_*yy_ + zy_*zy_);
191  double sz = std::sqrt(xz_*xz_ + yz_*yz_ + zz_*zz_);
192 
193  if (xx_*(yy_*zz_-yz_*zy_) -
194  xy_*(yx_*zz_-yz_*zx_) +
195  xz_*(yx_*zy_-yy_*zx_) < 0) sz = -sz;
196  scale.setTransform(sx,0,0,0, 0,sy,0,0, 0,0,sz,0);
197  rotation.setTransform(xx_/sx,xy_/sy,xz_/sz,0,
198  yx_/sx,yy_/sy,yz_/sz,0,
199  zx_/sx,zy_/sy,zz_/sz,0);
200  translation.setTransform(1,0,0,dx_, 0,1,0,dy_, 0,0,1,dz_);
201  }

Here is the caller graph for this function:

CLHEP::HepRotation HepGeom::Transform3D::getRotation ( ) const
inline

Extracts the rotation matrix. This functions is obsolete - use getDecomposition() instead.

Here is the caller graph for this function:

CLHEP::Hep3Vector HepGeom::Transform3D::getTranslation ( ) const
inline

Extracts the translation vector. This functions is obsolete - use getDecomposition() instead.

Here is the caller graph for this function:

Transform3D HepGeom::Transform3D::inverse ( ) const

Returns the inverse transformation.

Definition at line 142 of file Transform3D.cc.

151  {
152  double detxx = yy_*zz_-yz_*zy_;
153  double detxy = yx_*zz_-yz_*zx_;
154  double detxz = yx_*zy_-yy_*zx_;
155  double det = xx_*detxx - xy_*detxy + xz_*detxz;
156  if (det == 0) {
157  std::cerr << "Transform3D::inverse error: zero determinant" << std::endl;
158  return Transform3D();
159  }
160  det = 1./det; detxx *= det; detxy *= det; detxz *= det;
161  double detyx = (xy_*zz_ - xz_*zy_)*det;
162  double detyy = (xx_*zz_ - xz_*zx_)*det;
163  double detyz = (xx_*zy_ - xy_*zx_)*det;
164  double detzx = (xy_*yz_ - xz_*yy_)*det;
165  double detzy = (xx_*yz_ - xz_*yx_)*det;
166  double detzz = (xx_*yy_ - xy_*yx_)*det;
167  return Transform3D
168  (detxx, -detyx, detzx, -detxx*dx_+detyx*dy_-detzx*dz_,
169  -detxy, detyy, -detzy, detxy*dx_-detyy*dy_+detzy*dz_,
170  detxz, -detyz, detzz, -detxz*dx_+detyz*dy_-detzz*dz_);
171  }

Here is the call graph for this function:

Here is the caller graph for this function:

bool HepGeom::Transform3D::isNear ( const Transform3D t,
double  tolerance = 2.2E-14 
) const

Returns true if the difference between corresponding matrix elements is less than the tolerance.

Definition at line 204 of file Transform3D.cc.

205  {
206  return ( (std::abs(xx_ - t.xx_) <= tolerance) &&
207  (std::abs(xy_ - t.xy_) <= tolerance) &&
208  (std::abs(xz_ - t.xz_) <= tolerance) &&
209  (std::abs(dx_ - t.dx_) <= tolerance) &&
210  (std::abs(yx_ - t.yx_) <= tolerance) &&
211  (std::abs(yy_ - t.yy_) <= tolerance) &&
212  (std::abs(yz_ - t.yz_) <= tolerance) &&
213  (std::abs(dy_ - t.dy_) <= tolerance) &&
214  (std::abs(zx_ - t.zx_) <= tolerance) &&
215  (std::abs(zy_ - t.zy_) <= tolerance) &&
216  (std::abs(zz_ - t.zz_) <= tolerance) &&
217  (std::abs(dz_ - t.dz_) <= tolerance) );
218  }
bool HepGeom::Transform3D::operator!= ( const Transform3D transform) const
inline

Test for inequality.

Definition at line 353 of file Transform3D.h.

353  {
354  return ! operator==(transform);
355  }
bool operator==(const Transform3D &transform) const
Definition: Transform3D.cc:221

Here is the call graph for this function:

double HepGeom::Transform3D::operator() ( int  i,
int  j 
) const

Fortran-style subscripting: returns (i,j) element of the matrix.

Definition at line 24 of file Transform3D.cc.

24  {
25  if (i == 0) {
26  if (j == 0) { return xx_; }
27  if (j == 1) { return xy_; }
28  if (j == 2) { return xz_; }
29  if (j == 3) { return dx_; }
30  } else if (i == 1) {
31  if (j == 0) { return yx_; }
32  if (j == 1) { return yy_; }
33  if (j == 2) { return yz_; }
34  if (j == 3) { return dy_; }
35  } else if (i == 2) {
36  if (j == 0) { return zx_; }
37  if (j == 1) { return zy_; }
38  if (j == 2) { return zz_; }
39  if (j == 3) { return dz_; }
40  } else if (i == 3) {
41  if (j == 0) { return 0.0; }
42  if (j == 1) { return 0.0; }
43  if (j == 2) { return 0.0; }
44  if (j == 3) { return 1.0; }
45  }
46  std::cerr << "Transform3D subscripting: bad indeces "
47  << "(" << i << "," << j << ")" << std::endl;
48  return 0.0;
49  }
Transform3D HepGeom::Transform3D::operator* ( const Transform3D b) const

Transformation by another Transform3D.

Definition at line 52 of file Transform3D.cc.

52  {
53  return Transform3D
54  (xx_*b.xx_+xy_*b.yx_+xz_*b.zx_, xx_*b.xy_+xy_*b.yy_+xz_*b.zy_,
55  xx_*b.xz_+xy_*b.yz_+xz_*b.zz_, xx_*b.dx_+xy_*b.dy_+xz_*b.dz_+dx_,
56  yx_*b.xx_+yy_*b.yx_+yz_*b.zx_, yx_*b.xy_+yy_*b.yy_+yz_*b.zy_,
57  yx_*b.xz_+yy_*b.yz_+yz_*b.zz_, yx_*b.dx_+yy_*b.dy_+yz_*b.dz_+dy_,
58  zx_*b.xx_+zy_*b.yx_+zz_*b.zx_, zx_*b.xy_+zy_*b.yy_+zz_*b.zy_,
59  zx_*b.xz_+zy_*b.yz_+zz_*b.zz_, zx_*b.dx_+zy_*b.dy_+zz_*b.dz_+dz_);
60  }
tuple b
Definition: test.py:12

Here is the call graph for this function:

Transform3D& HepGeom::Transform3D::operator= ( const Transform3D m)
inline

Assignment.

Definition at line 289 of file Transform3D.h.

289  {
290  xx_= m.xx_; xy_= m.xy_; xz_= m.xz_; dx_= m.dx_;
291  yx_= m.yx_; yy_= m.yy_; yz_= m.yz_; dy_= m.dy_;
292  zx_= m.zx_; zy_= m.zy_; zz_= m.zz_; dz_= m.dz_;
293  return *this;
294  }
static constexpr double m
Definition: G4SIunits.hh:129
bool HepGeom::Transform3D::operator== ( const Transform3D transform) const

Test for equality.

Definition at line 221 of file Transform3D.cc.

222  {
223  return (this == &t) ? true :
224  (xx_==t.xx_ && xy_==t.xy_ && xz_==t.xz_ && dx_==t.dx_ &&
225  yx_==t.yx_ && yy_==t.yy_ && yz_==t.yz_ && dy_==t.dy_ &&
226  zx_==t.zx_ && zy_==t.zy_ && zz_==t.zz_ && dz_==t.dz_ );
227  }

Here is the caller graph for this function:

const Transform3D_row HepGeom::Transform3D::operator[] ( int  ) const
inline

Returns object of the helper class for C-style subscripting r[i][j]

void HepGeom::Transform3D::setIdentity ( )
inline

Sets the Identity transformation.

Definition at line 298 of file Transform3D.h.

Here is the caller graph for this function:

void HepGeom::Transform3D::setTransform ( double  XX,
double  XY,
double  XZ,
double  DX,
double  YX,
double  YY,
double  YZ,
double  DY,
double  ZX,
double  ZY,
double  ZZ,
double  DZ 
)
inlineprotected

Definition at line 186 of file Transform3D.h.

188  {
189  xx_ = XX; xy_ = XY; xz_ = XZ; dx_ = DX;
190  yx_ = YX; yy_ = YY; yz_ = YZ; dy_ = DY;
191  zx_ = ZX; zy_ = ZY; zz_ = ZZ; dz_ = DZ;
192  }

Here is the caller graph for this function:

double HepGeom::Transform3D::xx ( ) const
inline

Gets xx-element of the transformation matrix.

Definition at line 252 of file Transform3D.h.

252 { return xx_; }

Here is the caller graph for this function:

double HepGeom::Transform3D::xy ( ) const
inline

Gets xy-element of the transformation matrix.

Definition at line 255 of file Transform3D.h.

255 { return xy_; }

Here is the caller graph for this function:

double HepGeom::Transform3D::xz ( ) const
inline

Gets xz-element of the transformation matrix.

Definition at line 258 of file Transform3D.h.

258 { return xz_; }

Here is the caller graph for this function:

double HepGeom::Transform3D::yx ( ) const
inline

Gets yx-element of the transformation matrix.

Definition at line 261 of file Transform3D.h.

261 { return yx_; }

Here is the caller graph for this function:

double HepGeom::Transform3D::yy ( ) const
inline

Gets yy-element of the transformation matrix.

Definition at line 264 of file Transform3D.h.

264 { return yy_; }

Here is the caller graph for this function:

double HepGeom::Transform3D::yz ( ) const
inline

Gets yz-element of the transformation matrix.

Definition at line 267 of file Transform3D.h.

267 { return yz_; }

Here is the caller graph for this function:

double HepGeom::Transform3D::zx ( ) const
inline

Gets zx-element of the transformation matrix.

Definition at line 270 of file Transform3D.h.

270 { return zx_; }

Here is the caller graph for this function:

double HepGeom::Transform3D::zy ( ) const
inline

Gets zy-element of the transformation matrix.

Definition at line 273 of file Transform3D.h.

273 { return zy_; }

Here is the caller graph for this function:

double HepGeom::Transform3D::zz ( ) const
inline

Gets zz-element of the transformation matrix.

Definition at line 276 of file Transform3D.h.

276 { return zz_; }

Here is the caller graph for this function:

Member Data Documentation

double HepGeom::Transform3D::dx_
protected

Definition at line 173 of file Transform3D.h.

double HepGeom::Transform3D::dy_
protected

Definition at line 173 of file Transform3D.h.

double HepGeom::Transform3D::dz_
protected

Definition at line 173 of file Transform3D.h.

const Transform3D HepGeom::Transform3D::Identity = Transform3D ()
static

Global identity transformation.

Definition at line 197 of file Transform3D.h.

double HepGeom::Transform3D::xx_
protected

Definition at line 173 of file Transform3D.h.

double HepGeom::Transform3D::xy_
protected

Definition at line 173 of file Transform3D.h.

double HepGeom::Transform3D::xz_
protected

Definition at line 173 of file Transform3D.h.

double HepGeom::Transform3D::yx_
protected

Definition at line 173 of file Transform3D.h.

double HepGeom::Transform3D::yy_
protected

Definition at line 173 of file Transform3D.h.

double HepGeom::Transform3D::yz_
protected

Definition at line 173 of file Transform3D.h.

double HepGeom::Transform3D::zx_
protected

Definition at line 173 of file Transform3D.h.

double HepGeom::Transform3D::zy_
protected

Definition at line 173 of file Transform3D.h.

double HepGeom::Transform3D::zz_
protected

Definition at line 173 of file Transform3D.h.


The documentation for this class was generated from the following files: