42 #if !defined(G4GEOM_USE_UORB) 56 using namespace CLHEP;
86 "Invalid radius < 10*kCarTolerance.");
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; }
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());
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",
641 G4Exception(
"G4Orb::DistanceToOut(p)",
"GeomSolids1002",
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);
G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const
ThreeVector shoot(const G4int Ap, const G4int Af)
G4double GetMinXExtent() const
G4GeometryType GetEntityType() const
static const G4double kInfinity
G4Orb & operator=(const G4Orb &rhs)
G4ThreeVector GetPointOnSurface() const
G4double GetMinYExtent() const
CLHEP::Hep3Vector G4ThreeVector
G4ThreeVector SurfaceNormal(const G4ThreeVector &p) const
G4double GetMinZExtent() const
G4bool IsYLimited() const
G4bool IsXLimited() const
void DescribeYourselfTo(G4VGraphicsScene &scene) const
G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=G4bool(false), G4bool *validNorm=0, G4ThreeVector *n=0) const
virtual void AddSolid(const G4Box &)=0
G4double GetMaxZExtent() const
G4Orb(const G4String &pName, G4double pRmax)
G4double GetMaxXExtent() const
G4GLOB_DLL std::ostream G4cout
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)
G4bool IsZLimited() const
std::ostream & StreamInfo(std::ostream &os) const
G4Polyhedron * CreatePolyhedron() const
EInside Inside(const G4ThreeVector &p) const
G4double GetMaxYExtent() const
G4CSGSolid & operator=(const G4CSGSolid &rhs)
static G4GeometryTolerance * GetInstance()
G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pmin, G4double &pmax) const
virtual void ComputeDimensions(G4Box &, const G4int, const G4VPhysicalVolume *) const