Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/externals/clhep/src/AxisAngle.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  1 // ----------------------------------------------------------------------
  2 //
  3 // AxisAngle.cc
  4 //
  5 // History:
  6 //   23-Jan-1998  WEB  Initial draft
  7 //   13-Mar-1998  WEB  Corrected ZMpvAxisAngleRep
  8 //   15-Jun-1998  WEB  Added namespace support
  9 //   26-Jul-2000  MF  CLHEP version
 10 //   12-Apr-2001  MF  NaN-proofing
 11 //
 12 // ----------------------------------------------------------------------
 13 
 14 #include "CLHEP/Vector/AxisAngle.h"
 15 #include "CLHEP/Vector/ThreeVector.h"
 16 
 17 #include <cmath>
 18 #include <ostream>
 19 
 20 namespace CLHEP  {
 21 
 22 double HepAxisAngle::tolerance = Hep3Vector::ToleranceTicks * 1.0e-08;
 23 
 24 static void ZMpvAxisAngleRep( const HepAxisAngle & aa, double array[] ) {
 25 
 26   double sinDelta = std::sin( aa.delta() );
 27   double cosDelta = std::cos( aa.delta() );
 28   double oneMinusCosDelta = 1.0 - cosDelta;
 29 
 30   double uX = aa.getAxis().getX();
 31   double uY = aa.getAxis().getY();
 32   double uZ = aa.getAxis().getZ();
 33 
 34   array[0] = oneMinusCosDelta * uX * uX  +  cosDelta;
 35   array[1] = oneMinusCosDelta * uX * uY  -  sinDelta * uZ;
 36   array[2] = oneMinusCosDelta * uX * uZ  +  sinDelta * uY;
 37 
 38   array[3] = oneMinusCosDelta * uY * uX  +  sinDelta * uZ;
 39   array[4] = oneMinusCosDelta * uY * uY  +  cosDelta;
 40   array[5] = oneMinusCosDelta * uY * uZ  -  sinDelta * uX;
 41 
 42   array[6] = oneMinusCosDelta * uZ * uX  -  sinDelta * uY;
 43   array[7] = oneMinusCosDelta * uZ * uY  +  sinDelta * uX;
 44   array[8] = oneMinusCosDelta * uZ * uZ  +  cosDelta;
 45 
 46 } // ZMpvAxisAngleRep
 47 
 48 
 49 double HepAxisAngle::distance( const AA & aa ) const  {
 50 
 51   double thisRep[9];
 52   double aaRep[9];
 53 
 54   ZMpvAxisAngleRep( *this, thisRep );
 55   ZMpvAxisAngleRep( aa,    aaRep );
 56 
 57   double sum = 0.0;
 58   for ( int i = 0; i < 9; i++ )  {
 59     sum += thisRep[i] * aaRep[i];
 60   }
 61 
 62   double d = 3.0 - sum;   // NaN-proofing: 
 63   return  (d >= 0) ? d : 0;             // std::sqrt(distance) is used in howNear()
 64 
 65 }  // HepAxisAngle::distance()
 66 
 67 
 68 bool HepAxisAngle::isNear( const AA & aa, Scalar epsilon ) const  {
 69 
 70   return  distance( aa ) <= epsilon * epsilon;
 71 
 72 }  // HepAxisAngle::isNear()
 73 
 74 
 75 double HepAxisAngle::howNear( const AA & aa ) const  {
 76 
 77   return  std::sqrt( distance( aa ) );
 78 
 79 }  // HepAxisAngle::howNear()
 80 
 81 
 82 //-********************
 83 //
 84 // Global methods
 85 //
 86 //-********************
 87 
 88 
 89 std::ostream & operator<<(std::ostream & os, const HepAxisAngle & aa) {
 90   os << '(' << aa.axis() << ", " << aa.delta() << ')';
 91   return  os;
 92 }  // operator<<()
 93 
 94 
 95 void ZMinputAxisAngle ( std::istream & is, 
 96       double & x, double & y, double & z, 
 97                         double & delta );
 98 
 99 std::istream & operator>>(std::istream & is, HepAxisAngle & aa) {
100   Hep3Vector axis;
101   double delta;
102   double x,y,z;
103   ZMinputAxisAngle ( is, x, y, z, delta );
104   axis.set(x,y,z);
105   aa.set ( axis, delta );
106   return  is;
107 }  // operator>>()
108 
109 }  // namespace CLHEP
110