G4AffineTransform.icc

Go to the documentation of this file.
00001 //
00002 // ********************************************************************
00003 // * License and Disclaimer                                           *
00004 // *                                                                  *
00005 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
00006 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
00007 // * conditions of the Geant4 Software License,  included in the file *
00008 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
00009 // * include a list of copyright holders.                             *
00010 // *                                                                  *
00011 // * Neither the authors of this software system, nor their employing *
00012 // * institutes,nor the agencies providing financial support for this *
00013 // * work  make  any representation or  warranty, express or implied, *
00014 // * regarding  this  software system or assume any liability for its *
00015 // * use.  Please see the license in the file  LICENSE  and URL above *
00016 // * for the full disclaimer and the limitation of liability.         *
00017 // *                                                                  *
00018 // * This  code  implementation is the result of  the  scientific and *
00019 // * technical work of the GEANT4 collaboration.                      *
00020 // * By using,  copying,  modifying or  distributing the software (or *
00021 // * any work based  on the software)  you  agree  to acknowledge its *
00022 // * use  in  resulting  scientific  publications,  and indicate your *
00023 // * acceptance of all terms of the Geant4 Software license.          *
00024 // ********************************************************************
00025 //
00026 //
00027 // $Id$
00028 //
00029 //
00030 // G4AffineTransformation Inline implementation
00031 //
00032 // --------------------------------------------------------------------
00033 
00034 inline G4AffineTransform::G4AffineTransform()
00035  : rxx(1),rxy(0),rxz(0),
00036    ryx(0),ryy(1),ryz(0),
00037    rzx(0),rzy(0),rzz(1),
00038    tx(0),ty(0),tz(0)
00039 {}
00040 
00041 inline G4AffineTransform::G4AffineTransform(const G4ThreeVector& tlate)
00042  : rxx(1),rxy(0),rxz(0),
00043    ryx(0),ryy(1),ryz(0),
00044    rzx(0),rzy(0),rzz(1),
00045    tx(tlate.x()),ty(tlate.y()),tz(tlate.z())
00046 {}
00047 
00048 inline G4AffineTransform::G4AffineTransform(const G4RotationMatrix& rot)
00049  : rxx(rot.xx()),rxy(rot.xy()),rxz(rot.xz()),
00050    ryx(rot.yx()),ryy(rot.yy()),ryz(rot.yz()),
00051    rzx(rot.zx()),rzy(rot.zy()),rzz(rot.zz()),
00052    tx(0),ty(0),tz(0)
00053 {}
00054 
00055 inline G4AffineTransform::G4AffineTransform( const G4RotationMatrix& rot,
00056                                              const G4ThreeVector& tlate   )
00057  : rxx(rot.xx()),rxy(rot.xy()),rxz(rot.xz()),
00058    ryx(rot.yx()),ryy(rot.yy()),ryz(rot.yz()),
00059    rzx(rot.zx()),rzy(rot.zy()),rzz(rot.zz()),
00060    tx(tlate.x()),ty(tlate.y()),tz(tlate.z())
00061 {}
00062 
00063 inline G4AffineTransform::G4AffineTransform( const G4RotationMatrix *rot,
00064                                              const G4ThreeVector& tlate)
00065  : tx(tlate.x()),ty(tlate.y()),tz(tlate.z())
00066 {
00067   if (rot)
00068     {
00069       rxx=rot->xx();rxy=rot->xy();rxz=rot->xz();
00070       ryx=rot->yx();ryy=rot->yy();ryz=rot->yz();
00071       rzx=rot->zx();rzy=rot->zy();rzz=rot->zz();
00072     }
00073   else
00074     {
00075       rxx=1; rxy=0; rxz=0;
00076       ryx=0; ryy=1; ryz=0;
00077       rzx=0; rzy=0; rzz=1;
00078     }
00079 }
00080 
00081 inline 
00082 G4AffineTransform::
00083 G4AffineTransform( const G4double prxx,const G4double prxy,const G4double prxz,
00084                    const G4double pryx,const G4double pryy,const G4double pryz,
00085                    const G4double przx,const G4double przy,const G4double przz,
00086                    const G4double ptx,const G4double pty,const G4double ptz)
00087  : rxx(prxx),rxy(prxy),rxz(prxz),
00088    ryx(pryx),ryy(pryy),ryz(pryz),
00089    rzx(przx),rzy(przy),rzz(przz),
00090    tx(ptx),ty(pty),tz(ptz)
00091 {}
00092 
00093 inline G4AffineTransform
00094 G4AffineTransform::operator * (const G4AffineTransform& tf) const
00095 {
00096         return G4AffineTransform(
00097         rxx*tf.rxx+rxy*tf.ryx+rxz*tf.rzx,
00098         rxx*tf.rxy+rxy*tf.ryy+rxz*tf.rzy,
00099         rxx*tf.rxz+rxy*tf.ryz+rxz*tf.rzz,
00100 
00101         ryx*tf.rxx+ryy*tf.ryx+ryz*tf.rzx,
00102         ryx*tf.rxy+ryy*tf.ryy+ryz*tf.rzy,
00103         ryx*tf.rxz+ryy*tf.ryz+ryz*tf.rzz,
00104 
00105         rzx*tf.rxx+rzy*tf.ryx+rzz*tf.rzx,
00106         rzx*tf.rxy+rzy*tf.ryy+rzz*tf.rzy,
00107         rzx*tf.rxz+rzy*tf.ryz+rzz*tf.rzz,
00108         
00109         tx*tf.rxx+ty*tf.ryx+tz*tf.rzx+tf.tx,
00110         tx*tf.rxy+ty*tf.ryy+tz*tf.rzy+tf.ty,
00111         tx*tf.rxz+ty*tf.ryz+tz*tf.rzz+tf.tz);
00112 }
00113 
00114 inline G4AffineTransform&
00115 G4AffineTransform::operator *= (const G4AffineTransform& tf)
00116 {
00117          // Use temporaries for `in place' compound transform computation
00118 
00119         G4double nrxx=rxx*tf.rxx+rxy*tf.ryx+rxz*tf.rzx;
00120         G4double nrxy=rxx*tf.rxy+rxy*tf.ryy+rxz*tf.rzy;
00121         G4double nrxz=rxx*tf.rxz+rxy*tf.ryz+rxz*tf.rzz;
00122 
00123         G4double nryx=ryx*tf.rxx+ryy*tf.ryx+ryz*tf.rzx;
00124         G4double nryy=ryx*tf.rxy+ryy*tf.ryy+ryz*tf.rzy;
00125         G4double nryz=ryx*tf.rxz+ryy*tf.ryz+ryz*tf.rzz;
00126 
00127         G4double nrzx=rzx*tf.rxx+rzy*tf.ryx+rzz*tf.rzx;
00128         G4double nrzy=rzx*tf.rxy+rzy*tf.ryy+rzz*tf.rzy;
00129         G4double nrzz=rzx*tf.rxz+rzy*tf.ryz+rzz*tf.rzz;
00130         
00131         G4double ntx=tx*tf.rxx+ty*tf.ryx+tz*tf.rzx+tf.tx;
00132         G4double nty=tx*tf.rxy+ty*tf.ryy+tz*tf.rzy+tf.ty;
00133         G4double ntz=tx*tf.rxz+ty*tf.ryz+tz*tf.rzz+tf.tz;
00134 
00135         tx=ntx; ty=nty; tz=ntz;
00136         rxx=nrxx; rxy=nrxy; rxz=nrxz;
00137         ryx=nryx; ryy=nryy; ryz=nryz;
00138         rzx=nrzx; rzy=nrzy; rzz=nrzz;
00139 
00140         return *this;
00141 }
00142 
00143 inline G4AffineTransform&
00144 G4AffineTransform::Product(const G4AffineTransform& tf1,
00145                            const G4AffineTransform& tf2)
00146 {
00147         rxx=tf1.rxx*tf2.rxx + tf1.rxy*tf2.ryx + tf1.rxz*tf2.rzx;
00148         rxy=tf1.rxx*tf2.rxy + tf1.rxy*tf2.ryy + tf1.rxz*tf2.rzy;
00149         rxz=tf1.rxx*tf2.rxz + tf1.rxy*tf2.ryz + tf1.rxz*tf2.rzz;
00150 
00151         ryx=tf1.ryx*tf2.rxx + tf1.ryy*tf2.ryx + tf1.ryz*tf2.rzx;
00152         ryy=tf1.ryx*tf2.rxy + tf1.ryy*tf2.ryy + tf1.ryz*tf2.rzy;
00153         ryz=tf1.ryx*tf2.rxz + tf1.ryy*tf2.ryz + tf1.ryz*tf2.rzz;
00154 
00155         rzx=tf1.rzx*tf2.rxx + tf1.rzy*tf2.ryx + tf1.rzz*tf2.rzx;
00156         rzy=tf1.rzx*tf2.rxy + tf1.rzy*tf2.ryy + tf1.rzz*tf2.rzy;
00157         rzz=tf1.rzx*tf2.rxz + tf1.rzy*tf2.ryz + tf1.rzz*tf2.rzz;
00158         
00159         tx=tf1.tx*tf2.rxx + tf1.ty*tf2.ryx + tf1.tz*tf2.rzx   + tf2.tx;
00160         ty=tf1.tx*tf2.rxy + tf1.ty*tf2.ryy + tf1.tz*tf2.rzy   + tf2.ty;
00161         tz=tf1.tx*tf2.rxz + tf1.ty*tf2.ryz + tf1.tz*tf2.rzz   + tf2.tz; 
00162         
00163         return *this;
00164 }
00165 
00166 inline G4AffineTransform&
00167 G4AffineTransform::InverseProduct( const G4AffineTransform& tf1,
00168                                    const G4AffineTransform& tf2)
00169 {
00170         G4double itf2tx = - tf2.tx*tf2.rxx - tf2.ty*tf2.rxy - tf2.tz*tf2.rxz;
00171         G4double itf2ty = - tf2.tx*tf2.ryx - tf2.ty*tf2.ryy - tf2.tz*tf2.ryz;
00172         G4double itf2tz = - tf2.tx*tf2.rzx - tf2.ty*tf2.rzy - tf2.tz*tf2.rzz;
00173 
00174         rxx=tf1.rxx*tf2.rxx+tf1.rxy*tf2.rxy+tf1.rxz*tf2.rxz;
00175         rxy=tf1.rxx*tf2.ryx+tf1.rxy*tf2.ryy+tf1.rxz*tf2.ryz;
00176         rxz=tf1.rxx*tf2.rzx+tf1.rxy*tf2.rzy+tf1.rxz*tf2.rzz;
00177 
00178         ryx=tf1.ryx*tf2.rxx+tf1.ryy*tf2.rxy+tf1.ryz*tf2.rxz;
00179         ryy=tf1.ryx*tf2.ryx+tf1.ryy*tf2.ryy+tf1.ryz*tf2.ryz;
00180         ryz=tf1.ryx*tf2.rzx+tf1.ryy*tf2.rzy+tf1.ryz*tf2.rzz;
00181 
00182         rzx=tf1.rzx*tf2.rxx+tf1.rzy*tf2.rxy+tf1.rzz*tf2.rxz;
00183         rzy=tf1.rzx*tf2.ryx+tf1.rzy*tf2.ryy+tf1.rzz*tf2.ryz;
00184         rzz=tf1.rzx*tf2.rzx+tf1.rzy*tf2.rzy+tf1.rzz*tf2.rzz;
00185         
00186         tx=tf1.tx*tf2.rxx+tf1.ty*tf2.rxy+tf1.tz*tf2.rxz+itf2tx;
00187         ty=tf1.tx*tf2.ryx+tf1.ty*tf2.ryy+tf1.tz*tf2.ryz+itf2ty;
00188         tz=tf1.tx*tf2.rzx+tf1.ty*tf2.rzy+tf1.tz*tf2.rzz+itf2tz;
00189 
00190         return *this;
00191 }
00192 
00193 inline
00194 G4ThreeVector G4AffineTransform::TransformPoint(const G4ThreeVector& vec) const
00195 {
00196         return G4ThreeVector( vec.x()*rxx + vec.y()*ryx + vec.z()*rzx   + tx,
00197                               vec.x()*rxy + vec.y()*ryy + vec.z()*rzy   + ty,
00198                               vec.x()*rxz + vec.y()*ryz + vec.z()*rzz   + tz  );
00199 }
00200 
00201 inline
00202 G4ThreeVector G4AffineTransform::TransformAxis(const G4ThreeVector& axis) const
00203 {
00204         return G4ThreeVector( axis.x()*rxx + axis.y()*ryx + axis.z()*rzx,
00205                               axis.x()*rxy + axis.y()*ryy + axis.z()*rzy,
00206                               axis.x()*rxz + axis.y()*ryz + axis.z()*rzz  );
00207 }
00208 
00209 inline
00210 void G4AffineTransform::ApplyPointTransform(G4ThreeVector& vec) const
00211 {
00212         G4double x = vec.x()*rxx + vec.y()*ryx + vec.z()*rzx    + tx;
00213         G4double y = vec.x()*rxy + vec.y()*ryy + vec.z()*rzy    + ty;
00214         G4double z = vec.x()*rxz + vec.y()*ryz + vec.z()*rzz    + tz;
00215 
00216         vec.setX(x);
00217         vec.setY(y);
00218         vec.setZ(z);
00219 }
00220 
00221 inline
00222 void G4AffineTransform::ApplyAxisTransform(G4ThreeVector& axis) const
00223 {
00224         G4double x = axis.x()*rxx + axis.y()*ryx + axis.z()*rzx;
00225         G4double y = axis.x()*rxy + axis.y()*ryy + axis.z()*rzy;
00226         G4double z = axis.x()*rxz + axis.y()*ryz + axis.z()*rzz;
00227 
00228         axis.setX(x);
00229         axis.setY(y);
00230         axis.setZ(z);
00231 }
00232 
00233 inline
00234 G4AffineTransform G4AffineTransform::Inverse() const
00235 {
00236         return G4AffineTransform( rxx, ryx, rzx,
00237                                   rxy, ryy, rzy,
00238                                   rxz, ryz, rzz,
00239 
00240                                  -tx*rxx - ty*rxy - tz*rxz,
00241                                  -tx*ryx - ty*ryy - tz*ryz,
00242                                  -tx*rzx - ty*rzy - tz*rzz  );
00243 }
00244 
00245 inline
00246 G4AffineTransform& G4AffineTransform::Invert()
00247 {
00248         G4double v1 = -tx*rxx - ty*rxy - tz*rxz;
00249         G4double v2 = -tx*ryx - ty*ryy - tz*ryz;
00250         G4double v3 = -tx*rzx - ty*rzy - tz*rzz;
00251 
00252         tx=v1; ty=v2; tz=v3;
00253 
00254         G4double tmp1=ryx; ryx=rxy; rxy=tmp1;
00255         G4double tmp2=rzx; rzx=rxz; rxz=tmp2;
00256         G4double tmp3=rzy; rzy=ryz; ryz=tmp3;
00257 
00258         return *this;
00259 
00260 }
00261 
00262 inline
00263 G4AffineTransform& G4AffineTransform::operator +=(const G4ThreeVector& tlate)
00264 {
00265         tx += tlate.x();
00266         ty += tlate.y();
00267         tz += tlate.z();
00268 
00269         return *this;
00270 }
00271 
00272 inline
00273 G4AffineTransform& G4AffineTransform::operator -=(const G4ThreeVector& tlate)
00274 {
00275         tx -= tlate.x();
00276         ty -= tlate.y();
00277         tz -= tlate.z();
00278 
00279         return *this;
00280 }
00281 
00282 inline
00283 G4bool G4AffineTransform::operator == (const G4AffineTransform& tf) const
00284 {
00285         return (tx==tf.tx&&ty==tf.ty&&tz==tf.tz&&
00286                 rxx==tf.rxx&&rxy==tf.rxy&&rxz==tf.rxz&&
00287                 ryx==tf.ryx&&ryy==tf.ryy&&ryz==tf.ryz&&
00288                 rzx==tf.rzx&&rzy==tf.rzy&&rzz==tf.rzz) ? true : false;
00289 }
00290 inline
00291 G4bool G4AffineTransform::operator != (const G4AffineTransform& tf) const
00292 {
00293         return (tx!=tf.tx||ty!=tf.ty||tz!=tf.tz||
00294                 rxx!=tf.rxx||rxy!=tf.rxy||rxz!=tf.rxz||
00295                 ryx!=tf.ryx||ryy!=tf.ryy||ryz!=tf.ryz||
00296                 rzx!=tf.rzx||rzy!=tf.rzy||rzz!=tf.rzz) ? true : false;
00297 }
00298 
00299 inline
00300 G4double G4AffineTransform::operator [] (const G4int n) const
00301 {
00302         G4double v = 0.0;
00303         switch(n)
00304                 {
00305                 case 0:
00306                         v=rxx;
00307                         break;
00308                 case 1:
00309                         v=rxy;
00310                         break;
00311                 case 2:
00312                         v=rxz;
00313                         break;
00314                 case 4:
00315                         v=ryx;
00316                         break;
00317                 case 5:
00318                         v=ryy;
00319                         break;
00320                 case 6:
00321                         v=ryz;
00322                         break;
00323                 case 8:
00324                         v=rzx;
00325                         break;
00326                 case 9:
00327                         v=rzy;
00328                         break;
00329                 case 10:
00330                         v=rzz;
00331                         break;
00332                 case 12:
00333                         v=tx;
00334                         break;
00335                 case 13:
00336                         v=ty;
00337                         break;
00338                 case 14:
00339                         v=tz;
00340                         break;
00341                 case 3:
00342                 case 7:
00343                 case 11:
00344                         break;
00345                 case 15:
00346                         v=1.0;
00347                         break;
00348                 }
00349         return v;
00350 }
00351 
00352 inline
00353 G4bool G4AffineTransform::IsRotated() const
00354 {
00355         return (rxx==1.0 && ryy==1.0 && rzz==1.0) ? false : true;
00356 }
00357 
00358 inline 
00359 G4bool G4AffineTransform::IsTranslated() const
00360 {
00361         return (tx || ty || tz) ? true:false;
00362 }
00363 
00364 inline G4RotationMatrix G4AffineTransform::NetRotation() const {
00365   G4RotationMatrix mat;
00366   return mat.rotateAxes(G4ThreeVector(rxx,ryx,rzx),
00367                         G4ThreeVector(rxy,ryy,rzy),
00368                         G4ThreeVector(rxz,ryz,rzz));
00369 }
00370 
00371 inline
00372 G4ThreeVector G4AffineTransform::NetTranslation() const
00373 {
00374         return G4ThreeVector(tx,ty,tz);
00375 }
00376 
00377 inline 
00378 void G4AffineTransform::SetNetRotation(const G4RotationMatrix& rot)
00379 {
00380         rxx=rot.xx();
00381         rxy=rot.xy();
00382         rxz=rot.xz();
00383         ryx=rot.yx();
00384         ryy=rot.yy();
00385         ryz=rot.yz();
00386         rzx=rot.zx();
00387         rzy=rot.zy();
00388         rzz=rot.zz();
00389 }
00390 
00391 inline
00392 void G4AffineTransform::SetNetTranslation(const G4ThreeVector& tlate)
00393 {
00394         tx=tlate.x();
00395         ty=tlate.y();
00396         tz=tlate.z();
00397 }

Generated on Mon May 27 17:47:38 2013 for Geant4 by  doxygen 1.4.7