Geant4-11
Data Structures | Public Member Functions | Static Public Attributes | Protected Member Functions | Protected Attributes
HepGeom::Transform3D Class Reference

#include <Transform3D.h>

Inheritance diagram for HepGeom::Transform3D:
G4OpenInventorTransform3D HepGeom::Reflect3D HepGeom::Rotate3D HepGeom::Scale3D HepGeom::Translate3D HepGeom::ReflectX3D HepGeom::ReflectY3D HepGeom::ReflectZ3D HepGeom::RotateX3D HepGeom::RotateY3D HepGeom::RotateZ3D HepGeom::ScaleX3D HepGeom::ScaleY3D HepGeom::ScaleZ3D HepGeom::TranslateX3D HepGeom::TranslateY3D HepGeom::TranslateZ3D

Data Structures

class  Transform3D_row
 

Public Member Functions

double dx () const
 
double dy () const
 
double dz () const
 
void getDecomposition (Scale3D &scale, Rotate3D &rotation, Translate3D &translation) const
 
CLHEP::HepRotation getRotation () const
 
CLHEP::Hep3Vector getTranslation () const
 
Transform3D inverse () const
 
bool isNear (const Transform3D &t, double tolerance=2.2E-14) const
 
bool operator!= (const Transform3D &transform) const
 
double operator() (int, int) const
 
Transform3D operator* (const Transform3D &b) const
 
Transform3Doperator= (const Transform3D &mt)=default
 
Transform3Doperator= (Transform3D &&mt)=default
 
bool operator== (const Transform3D &transform) const
 
const Transform3D_row operator[] (int) const
 
void setIdentity ()
 
 Transform3D ()
 
 Transform3D (const CLHEP::HepRotation &mt, 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 &mt)=default
 
 Transform3D (Transform3D &&mt)=default
 
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
 
 ~Transform3D ()=default
 

Static Public Attributes

static DLL_API const Transform3D Identity = Transform3D ()
 

Protected Member Functions

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)
 
 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)
 

Protected Attributes

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

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:

static constexpr double m
Definition: G4SIunits.hh:109
static constexpr double cm
Definition: G4SIunits.hh:99

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

v2 = m3*(m2*(m1*v1));
static constexpr double m3
Definition: G4SIunits.hh:111
static constexpr double m2
Definition: G4SIunits.hh:110

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 170 of file Transform3D.h.

Constructor & Destructor Documentation

◆ Transform3D() [1/6]

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 177 of file Transform3D.h.

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

◆ Transform3D() [2/6]

HepGeom::Transform3D::Transform3D ( )
inline

Default constructor - sets the Identity transformation.

Definition at line 210 of file Transform3D.h.

211 : xx_(1), xy_(0), xz_(0), dx_(0),
212 yx_(0), yy_(1), yz_(0), dy_(0),
213 zx_(0), zy_(0), zz_(1), dz_(0) {}

Referenced by inverse(), and operator*().

◆ Transform3D() [3/6]

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

Constructor: rotation and then translation.

◆ Transform3D() [4/6]

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 62 of file Transform3D.cc.

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

References HepGeom::BasicVector3D< T >::cross(), setIdentity(), setTransform(), HepGeom::BasicVector3D< T >::x(), HepGeom::BasicVector3D< T >::y(), and HepGeom::BasicVector3D< T >::z().

◆ Transform3D() [5/6]

HepGeom::Transform3D::Transform3D ( const Transform3D mt)
default

Copy constructor.

◆ Transform3D() [6/6]

HepGeom::Transform3D::Transform3D ( Transform3D &&  mt)
default

Move constructor.

◆ ~Transform3D()

HepGeom::Transform3D::~Transform3D ( )
default

Destructor.

Member Function Documentation

◆ dx()

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

◆ dy()

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

◆ dz()

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

◆ getDecomposition()

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 173 of file Transform3D.cc.

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

Referenced by G4AssemblyVolume::AddPlacedAssembly(), G4AssemblyVolume::AddPlacedVolume(), G4PhysicalVolumeModel::DescribeAndDescend(), G4MultiUnion::GetGlobalVector(), G4MultiUnion::GetLocalVector(), operator<<(), G4GDMLWriteStructure::PhysvolWrite(), G4ReflectionFactory::Place(), and G4GDMLWriteStructure::TraverseVolumeTree().

◆ getRotation()

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

◆ getTranslation()

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

◆ inverse()

Transform3D HepGeom::Transform3D::inverse ( ) const

Returns the inverse transformation.

Definition at line 141 of file Transform3D.cc.

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

References dx_, dy_, dz_, Transform3D(), xx_, xy_, xz_, yx_, yy_, yz_, zx_, zy_, and zz_.

Referenced by G4VtkSceneHandler::AddPrimitiveTensorGlyph(), G4PhysicalVolumeModel::DescribeAndDescend(), G4PhysicalVolumeModel::DescribeSolid(), G4ScoringBox::Draw(), G4ScoringCylinder::Draw(), G4ScoringBox::DrawColumn(), G4ScoringCylinder::DrawColumn(), G4GMocrenFileSceneHandler::ExtractDetector(), G3toG4BuildPVTree(), G4MultiUnion::GetLocalPoint(), G4MultiUnion::GetLocalVector(), G4ReflectedSolid::GetTransform3D(), GetTransform3D(), G4ReflectionFactory::Place(), G4ReflectionFactory::ReflectPVPlacement(), SubstractSolids(), and G4GDMLWriteStructure::TraverseVolumeTree().

◆ isNear()

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 203 of file Transform3D.cc.

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

References dx_, dy_, dz_, xx_, xy_, xz_, yx_, yy_, yz_, zx_, zy_, and zz_.

◆ operator!=()

bool HepGeom::Transform3D::operator!= ( const Transform3D transform) const
inline

Test for inequality.

Definition at line 349 of file Transform3D.h.

349 {
350 return ! operator==(transform);
351 }
bool operator==(const Transform3D &transform) const
Definition: Transform3D.cc:220
G4bool transform(G4String &input, const G4String &type)

References operator==(), and G4coutFormatters::anonymous_namespace{G4coutFormatters.cc}::transform().

◆ operator()()

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

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

Definition at line 23 of file Transform3D.cc.

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

References dx_, dy_, dz_, xx_, xy_, xz_, yx_, yy_, yz_, zx_, zy_, and zz_.

◆ operator*()

Transform3D HepGeom::Transform3D::operator* ( const Transform3D b) const

Transformation by another Transform3D.

Definition at line 51 of file Transform3D.cc.

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

References dx_, dy_, dz_, Transform3D(), xx_, xy_, xz_, yx_, yy_, yz_, zx_, zy_, and zz_.

◆ operator=() [1/2]

Transform3D & HepGeom::Transform3D::operator= ( const Transform3D mt)
default

Assignment.

◆ operator=() [2/2]

Transform3D & HepGeom::Transform3D::operator= ( Transform3D &&  mt)
default

Move assignment.

◆ operator==()

bool HepGeom::Transform3D::operator== ( const Transform3D transform) const

Test for equality.

Definition at line 220 of file Transform3D.cc.

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

References dx_, dy_, dz_, xx_, xy_, xz_, yx_, yy_, yz_, zx_, zy_, and zz_.

Referenced by operator!=().

◆ operator[]()

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

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

◆ setIdentity()

void HepGeom::Transform3D::setIdentity ( )
inline

Sets the Identity transformation.

Definition at line 294 of file Transform3D.h.

294 {
295 xy_= xz_= dx_= yx_= yz_= dy_= zx_= zy_= dz_= 0; xx_= yy_= zz_= 1;
296 }

References dx_, dy_, dz_, xx_, xy_, xz_, yx_, yy_, yz_, zx_, zy_, and zz_.

Referenced by HepGeom::Reflect3D::Reflect3D(), and Transform3D().

◆ setTransform()

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 185 of file Transform3D.h.

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

References dx_, dy_, dz_, xx_, xy_, xz_, yx_, yy_, yz_, zx_, zy_, and zz_.

Referenced by HepGeom::Reflect3D::Reflect3D(), HepGeom::Rotate3D::Rotate3D(), HepGeom::RotateX3D::RotateX3D(), HepGeom::RotateY3D::RotateY3D(), HepGeom::RotateZ3D::RotateZ3D(), and Transform3D().

◆ xx()

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

◆ xy()

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

◆ xz()

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

◆ yx()

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

◆ yy()

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

◆ yz()

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

◆ zx()

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

◆ zy()

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

◆ zz()

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

Field Documentation

◆ dx_

double HepGeom::Transform3D::dx_
protected

◆ dy_

double HepGeom::Transform3D::dy_
protected

◆ dz_

double HepGeom::Transform3D::dz_
protected

◆ Identity

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

Global identity transformation.

Definition at line 196 of file Transform3D.h.

Referenced by G4GMocrenFileSceneHandler::Detector::clear(), G4GDMLWriteStructure::TraverseVolumeTree(), and G4GDMLWrite::Write().

◆ xx_

double HepGeom::Transform3D::xx_
protected

◆ xy_

double HepGeom::Transform3D::xy_
protected

◆ xz_

double HepGeom::Transform3D::xz_
protected

◆ yx_

double HepGeom::Transform3D::yx_
protected

◆ yy_

double HepGeom::Transform3D::yy_
protected

◆ yz_

double HepGeom::Transform3D::yz_
protected

◆ zx_

double HepGeom::Transform3D::zx_
protected

◆ zy_

double HepGeom::Transform3D::zy_
protected

◆ zz_

double HepGeom::Transform3D::zz_
protected

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