42 #if !defined(G4GEOM_USE_UORB)
56 using namespace CLHEP;
86 "Invalid radius < 10*kCarTolerance.");
115 :
G4CSGSolid(rhs), fRmax(rhs.fRmax), fRmaxTolerance(rhs.fRmaxTolerance)
127 if (
this == &rhs) {
return *
this; }
170 G4double diff1,diff2,delta,maxDiff,newMin,newMax;
251 if ( yoff1 >= 0 && yoff2 >= 0 )
263 delta=fRmax*fRmax-yoff1*yoff1;
264 diff1=(delta>0.) ? std::sqrt(delta) : 0.;
265 delta=fRmax*fRmax-yoff2*yoff2;
266 diff2=(delta>0.) ? std::sqrt(delta) : 0.;
267 maxDiff=(diff1>diff2) ? diff1:diff2;
268 newMin=xoffset-maxDiff;
269 newMax=xoffset+maxDiff;
270 pMin=(newMin<xMin) ? xMin : newMin;
271 pMax=(newMax>xMax) ? xMax : newMax;
277 if (xoff1>=0&&xoff2>=0)
289 delta=fRmax*fRmax-xoff1*xoff1;
290 diff1=(delta>0.) ? std::sqrt(delta) : 0.;
291 delta=fRmax*fRmax-xoff2*xoff2;
292 diff2=(delta>0.) ? std::sqrt(delta) : 0.;
293 maxDiff=(diff1>diff2) ? diff1:diff2;
294 newMin=yoffset-maxDiff;
295 newMax=yoffset+maxDiff;
296 pMin=(newMin<yMin) ? yMin : newMin;
297 pMax=(newMax>yMax) ? yMax : newMax;
326 rad2 = p.x()*p.x()+p.y()*p.y()+p.z()*p.z();
336 if ( radius <= tolRMax ) { in =
kInside; }
340 if ( radius <= tolRMax ) { in =
kSurface; }
356 G4double radius = std::sqrt(p.x()*p.x()+p.y()*p.y()+p.z()*p.z());
361 norm =
G4ThreeVector(p.x()/radius,p.y()/radius,p.z()/radius);
366 "Undefined side for valid surface normal to solid.");
394 radius = std::sqrt(p.x()*p.x() + p.y()*p.y() + p.z()*p.z());
395 pDotV3d = p.x()*v.x() + p.y()*v.y() + p.z()*v.z();
425 d2 = pDotV3d*pDotV3d - c;
429 sd = -pDotV3d - std::sqrt(d2);
434 G4double fTerm = sd - std::fmod(sd,dRmax);
449 d2 = pDotV3d*pDotV3d - c;
464 G4Exception(
"G4Orb::DistanceToIn(p,v)",
"GeomSolids1002",
481 radius = std::sqrt(p.x()*p.x()+p.y()*p.y()+p.z()*p.z());
482 safe = radius -
fRmax;
483 if( safe < 0 ) { safe = 0.; }
505 rad2 = p.x()*p.x() + p.y()*p.y() + p.z()*p.z();
506 pDotV3d = p.x()*v.x() + p.y()*v.y() + p.z()*v.z();
527 if ( radius <= Rmax_plus )
542 d2 = pDotV3d*pDotV3d - c;
545 ( ( pDotV3d >= 0 ) || ( d2 < 0 )) )
557 snxt = -pDotV3d + std::sqrt(d2);
566 std::ostringstream message;
567 G4int oldprc = message.precision(16);
568 message <<
"Logic error: snxt = kInfinity ???" << G4endl
569 <<
"Position:" << G4endl << G4endl
570 <<
"p.x() = " << p.x()/
mm <<
" mm" << G4endl
571 <<
"p.y() = " << p.y()/
mm <<
" mm" << G4endl
572 <<
"p.z() = " << p.z()/
mm <<
" mm" << G4endl << G4endl
573 <<
"Rp = "<< std::sqrt( p.x()*p.x()+p.y()*p.y()+p.z()*p.z() )/
mm
574 <<
" mm" << G4endl << G4endl
575 <<
"Direction:" << G4endl << G4endl
576 <<
"v.x() = " << v.x() << G4endl
577 <<
"v.y() = " << v.y() << G4endl
578 <<
"v.z() = " << v.z() << G4endl << G4endl
579 <<
"Proposed distance :" << G4endl << G4endl
580 <<
"snxt = " << snxt/
mm <<
" mm" <<
G4endl;
581 message.precision(oldprc);
582 G4Exception(
"G4Orb::DistanceToOut(p,v,..)",
"GeomSolids1002",
599 std::ostringstream message;
600 G4int oldprc = message.precision(16);
601 message <<
"Undefined side for valid surface normal to solid."
603 <<
"Position:" << G4endl << G4endl
604 <<
"p.x() = " << p.x()/
mm <<
" mm" << G4endl
605 <<
"p.y() = " << p.y()/
mm <<
" mm" << G4endl
606 <<
"p.z() = " << p.z()/
mm <<
" mm" << G4endl << G4endl
607 <<
"Direction:" << G4endl << G4endl
608 <<
"v.x() = " << v.x() << G4endl
609 <<
"v.y() = " << v.y() << G4endl
610 <<
"v.z() = " << v.z() << G4endl << G4endl
611 <<
"Proposed distance :" << G4endl << G4endl
612 <<
"snxt = " << snxt/
mm <<
" mm" <<
G4endl;
613 message.precision(oldprc);
614 G4Exception(
"G4Orb::DistanceToOut(p,v,..)",
"GeomSolids1002",
628 G4double safe=0.0,radius = std::sqrt(p.x()*p.x()+p.y()*p.y()+p.z()*p.z());
641 G4Exception(
"G4Orb::DistanceToOut(p)",
"GeomSolids1002",
646 safe =
fRmax - radius;
647 if ( safe < 0. ) safe = 0.;
666 return new G4Orb(*
this);
675 G4int oldprc = os.precision(16);
676 os <<
"-----------------------------------------------------------\n"
677 <<
" *** Dump for solid - " <<
GetName() <<
" ***\n"
678 <<
" ===================================================\n"
679 <<
" Solid type: G4Orb\n"
682 <<
" outer radius: " <<
fRmax/
mm <<
" mm \n"
683 <<
"-----------------------------------------------------------\n";
684 os.precision(oldprc);
ThreeVector shoot(const G4int Ap, const G4int Af)
static const G4double kInfinity
G4Orb & operator=(const G4Orb &rhs)
G4double GetMinYExtent() const
CLHEP::Hep3Vector G4ThreeVector
G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pmin, G4double &pmax) const
G4bool IsYLimited() const
void DescribeYourselfTo(G4VGraphicsScene &scene) const
G4bool IsXLimited() const
G4ThreeVector GetPointOnSurface() const
virtual void AddSolid(const G4Box &)=0
EInside Inside(const G4ThreeVector &p) const
G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const
G4Polyhedron * CreatePolyhedron() const
G4Orb(const G4String &pName, G4double pRmax)
std::ostream & StreamInfo(std::ostream &os) const
G4double GetMaxXExtent() const
G4double GetMinZExtent() const
G4GLOB_DLL std::ostream G4cout
G4GeometryType GetEntityType() const
G4double GetRadialTolerance() const
void ComputeDimensions(G4VPVParameterisation *p, const G4int n, const G4VPhysicalVolume *pRep)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
virtual void ComputeDimensions(G4Box &, const G4int, const G4VPhysicalVolume *) const
G4double GetMinXExtent() const
G4double GetMaxZExtent() const
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4double GetMaxYExtent() const
G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=G4bool(false), G4bool *validNorm=0, G4ThreeVector *n=0) const
G4CSGSolid & operator=(const G4CSGSolid &rhs)
G4bool IsZLimited() const
static G4GeometryTolerance * GetInstance()
G4ThreeVector SurfaceNormal(const G4ThreeVector &p) const