CLHEP VERSION Reference Documentation
   
CLHEP Home Page     CLHEP Documentation     CLHEP Bug Reports

AxisAngle.cc

Go to the documentation of this file.
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 = std::sin( aa.delta() );
00024   register double cosDelta = std::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;             // std::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  std::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

Generated on 15 Nov 2012 for CLHEP by  doxygen 1.4.7