00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
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
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 }