CLHEP 2.0.4.7 Reference Documentation
CLHEP Home Page CLHEP Documentation CLHEP Bug Reports |
00001 // ---------------------------------------------------------------------- 00002 // 00003 // AxisAngle.cc 00004 // 00005 // History: 00006 // 23-Jan-1998 WEB Initial draft 00007 // 13-Mar-1998 WEB Corrected ZMpvAxisAngleRep 00008 // 15-Jun-1998 WEB Added namespace support 00009 // 26-Jul-2000 MF CLHEP version 00010 // 12-Apr-2001 MF NaN-proofing 00011 // 00012 // ---------------------------------------------------------------------- 00013 00014 #include "CLHEP/Vector/defs.h" 00015 #include "CLHEP/Vector/AxisAngle.h" 00016 00017 namespace CLHEP { 00018 00019 double HepAxisAngle::tolerance = Hep3Vector::ToleranceTicks * 1.0e-08; 00020 00021 static void ZMpvAxisAngleRep( const HepAxisAngle & aa, double array[] ) { 00022 00023 register double sinDelta = sin( aa.delta() ); 00024 register double cosDelta = cos( aa.delta() ); 00025 register double oneMinusCosDelta = 1.0 - cosDelta; 00026 00027 register double uX = aa.getAxis().getX(); 00028 register double uY = aa.getAxis().getY(); 00029 register double uZ = aa.getAxis().getZ(); 00030 00031 array[0] = oneMinusCosDelta * uX * uX + cosDelta; 00032 array[1] = oneMinusCosDelta * uX * uY - sinDelta * uZ; 00033 array[2] = oneMinusCosDelta * uX * uZ + sinDelta * uY; 00034 00035 array[3] = oneMinusCosDelta * uY * uX + sinDelta * uZ; 00036 array[4] = oneMinusCosDelta * uY * uY + cosDelta; 00037 array[5] = oneMinusCosDelta * uY * uZ - sinDelta * uX; 00038 00039 array[6] = oneMinusCosDelta * uZ * uX - sinDelta * uY; 00040 array[7] = oneMinusCosDelta * uZ * uY + sinDelta * uX; 00041 array[8] = oneMinusCosDelta * uZ * uZ + cosDelta; 00042 00043 } // ZMpvAxisAngleRep 00044 00045 00046 double HepAxisAngle::distance( const AA & aa ) const { 00047 00048 double thisRep[9]; 00049 double aaRep[9]; 00050 00051 ZMpvAxisAngleRep( *this, thisRep ); 00052 ZMpvAxisAngleRep( aa, aaRep ); 00053 00054 double sum = 0.0; 00055 for ( int i = 0; i < 9; i++ ) { 00056 sum += thisRep[i] * aaRep[i]; 00057 } 00058 00059 double d = 3.0 - sum; // NaN-proofing: 00060 return (d >= 0) ? d : 0; // sqrt(distance) is used in howNear() 00061 00062 } // HepAxisAngle::distance() 00063 00064 00065 bool HepAxisAngle::isNear( const AA & aa, Scalar epsilon ) const { 00066 00067 return distance( aa ) <= epsilon * epsilon; 00068 00069 } // HepAxisAngle::isNear() 00070 00071 00072 double HepAxisAngle::howNear( const AA & aa ) const { 00073 00074 return sqrt( distance( aa ) ); 00075 00076 } // HepAxisAngle::howNear() 00077 00078 00079 //-******************** 00080 // 00081 // Global methods 00082 // 00083 //-******************** 00084 00085 00086 std::ostream & operator<<(std::ostream & os, const HepAxisAngle & aa) { 00087 os << '(' << aa.axis() << ", " << aa.delta() << ')'; 00088 return os; 00089 } // operator<<() 00090 00091 00092 void ZMinputAxisAngle ( std::istream & is, 00093 double & x, double & y, double & z, 00094 double & delta ); 00095 00096 std::istream & operator>>(std::istream & is, HepAxisAngle & aa) { 00097 Hep3Vector axis; 00098 double delta; 00099 double x,y,z; 00100 ZMinputAxisAngle ( is, x, y, z, delta ); 00101 axis.set(x,y,z); 00102 aa.set ( axis, delta ); 00103 return is; 00104 } // operator>>() 00105 00106 } // namespace CLHEP