diff -uNr source.orig/geometry/solids/CSG/src/G4Tubs.cc source/geometry/solids/CSG/src/G4Tubs.cc --- source.orig/geometry/solids/CSG/src/G4Tubs.cc Thu Mar 22 00:01:24 2001 +++ source/geometry/solids/CSG/src/G4Tubs.cc Fri Mar 23 22:57:20 2001 @@ -29,6 +29,8 @@ // 31.10.00 V.Grichine, assign sr, sphi in Distance ToOut(p,v,...) // 28.11.00 V.Grichine, bug fixed in Inside(p) +// 22.03.01 K.Hoshina, bug fixed in Inside(p) + #include "G4Tubs.hh" #include "G4VoxelLimits.hh" @@ -334,46 +336,40 @@ { G4double r2,pPhi,tolRMin,tolRMax; EInside in = kOutside ; - + if (fabs(p.z()) <= fDz - kCarTolerance*0.5) - { - r2 = p.x()*p.x() + p.y()*p.y() ; - - if (fRMin) tolRMin = fRMin + kRadTolerance*0.5 ; - else tolRMin = 0 ; - - tolRMax = fRMax - kRadTolerance*0.5 ; - + { + r2 = p.x()*p.x() + p.y()*p.y() ; + tolRMax = fRMax - kRadTolerance*0.5 ; + if (fRMin){ + tolRMin = fRMin + kRadTolerance*0.5 ; + } else { + tolRMin = 0. ; + } + if (r2 >= tolRMin*tolRMin && r2 <= tolRMax*tolRMax) { - if ( fDPhi == 2*M_PI || r2 == 0 ) in = kInside ; + if ( fDPhi == 2*M_PI || r2 == 0. ) + { + in = kInside ; + } else { -// Try inner tolerant phi boundaries (=>inside) -// if not inside, try outer tolerant phi boundaries - - pPhi = atan2(p.y(),p.x()) ; - - if ( pPhi < 0 ) pPhi += 2*M_PI ; // 0<=pPhi<2pi - - if ( fSPhi >= 0 ) - { - if ( pPhi >= fSPhi + kAngTolerance*0.5 && - pPhi <= fSPhi + fDPhi-kAngTolerance*0.5 ) in = kInside ; + // Try inner tolerant phi boundaries (=>inside) + // if not inside, try outer tolerant phi boundaries - else if ( pPhi >= fSPhi - kAngTolerance*0.5 && - pPhi <= fSPhi + fDPhi + kAngTolerance*0.5 ) in = kSurface ; + pPhi = atan2(p.y(),p.x()) - (fSPhi - kAngTolerance*0.5) ; + while(pPhi < 0.) pPhi += 2*M_PI ; // 0<=pPhi<2pi + while(pPhi >= 2*M_PI) pPhi -= 2*M_PI ; // 0<=pPhi<2pi + + if ( pPhi >= kAngTolerance && pPhi <= fDPhi) + { + in = kInside ; } - else + else if ( pPhi >= 0. && pPhi <= fDPhi + kAngTolerance ) { - // if (pPhi < fSPhi + 2*M_PI) pPhi += 2*M_PI ; - - if ( pPhi >= fSPhi + 2*M_PI + kAngTolerance*0.5 && - pPhi <= fSPhi + fDPhi + 2*M_PI - kAngTolerance*0.5) in = kInside ; - - else if (pPhi >= fSPhi+2*M_PI-kAngTolerance*0.5 && - pPhi <= fSPhi+fDPhi+2*M_PI+kAngTolerance*0.5) in = kSurface ; - } + in = kSurface ; + } } } else // Try generous boundaries @@ -381,68 +377,53 @@ tolRMin = fRMin - kRadTolerance*0.5 ; tolRMax = fRMax + kRadTolerance*0.5 ; - if ( tolRMin < 0 ) tolRMin = 0 ; + if ( tolRMin < 0. ) tolRMin = 0. ; if (r2 >= tolRMin*tolRMin && r2 <= tolRMax*tolRMax) { - if ( fDPhi == 2*M_PI || r2 == 0 ) // Continuous in phi or on z-axis + if ( fDPhi == 2*M_PI || r2 == 0. ) // Continuous in phi or on z-axis { in = kSurface ; } else // Try outer tolerant phi boundaries only { - pPhi = atan2(p.y(),p.x()) ; - - if ( pPhi < 0 ) pPhi += 2*M_PI ; // 0<=pPhi<2pi + pPhi = atan2(p.y(),p.x()) - (fSPhi - kAngTolerance*0.5) ; + while(pPhi < 0.) pPhi += 2*M_PI ; // 0<=pPhi<2pi + while(pPhi >= 2*M_PI) pPhi -= 2*M_PI ; // 0<=pPhi<2pi - if ( fSPhi >= 0 ) - { - if (pPhi >= fSPhi-kAngTolerance*0.5 && - pPhi <= fSPhi+fDPhi+kAngTolerance*0.5) in = kSurface ; - } - else - { - // if (pPhi < fSPhi + 2*M_PI ) pPhi += 2*M_PI ; - - if (pPhi >= fSPhi+2*M_PI-kAngTolerance*0.5 && - pPhi <= fSPhi+fDPhi+2*M_PI+kAngTolerance*0.5) in=kSurface; + if ( pPhi >= 0. && pPhi <= fDPhi+kAngTolerance) + { + in = kSurface ; } } } } } - else if (fabs(p.z()) <= fDz+kCarTolerance*0.5) // Check within tolerant r limits + else if (fabs(p.z()) <= fDz+kCarTolerance*0.5) // Check within tolerant z limits { r2 = p.x()*p.x() + p.y()*p.y() ; tolRMin = fRMin - kRadTolerance*0.5 ; tolRMax = fRMax + kRadTolerance*0.5 ; - if ( tolRMin < 0 ) tolRMin = 0 ; + if ( tolRMin < 0. ) tolRMin = 0. ; if ( r2 >= tolRMin*tolRMin && r2 <= tolRMax*tolRMax ) { - if (fDPhi == 2*M_PI || r2 == 0 ) // Continuous in phi or on z-axis + if (fDPhi == 2*M_PI || r2 == 0. ) // Continuous in phi or on z-axis { in = kSurface ; } else // Try outer tolerant phi boundaries { - pPhi = atan2(p.y(),p.x()) ; + pPhi = atan2(p.y(),p.x()) - (fSPhi - kAngTolerance*0.5) ; - if ( pPhi < 0 ) pPhi += 2*M_PI ; // 0<=pPhi<2pi + while(pPhi < 0.) pPhi += 2*M_PI ; // 0<=pPhi<2pi + while(pPhi >= 2*M_PI) pPhi -= 2*M_PI ; // 0<=pPhi<2pi - if ( fSPhi >= 0 ) - { - if (pPhi >= fSPhi-kAngTolerance*0.5 && - pPhi <= fSPhi+fDPhi+kAngTolerance*0.5) in=kSurface; + if ( pPhi >= 0. && pPhi <= fDPhi + kAngTolerance) + { + in = kSurface ; } - else - { - if ( pPhi < fSPhi + 2*M_PI ) pPhi += 2*M_PI ; - - if ( pPhi >= fSPhi+2*M_PI-kAngTolerance*0.5 && - pPhi <= fSPhi+fDPhi+2*M_PI+kAngTolerance*0.5) in = kSurface ; - } } } }