61 #if !(defined(G4GEOM_USE_UTORUS) && defined(G4GEOM_USE_SYS_USOLIDS))
79 using namespace CLHEP;
126 std::ostringstream message;
127 message <<
"Invalid swept radius for Solid: " <<
GetName() <<
G4endl
128 <<
" pRtor = " << pRtor <<
", pRmax = " << pRmax;
135 if ( pRmin < pRmax - 1.e2*kCarTolerance && pRmin >= 0 )
137 if (pRmin >= 1.e2*kCarTolerance) {
fRmin = pRmin ; }
138 else {
fRmin = 0.0 ; }
143 std::ostringstream message;
144 message <<
"Invalid values of radii for Solid: " <<
GetName() <<
G4endl
145 <<
" pRmin = " << pRmin <<
", pRmax = " << pRmax;
161 if (pDPhi > 0) {
fDPhi = pDPhi ; }
164 std::ostringstream message;
165 message <<
"Invalid Z delta-Phi for Solid: " <<
GetName() <<
G4endl
166 <<
" pDPhi = " << pDPhi;
188 :
G4CSGSolid(a), fRmin(0.), fRmax(0.), fRtor(0.), fSPhi(0.),
189 fDPhi(0.), fRminTolerance(0.), fRmaxTolerance(0. ),
190 kRadTolerance(0.), kAngTolerance(0.),
191 halfCarTolerance(0.), halfAngTolerance(0.)
207 :
G4CSGSolid(rhs), fRmin(rhs.fRmin),fRmax(rhs.fRmax),
208 fRtor(rhs.fRtor),fSPhi(rhs.fSPhi),fDPhi(rhs.fDPhi),
209 fRminTolerance(rhs.fRminTolerance), fRmaxTolerance(rhs.fRmaxTolerance),
210 kRadTolerance(rhs.kRadTolerance), kAngTolerance(rhs.kAngTolerance),
211 halfCarTolerance(rhs.halfCarTolerance),
212 halfAngTolerance(rhs.halfAngTolerance)
224 if (
this == &rhs) {
return *
this; }
264 std::vector<G4double>& roots )
const
272 G4double pDotV = p.x()*v.x() + p.y()*v.y() + p.z()*v.z() ;
273 G4double pRad2 = p.x()*p.x() + p.y()*p.y() + p.z()*p.z() ;
277 c[2] = 2*(pRad2 + 2*pDotV*pDotV - Rtor2 - r2 + 2*Rtor2*v.z()*v.z()) ;
278 c[3] = 4*(pDotV*(pRad2 - Rtor2 - r2) + 2*Rtor2*p.z()*v.z()) ;
279 c[4] = pRad2*pRad2 - 2*pRad2*(Rtor2+r2)
280 + 4*Rtor2*p.z()*p.z() + (Rtor2-r2)*(Rtor2-r2) ;
284 num = torusEq.
FindRoots( c, 4, srd, si );
286 for ( i = 0; i < num; i++ )
288 if( si[i] == 0. ) { roots.push_back(srd[i]) ; }
291 std::sort(roots.begin() , roots.end() ) ;
304 G4bool IsDistanceToIn )
const
313 std::vector<G4double> roots ;
314 std::vector<G4double> rootsrefined ;
321 for (
size_t k = 0 ; k<roots.size() ; k++ )
331 if ( rootsrefined.size()==roots.size() )
333 t = t + rootsrefined[k] ;
339 G4double theta = std::atan2(ptmp.y(),ptmp.x());
361 if ( IsDistanceToIn ==
true )
370 p.y()*(1-
fRtor/std::sqrt(p.x()*p.x()
376 if ( r ==
GetRmin() ) { scal = -scal ; }
377 if ( scal < 0 ) {
return 0.0 ; }
384 if ( IsDistanceToIn ==
false )
392 p.y()*(1-
fRtor/std::sqrt(p.x()*p.x()
398 if ( r ==
GetRmin() ) { scal = -scal ; }
399 if ( scal > 0 ) {
return 0.0 ; }
432 pMin.set(-rext,-rext,-dz);
433 pMax.set( rext, rext, dz);
442 pMin.set(vmin.x(),vmin.y(),-dz);
443 pMax.set(vmax.x(),vmax.y(), dz);
448 if (pMin.x() >= pMax.x() || pMin.y() >= pMax.y() || pMin.z() >= pMax.z())
450 std::ostringstream message;
451 message <<
"Bad bounding box (min >= max) for solid: "
453 <<
"\npMin = " << pMin
454 <<
"\npMax = " << pMax;
478 if (
true)
return bbox.
CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax);
482 return exist = (pMin < pMax) ?
true :
false;
499 static const G4int NPHI = 24;
500 static const G4int NDISK = 16;
501 static const G4double sinHalfDisk = std::sin(
pi/NDISK);
502 static const G4double cosHalfDisk = std::cos(
pi/NDISK);
503 static const G4double sinStepDisk = 2.*sinHalfDisk*cosHalfDisk;
504 static const G4double cosStepDisk = 1. - 2.*sinHalfDisk*sinHalfDisk;
507 G4int kphi = (dphi <= astep) ? 1 : (
G4int)((dphi-
deg)/astep) + 1;
510 G4double sinHalf = std::sin(0.5*ang);
511 G4double cosHalf = std::cos(0.5*ang);
512 G4double sinStep = 2.*sinHalf*cosHalf;
513 G4double cosStep = 1. - 2.*sinHalf*sinHalf;
517 for (
G4int k=0; k<NDISK+1; ++k) pols[k].resize(4);
519 std::vector<const G4ThreeVectorList *> polygons;
520 polygons.resize(NDISK+1);
521 for (
G4int k=0; k<NDISK+1; ++k) polygons[k] = &pols[k];
527 if ((rtor-rmin*sinHalfDisk)/cosHalf > (rtor+rmin*sinHalfDisk)) rmin = 0;
531 for (
G4int k=0; k<NDISK; ++k)
533 G4double rmincur = rtor + rmin*cosCurDisk;
534 if (cosCurDisk < 0 && rmin > 0) rmincur /= cosHalf;
535 rzmin[k].set(rmincur,rmin*sinCurDisk);
537 G4double rmaxcur = rtor + rmax*cosCurDisk;
538 if (cosCurDisk > 0) rmaxcur /= cosHalf;
539 rzmax[k].set(rmaxcur,rmax*sinCurDisk);
542 sinCurDisk = sinCurDisk*cosStepDisk + cosCurDisk*sinStepDisk;
543 cosCurDisk = cosCurDisk*cosStepDisk - sinTmpDisk*sinStepDisk;
552 G4double sinCur1 = 0, cosCur1 = 0, sinCur2 = 0, cosCur2 = 0;
553 for (
G4int i=0; i<kphi+1; ++i)
559 sinCur2 = sinCur1*cosHalf + cosCur1*sinHalf;
560 cosCur2 = cosCur1*cosHalf - sinCur1*sinHalf;
566 sinCur2 = (i == kphi) ? sinEnd : sinCur1*cosStep + cosCur1*sinStep;
567 cosCur2 = (i == kphi) ? cosEnd : cosCur1*cosStep - sinCur1*sinStep;
569 for (
G4int k=0; k<NDISK; ++k)
571 G4double r1 = rzmin[k].x(), r2 = rzmax[k].x();
572 G4double z1 = rzmin[k].y(), z2 = rzmax[k].y();
573 pols[k][0].set(r1*cosCur1,r1*sinCur1,z1);
574 pols[k][1].set(r2*cosCur1,r2*sinCur1,z2);
575 pols[k][2].set(r2*cosCur2,r2*sinCur2,z2);
576 pols[k][3].set(r1*cosCur2,r1*sinCur2,z1);
578 pols[NDISK] = pols[0];
583 DiskExtent(rint,rext,sinCur1,cosCur1,sinCur2,cosCur2,vmin,vmax);
584 bmin.setX(vmin.x()); bmin.setY(vmin.y());
585 bmax.setX(vmax.x()); bmax.setY(vmax.y());
590 if (!benv.
CalculateExtent(pAxis,pVoxelLimit,pTransform,emin,emax))
continue;
591 if (emin < pMin) pMin = emin;
592 if (emax > pMax) pMax =
emax;
593 if (eminlim > pMin && emaxlim < pMax)
break;
595 return (pMin < pMax);
604 G4double r2, pt2, pPhi, tolRMin, tolRMax ;
610 r2 = p.x()*p.x() + p.y()*p.y() ;
618 if (pt2 >= tolRMin*tolRMin && pt2 <= tolRMax*tolRMax )
629 pPhi = std::atan2(p.y(),p.x()) ;
666 if (tolRMin < 0 ) { tolRMin = 0 ; }
668 if ( (pt2 >= tolRMin*tolRMin) && (pt2 <= tolRMax*tolRMax) )
676 pPhi = std::atan2(p.y(),p.x()) ;
715 G4int noSurfaces = 0;
729 rho2 = p.x()*p.x() + p.y()*p.y();
730 rho = std::sqrt(rho2);
731 pt2 = rho2+p.z()*p.z() +
fRtor * (
fRtor-2*rho);
733 pt = std::sqrt(pt2) ;
738 if( rho > delta && pt != 0.0 )
751 pPhi = std::atan2(p.y(),p.x());
756 distSPhi = std::fabs( pPhi -
fSPhi );
762 if( distRMax <= delta )
767 else if(
fRmin && (distRMin <= delta) )
778 if (distSPhi <= dAngle)
783 if (distEPhi <= dAngle)
789 if ( noSurfaces == 0 )
799 ed <<
" ERROR> Surface Normal was called for Torus,"
800 <<
" with point not on surface." <<
G4endl;
804 ed <<
" ERROR> Surface Normal has not found a surface, "
805 <<
" despite the point being on the surface. " <<
G4endl;
816 ed <<
" Coordinates of point : " << p <<
G4endl;
817 ed <<
" Parameters of solid : " << G4endl << *
this <<
G4endl;
821 G4Exception(
"G4Torus::SurfaceNormal(p)",
"GeomSolids1002",
823 "Failing to find normal, even though point is on surface!");
827 static const char* NameInside[3]= {
"Inside",
"Surface",
"Outside" };
828 ed <<
" The point is " << NameInside[inIt] <<
" the solid. "<<
G4endl;
829 G4Exception(
"G4Torus::SurfaceNormal(p)",
"GeomSolids1002",
835 else if ( noSurfaces == 1 ) { norm = sumnorm; }
836 else { norm = sumnorm.unit(); }
851 G4double distRMin,distRMax,distSPhi,distEPhi,distMin;
853 rho2 = p.x()*p.x() + p.y()*p.y();
854 rho = std::sqrt(rho2) ;
856 pt = std::sqrt(pt2) ;
859 G4cout <<
" G4Torus::ApproximateSurfaceNormal called for point " << p
863 distRMax = std::fabs(pt -
fRmax) ;
867 distRMin = std::fabs(pt -
fRmin) ;
869 if (distRMin < distRMax)
887 phi = std::atan2(p.y(),p.x()) ;
889 if (phi < 0) { phi +=
twopi ; }
892 else { distSPhi = std::fabs(phi-
fSPhi)*rho ; }
894 distEPhi = std::fabs(phi -
fSPhi -
fDPhi)*rho ;
896 if (distSPhi < distEPhi)
898 if (distSPhi<distMin) side =
kNSPhi ;
902 if (distEPhi < distMin) { side =
kNEPhi ; }
909 -p.y()*(1-
fRtor/rho)/pt,
914 p.y()*(1-
fRtor/rho)/pt,
927 "Undefined side for valid surface normal to solid.");
968 G4double cPhi,sinCPhi=0.,cosCPhi=0.;
985 cPhi =
fSPhi + hDPhi ;
986 sinCPhi = std::sin(cPhi) ;
987 cosCPhi = std::cos(cPhi) ;
1013 if ( sd[0] < snxt ) { snxt = sd[0] ; }
1028 sinSPhi = std::sin(
fSPhi) ;
1029 cosSPhi = std::cos(
fSPhi) ;
1030 Comp = v.x()*sinSPhi - v.y()*cosSPhi ;
1034 Dist = (p.y()*cosSPhi - p.x()*sinSPhi) ;
1041 if ( sphi < 0 ) { sphi = 0 ; }
1043 xi = p.x() + sphi*v.x() ;
1044 yi = p.y() + sphi*v.y() ;
1045 zi = p.z() + sphi*v.z() ;
1046 rhoi2 = xi*xi + yi*yi ;
1047 it2 = std::fabs(rhoi2 + zi*zi + Rtor2 - 2*fRtor*std::sqrt(rhoi2)) ;
1049 if ( it2 >= tolORMin2 && it2 <= tolORMax2 )
1054 if ((yi*cosCPhi-xi*sinCPhi)<=0) { snxt=sphi; }
1060 sinEPhi=std::sin(ePhi);
1061 cosEPhi=std::cos(ePhi);
1062 Comp=-(v.x()*sinEPhi-v.y()*cosEPhi);
1066 Dist = -(p.y()*cosEPhi - p.x()*sinEPhi) ;
1074 if (sphi < 0 ) { sphi = 0 ; }
1076 xi = p.x() + sphi*v.x() ;
1077 yi = p.y() + sphi*v.y() ;
1078 zi = p.z() + sphi*v.z() ;
1079 rhoi2 = xi*xi + yi*yi ;
1080 it2 = std::fabs(rhoi2 + zi*zi + Rtor2 - 2*fRtor*std::sqrt(rhoi2)) ;
1082 if (it2 >= tolORMin2 && it2 <= tolORMax2)
1087 if ((yi*cosCPhi-xi*sinCPhi)>=0) { snxt=sphi; }
1108 G4double phiC, cosPhiC, sinPhiC, safePhi, ePhi, cosPsi ;
1111 rho2 = p.x()*p.x() + p.y()*p.y() ;
1112 rho = std::sqrt(rho2) ;
1114 pt = std::sqrt(pt2) ;
1116 safe1 =
fRmin - pt ;
1117 safe2 = pt -
fRmax ;
1119 if (safe1 > safe2) { safe = safe1; }
1120 else { safe = safe2; }
1125 cosPhiC = std::cos(phiC) ;
1126 sinPhiC = std::sin(phiC) ;
1127 cosPsi = (p.x()*cosPhiC + p.y()*sinPhiC)/rho ;
1129 if (cosPsi < std::cos(
fDPhi*0.5) )
1131 if ((p.y()*cosPhiC - p.x()*sinPhiC) <= 0 )
1133 safePhi = std::fabs(p.x()*std::sin(
fSPhi) - p.y()*std::cos(
fSPhi)) ;
1138 safePhi = std::fabs(p.x()*std::sin(ePhi) - p.y()*std::cos(ePhi)) ;
1140 if (safePhi > safe) { safe = safePhi ; }
1143 if (safe < 0 ) { safe = 0 ; }
1164 G4double sinSPhi, cosSPhi, ePhi, sinEPhi, cosEPhi;
1166 G4double pDistS, compS, pDistE, compE, sphi2, xi, yi, zi, vphi ;
1178 G4double rho2 = p.x()*p.x()+p.y()*p.y();
1186 pt2= std::fabs( pt2 );
1191 G4double pDotV = p.x()*v.x() + p.y()*v.y() + p.z()*v.z() ;
1195 G4double vDotNmax = pDotV -
fRtor*(v.x()*p.x() + v.y()*p.y())/rho ;
1198 if( (pt2 > tolRMax*tolRMax) && (vDotNmax >= 0) )
1204 if ( calcNorm && (pDotxyNmax >= -2.*fRmaxTolerance) )
1207 p.y()*(1 -
fRtor/rho)/pt,
1224 if ( (pt2 < tolRMin*tolRMin) && (vDotNmax < 0) )
1226 if (calcNorm) { *validNorm = false ; }
1256 if ( calcNorm && (snxt == 0.0) )
1258 *validNorm = false ;
1266 sinSPhi = std::sin(
fSPhi) ;
1267 cosSPhi = std::cos(
fSPhi) ;
1269 sinEPhi = std::sin(ePhi) ;
1270 cosEPhi = std::cos(ePhi) ;
1271 cPhi =
fSPhi + fDPhi*0.5 ;
1272 sinCPhi = std::sin(cPhi) ;
1273 cosCPhi = std::cos(cPhi) ;
1278 vphi = std::atan2(v.y(),v.x()) ;
1283 if ( p.x() || p.y() )
1285 pDistS = p.x()*sinSPhi - p.y()*cosSPhi ;
1286 pDistE = -p.x()*sinEPhi + p.y()*cosEPhi ;
1290 compS = -sinSPhi*v.x() + cosSPhi*v.y() ;
1291 compE = sinEPhi*v.x() - cosEPhi*v.y() ;
1303 sphi = pDistS/compS ;
1307 xi = p.x() + sphi*v.x() ;
1308 yi = p.y() + sphi*v.y() ;
1323 else if ( yi*cosCPhi-xi*sinCPhi >=0 )
1344 sphi2 = pDistE/compE ;
1350 xi = p.x() + sphi2*v.x() ;
1351 yi = p.y() + sphi2*v.y() ;
1367 if ( (yi*cosCPhi-xi*sinCPhi) >= 0)
1389 vphi = std::atan2(v.y(),v.x());
1412 G4double rhoi2,rhoi,it2,it,iDotxyNmax ;
1421 xi = p.x() + snxt*v.x() ;
1422 yi =p.y() + snxt*v.y() ;
1423 zi = p.z() + snxt*v.z() ;
1424 rhoi2 = xi*xi + yi*yi ;
1425 rhoi = std::sqrt(rhoi2) ;
1427 it = std::sqrt(it2) ;
1428 iDotxyNmax = (1-
fRtor/rhoi) ;
1429 if(iDotxyNmax >= -2.*fRmaxTolerance)
1432 yi*(1-
fRtor/rhoi)/it,
1438 *validNorm = false ;
1443 *validNorm = false ;
1454 *validNorm = false ;
1466 *validNorm = false ;
1476 std::ostringstream message;
1477 G4int oldprc = message.precision(16);
1478 message <<
"Undefined side for valid surface normal to solid."
1480 <<
"Position:" << G4endl << G4endl
1481 <<
"p.x() = " << p.x()/
mm <<
" mm" << G4endl
1482 <<
"p.y() = " << p.y()/
mm <<
" mm" << G4endl
1483 <<
"p.z() = " << p.z()/
mm <<
" mm" << G4endl << G4endl
1484 <<
"Direction:" << G4endl << G4endl
1485 <<
"v.x() = " << v.x() << G4endl
1486 <<
"v.y() = " << v.y() << G4endl
1487 <<
"v.z() = " << v.z() << G4endl << G4endl
1488 <<
"Proposed distance :" << G4endl << G4endl
1489 <<
"snxt = " << snxt/
mm <<
" mm" <<
G4endl;
1490 message.precision(oldprc);
1509 G4double safePhi,phiC,cosPhiC,sinPhiC,ePhi;
1510 rho2 = p.x()*p.x() + p.y()*p.y() ;
1511 rho = std::sqrt(rho2) ;
1513 pt = std::sqrt(pt2) ;
1525 G4cout.precision(oldprc);
1526 G4Exception(
"G4Torus::DistanceToOut(p)",
"GeomSolids1002",
1533 safeR1 = pt -
fRmin ;
1534 safeR2 =
fRmax - pt ;
1536 if (safeR1 < safeR2) { safe = safeR1 ; }
1537 else { safe = safeR2 ; }
1549 cosPhiC = std::cos(phiC) ;
1550 sinPhiC = std::sin(phiC) ;
1552 if ((p.y()*cosPhiC-p.x()*sinPhiC)<=0)
1554 safePhi = -(p.x()*std::sin(
fSPhi) - p.y()*std::cos(
fSPhi)) ;
1559 safePhi = (p.x()*std::sin(ePhi) - p.y()*std::cos(ePhi)) ;
1561 if (safePhi < safe) { safe = safePhi ; }
1563 if (safe < 0) { safe = 0 ; }
1591 G4int oldprc = os.precision(16);
1592 os <<
"-----------------------------------------------------------\n"
1593 <<
" *** Dump for solid - " <<
GetName() <<
" ***\n"
1594 <<
" ===================================================\n"
1595 <<
" Solid type: G4Torus\n"
1596 <<
" Parameters: \n"
1597 <<
" inner radius: " <<
fRmin/
mm <<
" mm \n"
1598 <<
" outer radius: " <<
fRmax/
mm <<
" mm \n"
1599 <<
" swept radius: " <<
fRtor/
mm <<
" mm \n"
1600 <<
" starting phi: " <<
fSPhi/
degree <<
" degrees \n"
1601 <<
" delta phi : " <<
fDPhi/
degree <<
" degrees \n"
1602 <<
"-----------------------------------------------------------\n";
1603 os.precision(oldprc);
1614 G4double cosu, sinu,cosv, sinv, aOut, aIn, aSide, chose, phi, theta, rRand;
1619 cosu = std::cos(phi); sinu = std::sin(phi);
1620 cosv = std::cos(theta); sinv = std::sin(theta);
1636 else if( (chose >= aOut) && (chose < aOut + aIn) )
1641 else if( (chose >= aOut + aIn) && (chose < aOut + aIn + aSide) )
1645 (
fRtor+rRand*cosv)*std::sin(
fSPhi), rRand*sinv);
1670 #endif // !defined(G4GEOM_USE_TORUS) || !defined(G4GEOM_USE_SYS_USOLIDS)
EInside Inside(const G4ThreeVector &p) const
ThreeVector shoot(const G4int Ap, const G4int Af)
G4Polyhedron * CreatePolyhedron() const
static constexpr double mm
static const G4double kInfinity
std::ostringstream G4ExceptionDescription
CLHEP::Hep3Vector G4ThreeVector
G4bool fRebuildPolyhedron
G4Torus & operator=(const G4Torus &rhs)
std::ostream & StreamInfo(std::ostream &os) const
std::vector< ExP01TrackerHit * > a
G4double GetRadiusInRing(G4double rmin, G4double rmax) const
G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const
G4double SolveNumericJT(const G4ThreeVector &p, const G4ThreeVector &v, G4double r, G4bool IsDistanceToIn) const
G4double GetSinStartPhi() const
virtual void AddSolid(const G4Box &)=0
G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pmin, G4double &pmax) const
static constexpr double twopi
G4double GetSinEndPhi() const
void Extent(G4ThreeVector &pMin, G4ThreeVector &pMax) const
G4GLOB_DLL std::ostream G4cout
static constexpr double degree
G4double GetCosEndPhi() const
G4double GetRadialTolerance() const
G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimits, const G4Transform3D &pTransform3D, G4double &pMin, G4double &pMax) const
G4bool BoundingBoxVsVoxelLimits(const EAxis pAxis, const G4VoxelLimits &pVoxelLimits, const G4Transform3D &pTransform3D, G4double &pMin, G4double &pMax) const
G4Torus(const G4String &pName, G4double pRmin, G4double pRmax, G4double pRtor, G4double pSPhi, G4double pDPhi)
G4ThreeVector SurfaceNormal(const G4ThreeVector &p) const
std::vector< G4ThreeVector > G4ThreeVectorList
G4ThreeVector GetPointOnSurface() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
static const G4double emax
virtual void ComputeDimensions(G4Box &, const G4int, const G4VPhysicalVolume *) const
G4double GetCosStartPhi() const
void ComputeDimensions(G4VPVParameterisation *p, const G4int n, const G4VPhysicalVolume *pRep)
G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=G4bool(false), G4bool *validNorm=0, G4ThreeVector *n=0) const
G4double halfCarTolerance
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4double halfAngTolerance
CLHEP::Hep2Vector G4TwoVector
G4GeometryType GetEntityType() const
void TorusRootsJT(const G4ThreeVector &p, const G4ThreeVector &v, G4double r, std::vector< G4double > &roots) const
static constexpr double pi
void SetAllParameters(G4double pRmin, G4double pRmax, G4double pRtor, G4double pSPhi, G4double pDPhi)
static constexpr double deg
G4double GetMaxExtent(const EAxis pAxis) const
void DescribeYourselfTo(G4VGraphicsScene &scene) const
G4CSGSolid & operator=(const G4CSGSolid &rhs)
G4int FindRoots(G4double *op, G4int degree, G4double *zeror, G4double *zeroi)
G4double GetAngularTolerance() const
G4double GetMinExtent(const EAxis pAxis) const
static G4GeometryTolerance * GetInstance()
G4ThreeVector ApproxSurfaceNormal(const G4ThreeVector &p) const