Geant4-11
Data Structures | Public Member Functions | Protected Member Functions | Protected Attributes | Private Member Functions | Private Attributes
G4Polyhedra Class Reference

#include <G4Polyhedra.hh>

Inheritance diagram for G4Polyhedra:
G4VCSGfaceted G4VSolid

Data Structures

struct  surface_element
 

Public Member Functions

void BoundingLimits (G4ThreeVector &pMin, G4ThreeVector &pMax) const
 
G4bool CalculateExtent (const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pmin, G4double &pmax) const
 
G4VSolidClone () const
 
void ComputeDimensions (G4VPVParameterisation *p, const G4int n, const G4VPhysicalVolume *pRep)
 
G4PolyhedronCreatePolyhedron () const
 
virtual void DescribeYourselfTo (G4VGraphicsScene &scene) const
 
G4double DistanceToIn (const G4ThreeVector &p) const
 
G4double DistanceToIn (const G4ThreeVector &p, const G4ThreeVector &v) const
 
virtual G4double DistanceToOut (const G4ThreeVector &p) const
 
virtual G4double DistanceToOut (const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=false, G4bool *validNorm=nullptr, G4ThreeVector *n=nullptr) const
 
void DumpInfo () const
 
G4double EstimateCubicVolume (G4int nStat, G4double epsilon) const
 
G4double EstimateSurfaceArea (G4int nStat, G4double ell) const
 
 G4Polyhedra (__void__ &)
 
 G4Polyhedra (const G4Polyhedra &source)
 
 G4Polyhedra (const G4String &name, G4double phiStart, G4double phiTotal, G4int numSide, G4int numRZ, const G4double r[], const G4double z[])
 
 G4Polyhedra (const G4String &name, G4double phiStart, G4double phiTotal, G4int numSide, G4int numZPlanes, const G4double zPlane[], const G4double rInner[], const G4double rOuter[])
 
G4double GetAreaAccuracy () const
 
G4int GetAreaStatistics () const
 
virtual G4VSolidGetConstituentSolid (G4int no)
 
virtual const G4VSolidGetConstituentSolid (G4int no) const
 
G4PolyhedraSideRZ GetCorner (const G4int index) const
 
G4double GetCosEndPhi () const
 
G4double GetCosStartPhi () const
 
G4double GetCubicVolume ()
 
G4double GetCubVolEpsilon () const
 
G4int GetCubVolStatistics () const
 
virtual G4DisplacedSolidGetDisplacedSolidPtr ()
 
virtual const G4DisplacedSolidGetDisplacedSolidPtr () const
 
G4double GetEndPhi () const
 
G4GeometryType GetEntityType () const
 
virtual G4VisExtent GetExtent () const
 
G4String GetName () const
 
G4int GetNumRZCorner () const
 
G4int GetNumSide () const
 
G4PolyhedraHistoricalGetOriginalParameters () const
 
G4ThreeVector GetPointOnSurface () const
 
virtual G4PolyhedronGetPolyhedron () const
 
G4double GetSinEndPhi () const
 
G4double GetSinStartPhi () const
 
G4double GetStartPhi () const
 
G4double GetSurfaceArea ()
 
G4double GetTolerance () const
 
EInside Inside (const G4ThreeVector &p) const
 
G4bool IsGeneric () const
 
G4bool IsOpen () const
 
G4Polyhedraoperator= (const G4Polyhedra &source)
 
G4bool operator== (const G4VSolid &s) const
 
G4bool Reset ()
 
void SetAreaAccuracy (G4double ep)
 
void SetAreaStatistics (G4int st)
 
void SetCubVolEpsilon (G4double ep)
 
void SetCubVolStatistics (G4int st)
 
void SetName (const G4String &name)
 
void SetOriginalParameters (G4PolyhedraHistorical *pars)
 
std::ostream & StreamInfo (std::ostream &os) const
 
virtual G4ThreeVector SurfaceNormal (const G4ThreeVector &p) const
 
virtual ~G4Polyhedra ()
 

Protected Member Functions

void CalculateClippedPolygonExtent (G4ThreeVectorList &pPolygon, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
 
void ClipBetweenSections (G4ThreeVectorList *pVertices, const G4int pSectionIndex, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
 
void ClipCrossSection (G4ThreeVectorList *pVertices, const G4int pSectionIndex, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
 
void ClipPolygon (G4ThreeVectorList &pPolygon, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis) const
 
void CopyStuff (const G4Polyhedra &source)
 
void CopyStuff (const G4VCSGfaceted &source)
 
void Create (G4double phiStart, G4double phiTotal, G4int numSide, G4ReduciblePolygon *rz)
 
void DeleteStuff ()
 
virtual G4double DistanceTo (const G4ThreeVector &p, const G4bool outgoing) const
 
G4ThreeVector GetPointOnSurfaceGeneric () const
 
void SetOriginalParameters (G4ReduciblePolygon *rz)
 
void SetSurfaceElements () const
 

Protected Attributes

G4PolyhedraSideRZcorners = nullptr
 
G4EnclosingCylinderenclosingCylinder = nullptr
 
G4double endPhi
 
G4VCSGface ** faces = nullptr
 
G4double fCubicVolume = 0.0
 
std::vector< surface_element > * fElements = nullptr
 
G4PolyhedronfpPolyhedron = nullptr
 
G4bool fRebuildPolyhedron = false
 
G4double fSurfaceArea = 0.0
 
G4bool genericPgon = false
 
G4double kCarTolerance
 
G4int numCorner = 0
 
G4int numFace = 0
 
G4int numSide = 0
 
G4PolyhedraHistoricaloriginal_parameters = nullptr
 
G4bool phiIsOpen = false
 
G4double startPhi
 

Private Member Functions

void ClipPolygonToSimpleLimits (G4ThreeVectorList &pPolygon, G4ThreeVectorList &outputPolygon, const G4VoxelLimits &pVoxelLimit) const
 

Private Attributes

G4double fAreaAccuracy
 
G4double fCubVolEpsilon
 
G4String fshapeName
 
G4int fStatistics
 

Detailed Description

Definition at line 74 of file G4Polyhedra.hh.

Constructor & Destructor Documentation

◆ G4Polyhedra() [1/4]

G4Polyhedra::G4Polyhedra ( const G4String name,
G4double  phiStart,
G4double  phiTotal,
G4int  numSide,
G4int  numZPlanes,
const G4double  zPlane[],
const G4double  rInner[],
const G4double  rOuter[] 
)

Definition at line 71 of file G4Polyhedra.cc.

80{
81 if (theNumSide <= 0)
82 {
83 std::ostringstream message;
84 message << "Solid must have at least one side - " << GetName() << G4endl
85 << " No sides specified !";
86 G4Exception("G4Polyhedra::G4Polyhedra()", "GeomSolids0002",
87 FatalErrorInArgument, message);
88 }
89
90 //
91 // Calculate conversion factor from G3 radius to G4 radius
92 //
93 G4double phiTotal = thePhiTotal;
94 if ( (phiTotal <=0) || (phiTotal >= twopi*(1-DBL_EPSILON)) )
95 { phiTotal = twopi; }
96 G4double convertRad = std::cos(0.5*phiTotal/theNumSide);
97
98 //
99 // Some historical stuff
100 //
102
103 original_parameters->numSide = theNumSide;
106 original_parameters->Num_z_planes = numZPlanes;
107 original_parameters->Z_values = new G4double[numZPlanes];
108 original_parameters->Rmin = new G4double[numZPlanes];
109 original_parameters->Rmax = new G4double[numZPlanes];
110
111 for (G4int i=0; i<numZPlanes; ++i)
112 {
113 if (( i < numZPlanes-1) && ( zPlane[i] == zPlane[i+1] ))
114 {
115 if( (rInner[i] > rOuter[i+1])
116 ||(rInner[i+1] > rOuter[i]) )
117 {
118 DumpInfo();
119 std::ostringstream message;
120 message << "Cannot create a Polyhedra with no contiguous segments."
121 << G4endl
122 << " Segments are not contiguous !" << G4endl
123 << " rMin[" << i << "] = " << rInner[i]
124 << " -- rMax[" << i+1 << "] = " << rOuter[i+1] << G4endl
125 << " rMin[" << i+1 << "] = " << rInner[i+1]
126 << " -- rMax[" << i << "] = " << rOuter[i];
127 G4Exception("G4Polyhedra::G4Polyhedra()", "GeomSolids0002",
128 FatalErrorInArgument, message);
129 }
130 }
131 original_parameters->Z_values[i] = zPlane[i];
132 original_parameters->Rmin[i] = rInner[i]/convertRad;
133 original_parameters->Rmax[i] = rOuter[i]/convertRad;
134 }
135
136
137 //
138 // Build RZ polygon using special PCON/PGON GEANT3 constructor
139 //
141 new G4ReduciblePolygon( rInner, rOuter, zPlane, numZPlanes );
142 rz->ScaleA( 1/convertRad );
143
144 //
145 // Do the real work
146 //
147 Create( phiStart, phiTotal, theNumSide, rz );
148
149 delete rz;
150}
@ FatalErrorInArgument
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:35
static constexpr double twopi
Definition: G4SIunits.hh:56
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4PolyhedraHistorical * original_parameters
Definition: G4Polyhedra.hh:189
void Create(G4double phiStart, G4double phiTotal, G4int numSide, G4ReduciblePolygon *rz)
Definition: G4Polyhedra.cc:188
void ScaleA(G4double scale)
G4VCSGfaceted(const G4String &name)
G4String GetName() const
void DumpInfo() const
const char * name(G4int ptype)
#define DBL_EPSILON
Definition: templates.hh:66

References Create(), DBL_EPSILON, G4VSolid::DumpInfo(), FatalErrorInArgument, G4endl, G4Exception(), G4VSolid::GetName(), G4PolyhedraHistorical::Num_z_planes, G4PolyhedraHistorical::numSide, G4PolyhedraHistorical::Opening_angle, original_parameters, G4PolyhedraHistorical::Rmax, G4PolyhedraHistorical::Rmin, G4ReduciblePolygon::ScaleA(), G4PolyhedraHistorical::Start_angle, twopi, and G4PolyhedraHistorical::Z_values.

Referenced by Clone().

◆ G4Polyhedra() [2/4]

G4Polyhedra::G4Polyhedra ( const G4String name,
G4double  phiStart,
G4double  phiTotal,
G4int  numSide,
G4int  numRZ,
const G4double  r[],
const G4double  z[] 
)

Definition at line 154 of file G4Polyhedra.cc.

161 : G4VCSGfaceted( name ), genericPgon(true)
162{
163 if (theNumSide <= 0)
164 {
165 std::ostringstream message;
166 message << "Solid must have at least one side - " << GetName() << G4endl
167 << " No sides specified !";
168 G4Exception("G4Polyhedra::G4Polyhedra()", "GeomSolids0002",
169 FatalErrorInArgument, message);
170 }
171
172 G4ReduciblePolygon* rz = new G4ReduciblePolygon( r, z, numRZ );
173
174 Create( phiStart, phiTotal, theNumSide, rz );
175
176 // Set original_parameters struct for consistency
177 //
179
180 delete rz;
181}
G4bool genericPgon
Definition: G4Polyhedra.hh:186
void SetOriginalParameters(G4PolyhedraHistorical *pars)

References Create(), FatalErrorInArgument, G4endl, G4Exception(), G4VSolid::GetName(), and SetOriginalParameters().

◆ ~G4Polyhedra()

G4Polyhedra::~G4Polyhedra ( )
virtual

Definition at line 365 of file G4Polyhedra.cc.

366{
367 delete [] corners;
368 delete original_parameters;
369 delete enclosingCylinder;
370 delete fElements;
371 delete fpPolyhedron;
372 corners = nullptr;
373 original_parameters = nullptr;
374 enclosingCylinder = nullptr;
375 fElements = nullptr;
376 fpPolyhedron = nullptr;
377}
G4PolyhedraSideRZ * corners
Definition: G4Polyhedra.hh:188
std::vector< surface_element > * fElements
Definition: G4Polyhedra.hh:194
G4EnclosingCylinder * enclosingCylinder
Definition: G4Polyhedra.hh:191
G4Polyhedron * fpPolyhedron

References corners, enclosingCylinder, fElements, G4VCSGfaceted::fpPolyhedron, and original_parameters.

◆ G4Polyhedra() [3/4]

G4Polyhedra::G4Polyhedra ( __void__ &  a)

Definition at line 358 of file G4Polyhedra.cc.

359 : G4VCSGfaceted(a), startPhi(0.), endPhi(0.)
360{
361}
G4double endPhi
Definition: G4Polyhedra.hh:184
G4double startPhi
Definition: G4Polyhedra.hh:183

◆ G4Polyhedra() [4/4]

G4Polyhedra::G4Polyhedra ( const G4Polyhedra source)

Definition at line 381 of file G4Polyhedra.cc.

383{
384 CopyStuff( source );
385}
void CopyStuff(const G4Polyhedra &source)
Definition: G4Polyhedra.cc:406

References CopyStuff().

Member Function Documentation

◆ BoundingLimits()

void G4Polyhedra::BoundingLimits ( G4ThreeVector pMin,
G4ThreeVector pMax 
) const
virtual

Reimplemented from G4VSolid.

Definition at line 549 of file G4Polyhedra.cc.

551{
552 G4double rmin = kInfinity, rmax = -kInfinity;
553 G4double zmin = kInfinity, zmax = -kInfinity;
554 for (G4int i=0; i<GetNumRZCorner(); ++i)
555 {
556 G4PolyhedraSideRZ corner = GetCorner(i);
557 if (corner.r < rmin) rmin = corner.r;
558 if (corner.r > rmax) rmax = corner.r;
559 if (corner.z < zmin) zmin = corner.z;
560 if (corner.z > zmax) zmax = corner.z;
561 }
562
563 G4double sphi = GetStartPhi();
564 G4double ephi = GetEndPhi();
565 G4double dphi = IsOpen() ? ephi-sphi : twopi;
566 G4int ksteps = GetNumSide();
567 G4double astep = dphi/ksteps;
568 G4double sinStep = std::sin(astep);
569 G4double cosStep = std::cos(astep);
570
571 G4double sinCur = GetSinStartPhi();
572 G4double cosCur = GetCosStartPhi();
573 if (!IsOpen()) rmin = 0.;
574 G4double xmin = rmin*cosCur, xmax = xmin;
575 G4double ymin = rmin*sinCur, ymax = ymin;
576 for (G4int k=0; k<ksteps+1; ++k)
577 {
578 G4double x = rmax*cosCur;
579 if (x < xmin) xmin = x;
580 if (x > xmax) xmax = x;
581 G4double y = rmax*sinCur;
582 if (y < ymin) ymin = y;
583 if (y > ymax) ymax = y;
584 if (rmin > 0)
585 {
586 G4double xx = rmin*cosCur;
587 if (xx < xmin) xmin = xx;
588 if (xx > xmax) xmax = xx;
589 G4double yy = rmin*sinCur;
590 if (yy < ymin) ymin = yy;
591 if (yy > ymax) ymax = yy;
592 }
593 G4double sinTmp = sinCur;
594 sinCur = sinCur*cosStep + cosCur*sinStep;
595 cosCur = cosCur*cosStep - sinTmp*sinStep;
596 }
597 pMin.set(xmin,ymin,zmin);
598 pMax.set(xmax,ymax,zmax);
599
600 // Check correctness of the bounding box
601 //
602 if (pMin.x() >= pMax.x() || pMin.y() >= pMax.y() || pMin.z() >= pMax.z())
603 {
604 std::ostringstream message;
605 message << "Bad bounding box (min >= max) for solid: "
606 << GetName() << " !"
607 << "\npMin = " << pMin
608 << "\npMax = " << pMax;
609 G4Exception("G4Polyhedra::BoundingLimits()", "GeomMgt0001",
610 JustWarning, message);
611 DumpInfo();
612 }
613}
@ JustWarning
static const G4double pMax
static const G4double pMin
G4int GetNumRZCorner() const
G4double GetSinStartPhi() const
G4bool IsOpen() const
G4double GetEndPhi() const
G4int GetNumSide() const
G4PolyhedraSideRZ GetCorner(const G4int index) const
G4double GetStartPhi() const
G4double GetCosStartPhi() const
static const G4double kInfinity
Definition: geomdefs.hh:41

References G4VSolid::DumpInfo(), G4Exception(), GetCorner(), GetCosStartPhi(), GetEndPhi(), G4VSolid::GetName(), GetNumRZCorner(), GetNumSide(), GetSinStartPhi(), GetStartPhi(), IsOpen(), JustWarning, kInfinity, pMax, pMin, G4PolyhedraSideRZ::r, twopi, and G4PolyhedraSideRZ::z.

Referenced by CalculateExtent().

◆ CalculateClippedPolygonExtent()

void G4VSolid::CalculateClippedPolygonExtent ( G4ThreeVectorList pPolygon,
const G4VoxelLimits pVoxelLimit,
const EAxis  pAxis,
G4double pMin,
G4double pMax 
) const
protectedinherited

Definition at line 489 of file G4VSolid.cc.

494{
495 G4int noLeft,i;
496 G4double component;
497
498 ClipPolygon(pPolygon,pVoxelLimit,pAxis);
499 noLeft = pPolygon.size();
500
501 if ( noLeft )
502 {
503 for (i=0; i<noLeft; ++i)
504 {
505 component = pPolygon[i].operator()(pAxis);
506
507 if (component < pMin)
508 {
509 pMin = component;
510 }
511 if (component > pMax)
512 {
513 pMax = component;
514 }
515 }
516 }
517}
void ClipPolygon(G4ThreeVectorList &pPolygon, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis) const
Definition: G4VSolid.cc:539

References G4VSolid::ClipPolygon(), pMax, and pMin.

Referenced by G4VSolid::ClipBetweenSections(), and G4VSolid::ClipCrossSection().

◆ CalculateExtent()

G4bool G4Polyhedra::CalculateExtent ( const EAxis  pAxis,
const G4VoxelLimits pVoxelLimit,
const G4AffineTransform pTransform,
G4double pmin,
G4double pmax 
) const
virtual

Reimplemented from G4VCSGfaceted.

Definition at line 617 of file G4Polyhedra.cc.

621{
622 G4ThreeVector bmin, bmax;
623 G4bool exist;
624
625 // Check bounding box (bbox)
626 //
627 BoundingLimits(bmin,bmax);
628 G4BoundingEnvelope bbox(bmin,bmax);
629#ifdef G4BBOX_EXTENT
630 return bbox.CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax);
631#endif
632 if (bbox.BoundingBoxVsVoxelLimits(pAxis,pVoxelLimit,pTransform,pMin,pMax))
633 {
634 return exist = (pMin < pMax) ? true : false;
635 }
636
637 // To find the extent, RZ contour of the polycone is subdivided
638 // in triangles. The extent is calculated as cumulative extent of
639 // all sub-polycones formed by rotation of triangles around Z
640 //
641 G4TwoVectorList contourRZ;
642 G4TwoVectorList triangles;
643 std::vector<G4int> iout;
644 G4double eminlim = pVoxelLimit.GetMinExtent(pAxis);
645 G4double emaxlim = pVoxelLimit.GetMaxExtent(pAxis);
646
647 // get RZ contour, ensure anticlockwise order of corners
648 for (G4int i=0; i<GetNumRZCorner(); ++i)
649 {
650 G4PolyhedraSideRZ corner = GetCorner(i);
651 contourRZ.push_back(G4TwoVector(corner.r,corner.z));
652 }
654 G4double area = G4GeomTools::PolygonArea(contourRZ);
655 if (area < 0.) std::reverse(contourRZ.begin(),contourRZ.end());
656
657 // triangulate RZ countour
658 if (!G4GeomTools::TriangulatePolygon(contourRZ,triangles))
659 {
660 std::ostringstream message;
661 message << "Triangulation of RZ contour has failed for solid: "
662 << GetName() << " !"
663 << "\nExtent has been calculated using boundary box";
664 G4Exception("G4Polyhedra::CalculateExtent()",
665 "GeomMgt1002",JustWarning,message);
666 return bbox.CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax);
667 }
668
669 // set trigonometric values
670 G4double sphi = GetStartPhi();
671 G4double ephi = GetEndPhi();
672 G4double dphi = IsOpen() ? ephi-sphi : twopi;
673 G4int ksteps = GetNumSide();
674 G4double astep = dphi/ksteps;
675 G4double sinStep = std::sin(astep);
676 G4double cosStep = std::cos(astep);
677 G4double sinStart = GetSinStartPhi();
678 G4double cosStart = GetCosStartPhi();
679
680 // allocate vector lists
681 std::vector<const G4ThreeVectorList *> polygons;
682 polygons.resize(ksteps+1);
683 for (G4int k=0; k<ksteps+1; ++k)
684 {
685 polygons[k] = new G4ThreeVectorList(3);
686 }
687
688 // main loop along triangles
689 pMin = kInfinity;
690 pMax = -kInfinity;
691 G4int ntria = triangles.size()/3;
692 for (G4int i=0; i<ntria; ++i)
693 {
694 G4double sinCur = sinStart;
695 G4double cosCur = cosStart;
696 G4int i3 = i*3;
697 for (G4int k=0; k<ksteps+1; ++k) // rotate triangle
698 {
699 G4ThreeVectorList* ptr = const_cast<G4ThreeVectorList*>(polygons[k]);
700 G4ThreeVectorList::iterator iter = ptr->begin();
701 iter->set(triangles[i3+0].x()*cosCur,
702 triangles[i3+0].x()*sinCur,
703 triangles[i3+0].y());
704 iter++;
705 iter->set(triangles[i3+1].x()*cosCur,
706 triangles[i3+1].x()*sinCur,
707 triangles[i3+1].y());
708 iter++;
709 iter->set(triangles[i3+2].x()*cosCur,
710 triangles[i3+2].x()*sinCur,
711 triangles[i3+2].y());
712
713 G4double sinTmp = sinCur;
714 sinCur = sinCur*cosStep + cosCur*sinStep;
715 cosCur = cosCur*cosStep - sinTmp*sinStep;
716 }
717
718 // set sub-envelope and adjust extent
719 G4double emin,emax;
720 G4BoundingEnvelope benv(polygons);
721 if (!benv.CalculateExtent(pAxis,pVoxelLimit,pTransform,emin,emax)) continue;
722 if (emin < pMin) pMin = emin;
723 if (emax > pMax) pMax = emax;
724 if (eminlim > pMin && emaxlim < pMax) break; // max possible extent
725 }
726 // free memory
727 for (G4int k=0; k<ksteps+1; ++k) { delete polygons[k]; polygons[k]=0;}
728 return (pMin < pMax);
729}
std::vector< G4ThreeVector > G4ThreeVectorList
static const G4double emax
std::vector< G4TwoVector > G4TwoVectorList
Definition: G4GeomTools.hh:42
CLHEP::Hep2Vector G4TwoVector
Definition: G4TwoVector.hh:36
bool G4bool
Definition: G4Types.hh:86
static G4bool TriangulatePolygon(const G4TwoVectorList &polygon, G4TwoVectorList &result)
Definition: G4GeomTools.cc:193
static void RemoveRedundantVertices(G4TwoVectorList &polygon, std::vector< G4int > &iout, G4double tolerance=0.0)
Definition: G4GeomTools.cc:305
static G4double PolygonArea(const G4TwoVectorList &polygon)
Definition: G4GeomTools.cc:76
void BoundingLimits(G4ThreeVector &pMin, G4ThreeVector &pMax) const
Definition: G4Polyhedra.cc:549
G4double kCarTolerance
Definition: G4VSolid.hh:299
G4double GetMinExtent(const EAxis pAxis) const
G4double GetMaxExtent(const EAxis pAxis) const

References G4BoundingEnvelope::BoundingBoxVsVoxelLimits(), BoundingLimits(), G4BoundingEnvelope::CalculateExtent(), emax, G4Exception(), GetCorner(), GetCosStartPhi(), GetEndPhi(), G4VoxelLimits::GetMaxExtent(), G4VoxelLimits::GetMinExtent(), G4VSolid::GetName(), GetNumRZCorner(), GetNumSide(), GetSinStartPhi(), GetStartPhi(), IsOpen(), JustWarning, G4VSolid::kCarTolerance, kInfinity, pMax, pMin, G4GeomTools::PolygonArea(), G4PolyhedraSideRZ::r, G4GeomTools::RemoveRedundantVertices(), G4GeomTools::TriangulatePolygon(), twopi, and G4PolyhedraSideRZ::z.

◆ ClipBetweenSections()

void G4VSolid::ClipBetweenSections ( G4ThreeVectorList pVertices,
const G4int  pSectionIndex,
const G4VoxelLimits pVoxelLimit,
const EAxis  pAxis,
G4double pMin,
G4double pMax 
) const
protectedinherited

Definition at line 444 of file G4VSolid.cc.

449{
450 G4ThreeVectorList polygon;
451 polygon.reserve(4);
452 polygon.push_back((*pVertices)[pSectionIndex]);
453 polygon.push_back((*pVertices)[pSectionIndex+4]);
454 polygon.push_back((*pVertices)[pSectionIndex+5]);
455 polygon.push_back((*pVertices)[pSectionIndex+1]);
456 CalculateClippedPolygonExtent(polygon,pVoxelLimit,pAxis,pMin,pMax);
457 polygon.clear();
458
459 polygon.push_back((*pVertices)[pSectionIndex+1]);
460 polygon.push_back((*pVertices)[pSectionIndex+5]);
461 polygon.push_back((*pVertices)[pSectionIndex+6]);
462 polygon.push_back((*pVertices)[pSectionIndex+2]);
463 CalculateClippedPolygonExtent(polygon,pVoxelLimit,pAxis,pMin,pMax);
464 polygon.clear();
465
466 polygon.push_back((*pVertices)[pSectionIndex+2]);
467 polygon.push_back((*pVertices)[pSectionIndex+6]);
468 polygon.push_back((*pVertices)[pSectionIndex+7]);
469 polygon.push_back((*pVertices)[pSectionIndex+3]);
470 CalculateClippedPolygonExtent(polygon,pVoxelLimit,pAxis,pMin,pMax);
471 polygon.clear();
472
473 polygon.push_back((*pVertices)[pSectionIndex+3]);
474 polygon.push_back((*pVertices)[pSectionIndex+7]);
475 polygon.push_back((*pVertices)[pSectionIndex+4]);
476 polygon.push_back((*pVertices)[pSectionIndex]);
477 CalculateClippedPolygonExtent(polygon,pVoxelLimit,pAxis,pMin,pMax);
478 return;
479}
void CalculateClippedPolygonExtent(G4ThreeVectorList &pPolygon, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
Definition: G4VSolid.cc:489

References G4VSolid::CalculateClippedPolygonExtent(), pMax, and pMin.

◆ ClipCrossSection()

void G4VSolid::ClipCrossSection ( G4ThreeVectorList pVertices,
const G4int  pSectionIndex,
const G4VoxelLimits pVoxelLimit,
const EAxis  pAxis,
G4double pMin,
G4double pMax 
) const
protectedinherited

Definition at line 414 of file G4VSolid.cc.

419{
420
421 G4ThreeVectorList polygon;
422 polygon.reserve(4);
423 polygon.push_back((*pVertices)[pSectionIndex]);
424 polygon.push_back((*pVertices)[pSectionIndex+1]);
425 polygon.push_back((*pVertices)[pSectionIndex+2]);
426 polygon.push_back((*pVertices)[pSectionIndex+3]);
427 CalculateClippedPolygonExtent(polygon,pVoxelLimit,pAxis,pMin,pMax);
428 return;
429}

References G4VSolid::CalculateClippedPolygonExtent(), pMax, and pMin.

◆ ClipPolygon()

void G4VSolid::ClipPolygon ( G4ThreeVectorList pPolygon,
const G4VoxelLimits pVoxelLimit,
const EAxis  pAxis 
) const
protectedinherited

Definition at line 539 of file G4VSolid.cc.

542{
543 G4ThreeVectorList outputPolygon;
544
545 if ( pVoxelLimit.IsLimited() )
546 {
547 if (pVoxelLimit.IsXLimited() ) // && pAxis != kXAxis)
548 {
549 G4VoxelLimits simpleLimit1;
550 simpleLimit1.AddLimit(kXAxis,pVoxelLimit.GetMinXExtent(),kInfinity);
551 ClipPolygonToSimpleLimits(pPolygon,outputPolygon,simpleLimit1);
552
553 pPolygon.clear();
554
555 if ( !outputPolygon.size() ) return;
556
557 G4VoxelLimits simpleLimit2;
558 simpleLimit2.AddLimit(kXAxis,-kInfinity,pVoxelLimit.GetMaxXExtent());
559 ClipPolygonToSimpleLimits(outputPolygon,pPolygon,simpleLimit2);
560
561 if ( !pPolygon.size() ) return;
562 else outputPolygon.clear();
563 }
564 if ( pVoxelLimit.IsYLimited() ) // && pAxis != kYAxis)
565 {
566 G4VoxelLimits simpleLimit1;
567 simpleLimit1.AddLimit(kYAxis,pVoxelLimit.GetMinYExtent(),kInfinity);
568 ClipPolygonToSimpleLimits(pPolygon,outputPolygon,simpleLimit1);
569
570 // Must always clear pPolygon - for clip to simpleLimit2 and in case of
571 // early exit
572
573 pPolygon.clear();
574
575 if ( !outputPolygon.size() ) return;
576
577 G4VoxelLimits simpleLimit2;
578 simpleLimit2.AddLimit(kYAxis,-kInfinity,pVoxelLimit.GetMaxYExtent());
579 ClipPolygonToSimpleLimits(outputPolygon,pPolygon,simpleLimit2);
580
581 if ( !pPolygon.size() ) return;
582 else outputPolygon.clear();
583 }
584 if ( pVoxelLimit.IsZLimited() ) // && pAxis != kZAxis)
585 {
586 G4VoxelLimits simpleLimit1;
587 simpleLimit1.AddLimit(kZAxis,pVoxelLimit.GetMinZExtent(),kInfinity);
588 ClipPolygonToSimpleLimits(pPolygon,outputPolygon,simpleLimit1);
589
590 // Must always clear pPolygon - for clip to simpleLimit2 and in case of
591 // early exit
592
593 pPolygon.clear();
594
595 if ( !outputPolygon.size() ) return;
596
597 G4VoxelLimits simpleLimit2;
598 simpleLimit2.AddLimit(kZAxis,-kInfinity,pVoxelLimit.GetMaxZExtent());
599 ClipPolygonToSimpleLimits(outputPolygon,pPolygon,simpleLimit2);
600
601 // Return after final clip - no cleanup
602 }
603 }
604}
void ClipPolygonToSimpleLimits(G4ThreeVectorList &pPolygon, G4ThreeVectorList &outputPolygon, const G4VoxelLimits &pVoxelLimit) const
Definition: G4VSolid.cc:612
G4bool IsYLimited() const
G4double GetMinZExtent() const
void AddLimit(const EAxis pAxis, const G4double pMin, const G4double pMax)
G4bool IsXLimited() const
G4double GetMaxYExtent() const
G4double GetMaxZExtent() const
G4double GetMinYExtent() const
G4double GetMinXExtent() const
G4bool IsZLimited() const
G4bool IsLimited() const
G4double GetMaxXExtent() const
@ kYAxis
Definition: geomdefs.hh:56
@ kXAxis
Definition: geomdefs.hh:55
@ kZAxis
Definition: geomdefs.hh:57

References G4VoxelLimits::AddLimit(), G4VSolid::ClipPolygonToSimpleLimits(), G4VoxelLimits::GetMaxXExtent(), G4VoxelLimits::GetMaxYExtent(), G4VoxelLimits::GetMaxZExtent(), G4VoxelLimits::GetMinXExtent(), G4VoxelLimits::GetMinYExtent(), G4VoxelLimits::GetMinZExtent(), G4VoxelLimits::IsLimited(), G4VoxelLimits::IsXLimited(), G4VoxelLimits::IsYLimited(), G4VoxelLimits::IsZLimited(), kInfinity, kXAxis, kYAxis, and kZAxis.

Referenced by G4VSolid::CalculateClippedPolygonExtent().

◆ ClipPolygonToSimpleLimits()

void G4VSolid::ClipPolygonToSimpleLimits ( G4ThreeVectorList pPolygon,
G4ThreeVectorList outputPolygon,
const G4VoxelLimits pVoxelLimit 
) const
privateinherited

Definition at line 612 of file G4VSolid.cc.

615{
616 G4int i;
617 G4int noVertices=pPolygon.size();
618 G4ThreeVector vEnd,vStart;
619
620 for (i = 0 ; i < noVertices ; ++i )
621 {
622 vStart = pPolygon[i];
623 if ( i == noVertices-1 ) vEnd = pPolygon[0];
624 else vEnd = pPolygon[i+1];
625
626 if ( pVoxelLimit.Inside(vStart) )
627 {
628 if (pVoxelLimit.Inside(vEnd))
629 {
630 // vStart and vEnd inside -> output end point
631 //
632 outputPolygon.push_back(vEnd);
633 }
634 else
635 {
636 // vStart inside, vEnd outside -> output crossing point
637 //
638 pVoxelLimit.ClipToLimits(vStart,vEnd);
639 outputPolygon.push_back(vEnd);
640 }
641 }
642 else
643 {
644 if (pVoxelLimit.Inside(vEnd))
645 {
646 // vStart outside, vEnd inside -> output inside section
647 //
648 pVoxelLimit.ClipToLimits(vStart,vEnd);
649 outputPolygon.push_back(vStart);
650 outputPolygon.push_back(vEnd);
651 }
652 else // Both point outside -> no output
653 {
654 // outputPolygon.push_back(vStart);
655 // outputPolygon.push_back(vEnd);
656 }
657 }
658 }
659}
G4bool ClipToLimits(G4ThreeVector &pStart, G4ThreeVector &pEnd) const
G4bool Inside(const G4ThreeVector &pVec) const

References G4VoxelLimits::ClipToLimits(), and G4VoxelLimits::Inside().

Referenced by G4VSolid::ClipPolygon().

◆ Clone()

G4VSolid * G4Polyhedra::Clone ( ) const
virtual

Reimplemented from G4VSolid.

Definition at line 749 of file G4Polyhedra.cc.

750{
751 return new G4Polyhedra(*this);
752}
G4Polyhedra(const G4String &name, G4double phiStart, G4double phiTotal, G4int numSide, G4int numZPlanes, const G4double zPlane[], const G4double rInner[], const G4double rOuter[])
Definition: G4Polyhedra.cc:71

References G4Polyhedra().

◆ ComputeDimensions()

void G4Polyhedra::ComputeDimensions ( G4VPVParameterisation p,
const G4int  n,
const G4VPhysicalVolume pRep 
)
virtual

Reimplemented from G4VSolid.

Definition at line 733 of file G4Polyhedra.cc.

736{
737 p->ComputeDimensions(*this,n,pRep);
738}
virtual void ComputeDimensions(G4Box &, const G4int, const G4VPhysicalVolume *) const

References G4VPVParameterisation::ComputeDimensions(), and CLHEP::detail::n.

◆ CopyStuff() [1/2]

void G4Polyhedra::CopyStuff ( const G4Polyhedra source)
protected

Definition at line 406 of file G4Polyhedra.cc.

407{
408 //
409 // Simple stuff
410 //
411 numSide = source.numSide;
412 startPhi = source.startPhi;
413 endPhi = source.endPhi;
414 phiIsOpen = source.phiIsOpen;
415 numCorner = source.numCorner;
416 genericPgon= source.genericPgon;
417
418 //
419 // The corner array
420 //
422
424 * sourceCorn = source.corners;
425 do // Loop checking, 13.08.2015, G.Cosmo
426 {
427 *corn = *sourceCorn;
428 } while( ++sourceCorn, ++corn < corners+numCorner );
429
430 //
431 // Original parameters
432 //
433 if (source.original_parameters)
434 {
436 new G4PolyhedraHistorical( *source.original_parameters );
437 }
438
439 //
440 // Enclosing cylinder
441 //
442 enclosingCylinder = new G4EnclosingCylinder( *source.enclosingCylinder );
443
444 //
445 // Surface elements
446 //
447 delete fElements;
448 fElements = nullptr;
449
450 //
451 // Polyhedron
452 //
453 fRebuildPolyhedron = false;
454 delete fpPolyhedron;
455 fpPolyhedron = nullptr;
456}
G4bool phiIsOpen
Definition: G4Polyhedra.hh:185
G4int numCorner
Definition: G4Polyhedra.hh:187
G4bool fRebuildPolyhedron

References corners, enclosingCylinder, endPhi, fElements, G4VCSGfaceted::fpPolyhedron, G4VCSGfaceted::fRebuildPolyhedron, genericPgon, numCorner, numSide, original_parameters, phiIsOpen, and startPhi.

Referenced by G4Polyhedra(), and operator=().

◆ CopyStuff() [2/2]

void G4VCSGfaceted::CopyStuff ( const G4VCSGfaceted source)
protectedinherited

Definition at line 125 of file G4VCSGfaceted.cc.

126{
127 numFace = source.numFace;
128 if (numFace == 0) { return; } // odd, but permissable?
129
130 faces = new G4VCSGface*[numFace];
131
132 G4VCSGface **face = faces,
133 **sourceFace = source.faces;
134 do // Loop checking, 13.08.2015, G.Cosmo
135 {
136 *face = (*sourceFace)->Clone();
137 } while( ++sourceFace, ++face < faces+numFace );
138 fCubicVolume = source.fCubicVolume;
139 fSurfaceArea = source.fSurfaceArea;
140 fRebuildPolyhedron = false;
141 fpPolyhedron = nullptr;
142}
virtual G4VCSGface * Clone()=0
G4double fCubicVolume
G4VCSGface ** faces
G4double fSurfaceArea

References G4VCSGface::Clone(), G4VCSGfaceted::faces, G4VCSGfaceted::fCubicVolume, G4VCSGfaceted::fpPolyhedron, G4VCSGfaceted::fRebuildPolyhedron, G4VCSGfaceted::fSurfaceArea, and G4VCSGfaceted::numFace.

Referenced by G4VCSGfaceted::G4VCSGfaceted(), and G4VCSGfaceted::operator=().

◆ Create()

void G4Polyhedra::Create ( G4double  phiStart,
G4double  phiTotal,
G4int  numSide,
G4ReduciblePolygon rz 
)
protected

Definition at line 188 of file G4Polyhedra.cc.

192{
193 //
194 // Perform checks of rz values
195 //
196 if (rz->Amin() < 0.0)
197 {
198 std::ostringstream message;
199 message << "Illegal input parameters - " << GetName() << G4endl
200 << " All R values must be >= 0 !";
201 G4Exception("G4Polyhedra::Create()", "GeomSolids0002",
202 FatalErrorInArgument, message);
203 }
204
205 G4double rzArea = rz->Area();
206 if (rzArea < -kCarTolerance)
207 {
208 rz->ReverseOrder();
209 }
210 else if (rzArea < kCarTolerance)
211 {
212 std::ostringstream message;
213 message << "Illegal input parameters - " << GetName() << G4endl
214 << " R/Z cross section is zero or near zero: " << rzArea;
215 G4Exception("G4Polyhedra::Create()", "GeomSolids0002",
216 FatalErrorInArgument, message);
217 }
218
221 {
222 std::ostringstream message;
223 message << "Illegal input parameters - " << GetName() << G4endl
224 << " Too few unique R/Z values !";
225 G4Exception("G4Polyhedra::Create()", "GeomSolids0002",
226 FatalErrorInArgument, message);
227 }
228
229 if (rz->CrossesItself( 1/kInfinity ))
230 {
231 std::ostringstream message;
232 message << "Illegal input parameters - " << GetName() << G4endl
233 << " R/Z segments cross !";
234 G4Exception("G4Polyhedra::Create()", "GeomSolids0002",
235 FatalErrorInArgument, message);
236 }
237
238 numCorner = rz->NumVertices();
239
240
241 startPhi = phiStart;
242 while( startPhi < 0 ) // Loop checking, 13.08.2015, G.Cosmo
243 startPhi += twopi;
244 //
245 // Phi opening? Account for some possible roundoff, and interpret
246 // nonsense value as representing no phi opening
247 //
248 if ( (phiTotal <= 0) || (phiTotal > twopi*(1-DBL_EPSILON)) )
249 {
250 phiIsOpen = false;
252 }
253 else
254 {
255 phiIsOpen = true;
256 endPhi = startPhi + phiTotal;
257 }
258
259 //
260 // Save number sides
261 //
262 numSide = theNumSide;
263
264 //
265 // Allocate corner array.
266 //
268
269 //
270 // Copy corners
271 //
273
275 iterRZ.Begin();
276 do // Loop checking, 13.08.2015, G.Cosmo
277 {
278 next->r = iterRZ.GetA();
279 next->z = iterRZ.GetB();
280 } while( ++next, iterRZ.Next() );
281
282 //
283 // Allocate face pointer array
284 //
286 faces = new G4VCSGface*[numFace];
287
288 //
289 // Construct side faces
290 //
291 // To do so properly, we need to keep track of four successive RZ
292 // corners.
293 //
294 // But! Don't construct a face if both points are at zero radius!
295 //
296 G4PolyhedraSideRZ* corner = corners,
297 * prev = corners + numCorner-1,
298 * nextNext;
299 G4VCSGface** face = faces;
300 do // Loop checking, 13.08.2015, G.Cosmo
301 {
302 next = corner+1;
303 if (next >= corners+numCorner) next = corners;
304 nextNext = next+1;
305 if (nextNext >= corners+numCorner) nextNext = corners;
306
307 if (corner->r < 1/kInfinity && next->r < 1/kInfinity) continue;
308/*
309 // We must decide here if we can dare declare one of our faces
310 // as having a "valid" normal (i.e. allBehind = true). This
311 // is never possible if the face faces "inward" in r *unless*
312 // we have only one side
313 //
314 G4bool allBehind;
315 if ((corner->z > next->z) && (numSide > 1))
316 {
317 allBehind = false;
318 }
319 else
320 {
321 //
322 // Otherwise, it is only true if the line passing
323 // through the two points of the segment do not
324 // split the r/z cross section
325 //
326 allBehind = !rz->BisectedBy( corner->r, corner->z,
327 next->r, next->z, kCarTolerance );
328 }
329*/
330 *face++ = new G4PolyhedraSide( prev, corner, next, nextNext,
332 } while( prev=corner, corner=next, corner > corners );
333
334 if (phiIsOpen)
335 {
336 //
337 // Construct phi open edges
338 //
339 *face++ = new G4PolyPhiFace( rz, startPhi, phiTotal/numSide, endPhi );
340 *face++ = new G4PolyPhiFace( rz, endPhi, phiTotal/numSide, startPhi );
341 }
342
343 //
344 // We might have dropped a face or two: recalculate numFace
345 //
346 numFace = face-faces;
347
348 //
349 // Make enclosingCylinder
350 //
352 new G4EnclosingCylinder( rz, phiIsOpen, phiStart, phiTotal );
353}
G4double Amin() const
G4bool RemoveDuplicateVertices(G4double tolerance)
G4int NumVertices() const
G4bool RemoveRedundantVertices(G4double tolerance)
G4bool CrossesItself(G4double tolerance)

References G4ReduciblePolygon::Amin(), G4ReduciblePolygon::Area(), G4ReduciblePolygonIterator::Begin(), corners, G4ReduciblePolygon::CrossesItself(), DBL_EPSILON, enclosingCylinder, endPhi, G4VCSGfaceted::faces, FatalErrorInArgument, G4endl, G4Exception(), G4ReduciblePolygonIterator::GetA(), G4ReduciblePolygonIterator::GetB(), G4VSolid::GetName(), G4VSolid::kCarTolerance, kInfinity, G4ReduciblePolygonIterator::Next(), numCorner, G4VCSGfaceted::numFace, numSide, G4ReduciblePolygon::NumVertices(), phiIsOpen, G4PolyhedraSideRZ::r, G4ReduciblePolygon::RemoveDuplicateVertices(), G4ReduciblePolygon::RemoveRedundantVertices(), G4ReduciblePolygon::ReverseOrder(), startPhi, twopi, and G4PolyhedraSideRZ::z.

Referenced by G4Polyhedra(), and Reset().

◆ CreatePolyhedron()

G4Polyhedron * G4Polyhedra::CreatePolyhedron ( ) const
virtual

Implements G4VCSGfaceted.

Definition at line 1031 of file G4Polyhedra.cc.

1032{
1033 std::vector<G4TwoVector> rz(numCorner);
1034 for (G4int i = 0; i < numCorner; ++i)
1035 rz[i].set(corners[i].r, corners[i].z);
1036 return new G4PolyhedronPgon(startPhi, endPhi - startPhi, numSide, rz);
1037}

References corners, endPhi, numCorner, numSide, and startPhi.

◆ DeleteStuff()

void G4Polyhedra::DeleteStuff ( )
protected

◆ DescribeYourselfTo()

void G4VCSGfaceted::DescribeYourselfTo ( G4VGraphicsScene scene) const
virtualinherited

Implements G4VSolid.

Definition at line 396 of file G4VCSGfaceted.cc.

397{
398 scene.AddSolid( *this );
399}
virtual void AddSolid(const G4Box &)=0

References G4VGraphicsScene::AddSolid().

◆ DistanceTo()

G4double G4VCSGfaceted::DistanceTo ( const G4ThreeVector p,
const G4bool  outgoing 
) const
protectedvirtualinherited

Definition at line 378 of file G4VCSGfaceted.cc.

380{
381 G4VCSGface **face = faces;
382 G4double best = kInfinity;
383 do // Loop checking, 13.08.2015, G.Cosmo
384 {
385 G4double distance = (*face)->Distance( p, outgoing );
386 if (distance < best) { best = distance; }
387 } while( ++face < faces + numFace );
388
389 return (best < 0.5*kCarTolerance) ? 0. : best;
390}

References G4VCSGfaceted::faces, G4VSolid::kCarTolerance, kInfinity, and G4VCSGfaceted::numFace.

Referenced by G4VCSGfaceted::DistanceToIn(), and G4VCSGfaceted::DistanceToOut().

◆ DistanceToIn() [1/2]

G4double G4Polyhedra::DistanceToIn ( const G4ThreeVector p) const
virtual

Reimplemented from G4VCSGfaceted.

Definition at line 542 of file G4Polyhedra.cc.

543{
545}
virtual G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const

References G4VCSGfaceted::DistanceToIn().

◆ DistanceToIn() [2/2]

G4double G4Polyhedra::DistanceToIn ( const G4ThreeVector p,
const G4ThreeVector v 
) const
virtual

Reimplemented from G4VCSGfaceted.

Definition at line 525 of file G4Polyhedra.cc.

527{
528 //
529 // Quick test
530 //
532 return kInfinity;
533
534 //
535 // Long answer
536 //
537 return G4VCSGfaceted::DistanceToIn( p, v );
538}
G4bool ShouldMiss(const G4ThreeVector &p, const G4ThreeVector &v) const

References G4VCSGfaceted::DistanceToIn(), enclosingCylinder, kInfinity, and G4EnclosingCylinder::ShouldMiss().

◆ DistanceToOut() [1/2]

G4double G4VCSGfaceted::DistanceToOut ( const G4ThreeVector p) const
virtualinherited

Implements G4VSolid.

Definition at line 367 of file G4VCSGfaceted.cc.

368{
369 return DistanceTo( p, true );
370}
virtual G4double DistanceTo(const G4ThreeVector &p, const G4bool outgoing) const

References G4VCSGfaceted::DistanceTo().

◆ DistanceToOut() [2/2]

G4double G4VCSGfaceted::DistanceToOut ( const G4ThreeVector p,
const G4ThreeVector v,
const G4bool  calcNorm = false,
G4bool validNorm = nullptr,
G4ThreeVector n = nullptr 
) const
virtualinherited

Implements G4VSolid.

Definition at line 299 of file G4VCSGfaceted.cc.

304{
305 G4bool allBehind = true;
306 G4double distance = kInfinity;
307 G4double distFromSurface = kInfinity;
309
310 G4VCSGface **face = faces;
311 G4VCSGface *bestFace = *face;
312 do // Loop checking, 13.08.2015, G.Cosmo
313 {
314 G4double faceDistance,
315 faceDistFromSurface;
316 G4ThreeVector faceNormal;
317 G4bool faceAllBehind;
318 if ((*face)->Intersect( p, v, true, kCarTolerance/2,
319 faceDistance, faceDistFromSurface,
320 faceNormal, faceAllBehind ) )
321 {
322 //
323 // Intersecting face
324 //
325 if ( (distance < kInfinity) || (!faceAllBehind) ) { allBehind = false; }
326 if (faceDistance < distance)
327 {
328 distance = faceDistance;
329 distFromSurface = faceDistFromSurface;
330 normal = faceNormal;
331 bestFace = *face;
332 if (distFromSurface <= 0.) { break; }
333 }
334 }
335 } while( ++face < faces + numFace );
336
337 if (distance < kInfinity)
338 {
339 if (distFromSurface <= 0.)
340 {
341 distance = 0.;
342 }
343 else if (distFromSurface<kCarTolerance/2)
344 {
345 if (bestFace->Distance(p,true) < kCarTolerance/2) { distance = 0.; }
346 }
347
348 if (calcNorm)
349 {
350 *validNorm = allBehind;
351 *n = normal;
352 }
353 }
354 else
355 {
356 if (Inside(p) == kSurface) { distance = 0.; }
357 if (calcNorm) { *validNorm = false; }
358 }
359
360 return distance;
361}
virtual G4double Distance(const G4ThreeVector &p, G4bool outgoing)=0
virtual EInside Inside(const G4ThreeVector &p) const
@ kSurface
Definition: geomdefs.hh:69
static double normal(HepRandomEngine *eptr)
Definition: RandPoisson.cc:79

References G4VCSGface::Distance(), G4VCSGfaceted::faces, G4VCSGfaceted::Inside(), G4VSolid::kCarTolerance, kInfinity, kSurface, CLHEP::detail::n, CLHEP::normal(), and G4VCSGfaceted::numFace.

◆ DumpInfo()

void G4VSolid::DumpInfo ( ) const
inlineinherited

Referenced by G4Cons::ApproxSurfaceNormal(), G4CutTubs::ApproxSurfaceNormal(), G4Sphere::ApproxSurfaceNormal(), G4Torus::ApproxSurfaceNormal(), G4Tubs::ApproxSurfaceNormal(), G4ReflectedSolid::BoundingLimits(), G4DisplacedSolid::BoundingLimits(), G4IntersectionSolid::BoundingLimits(), G4ScaledSolid::BoundingLimits(), G4SubtractionSolid::BoundingLimits(), G4UnionSolid::BoundingLimits(), G4Box::BoundingLimits(), G4Cons::BoundingLimits(), G4CutTubs::BoundingLimits(), G4Orb::BoundingLimits(), G4Para::BoundingLimits(), G4Sphere::BoundingLimits(), G4Torus::BoundingLimits(), G4Trap::BoundingLimits(), G4Trd::BoundingLimits(), G4Tubs::BoundingLimits(), G4EllipticalCone::BoundingLimits(), G4ExtrudedSolid::BoundingLimits(), G4GenericPolycone::BoundingLimits(), G4GenericTrap::BoundingLimits(), G4Hype::BoundingLimits(), G4Paraboloid::BoundingLimits(), G4Polycone::BoundingLimits(), BoundingLimits(), G4TessellatedSolid::BoundingLimits(), G4TwistedTubs::BoundingLimits(), G4ParameterisationBoxX::ComputeDimensions(), G4ParameterisationBoxY::ComputeDimensions(), G4ParameterisationBoxZ::ComputeDimensions(), G4ParameterisationConsRho::ComputeDimensions(), G4ParameterisationConsPhi::ComputeDimensions(), G4ParameterisationConsZ::ComputeDimensions(), G4ParameterisationParaX::ComputeDimensions(), G4ParameterisationParaY::ComputeDimensions(), G4ParameterisationParaZ::ComputeDimensions(), G4ParameterisationPolyconeRho::ComputeDimensions(), G4ParameterisationPolyconePhi::ComputeDimensions(), G4ParameterisationPolyconeZ::ComputeDimensions(), G4ParameterisationPolyhedraRho::ComputeDimensions(), G4ParameterisationPolyhedraPhi::ComputeDimensions(), G4ParameterisationPolyhedraZ::ComputeDimensions(), G4ParameterisationTrdX::ComputeDimensions(), G4ParameterisationTrdY::ComputeDimensions(), G4ParameterisationTrdZ::ComputeDimensions(), G4ParameterisationTubsRho::ComputeDimensions(), G4ParameterisationTubsPhi::ComputeDimensions(), G4ParameterisationTubsZ::ComputeDimensions(), G4ReflectedSolid::ComputeDimensions(), G4DisplacedSolid::ComputeDimensions(), G4ScaledSolid::ComputeDimensions(), G4ParameterisedNavigation::ComputeStep(), G4ReplicaNavigation::ComputeStep(), G4DisplacedSolid::CreatePolyhedron(), G4ScaledSolid::CreatePolyhedron(), G4SubtractionSolid::DistanceToIn(), G4Box::DistanceToOut(), G4Orb::DistanceToOut(), G4Para::DistanceToOut(), G4Trap::DistanceToOut(), G4Trd::DistanceToOut(), G4Paraboloid::DistanceToOut(), G4VTwistedFaceted::DistanceToOut(), G4Cons::DistanceToOut(), G4CutTubs::DistanceToOut(), G4Sphere::DistanceToOut(), G4Torus::DistanceToOut(), G4Tubs::DistanceToOut(), G4Ellipsoid::DistanceToOut(), G4EllipticalCone::DistanceToOut(), G4EllipticalTube::DistanceToOut(), G4GenericTrap::DistanceToOut(), export_G4VSolid(), G4Polycone::G4Polycone(), G4Polyhedra(), G4BooleanSolid::GetConstituentSolid(), G4NavigationLogger::PostComputeStepLog(), G4Box::SurfaceNormal(), G4Para::SurfaceNormal(), G4Trap::SurfaceNormal(), G4Trd::SurfaceNormal(), G4Ellipsoid::SurfaceNormal(), G4EllipticalCone::SurfaceNormal(), G4EllipticalTube::SurfaceNormal(), G4ExtrudedSolid::SurfaceNormal(), and G4Tet::SurfaceNormal().

◆ EstimateCubicVolume()

G4double G4VSolid::EstimateCubicVolume ( G4int  nStat,
G4double  epsilon 
) const
inherited

Definition at line 203 of file G4VSolid.cc.

204{
205 G4int iInside=0;
206 G4double px,py,pz,minX,maxX,minY,maxY,minZ,maxZ,volume,halfepsilon;
208 EInside in;
209
210 // values needed for CalculateExtent signature
211
212 G4VoxelLimits limit; // Unlimited
213 G4AffineTransform origin;
214
215 // min max extents of pSolid along X,Y,Z
216
217 CalculateExtent(kXAxis,limit,origin,minX,maxX);
218 CalculateExtent(kYAxis,limit,origin,minY,maxY);
219 CalculateExtent(kZAxis,limit,origin,minZ,maxZ);
220
221 // limits
222
223 if(nStat < 100) nStat = 100;
224 if(epsilon > 0.01) epsilon = 0.01;
225 halfepsilon = 0.5*epsilon;
226
227 for(auto i = 0; i < nStat; ++i )
228 {
229 px = minX-halfepsilon+(maxX-minX+epsilon)*G4QuickRand();
230 py = minY-halfepsilon+(maxY-minY+epsilon)*G4QuickRand();
231 pz = minZ-halfepsilon+(maxZ-minZ+epsilon)*G4QuickRand();
232 p = G4ThreeVector(px,py,pz);
233 in = Inside(p);
234 if(in != kOutside) ++iInside;
235 }
236 volume = (maxX-minX+epsilon)*(maxY-minY+epsilon)
237 * (maxZ-minZ+epsilon)*iInside/nStat;
238 return volume;
239}
G4double epsilon(G4double density, G4double temperature)
static const G4int maxZ
G4double G4QuickRand()
Definition: G4QuickRand.hh:34
CLHEP::Hep3Vector G4ThreeVector
virtual G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pMin, G4double &pMax) const =0
virtual EInside Inside(const G4ThreeVector &p) const =0
EInside
Definition: geomdefs.hh:67
@ kOutside
Definition: geomdefs.hh:68

References G4VSolid::CalculateExtent(), epsilon(), G4QuickRand(), G4VSolid::Inside(), kOutside, kXAxis, kYAxis, kZAxis, and maxZ.

Referenced by G4VSolid::GetCubicVolume(), G4BooleanSolid::GetCubicVolume(), and G4VCSGfaceted::GetCubicVolume().

◆ EstimateSurfaceArea()

G4double G4VSolid::EstimateSurfaceArea ( G4int  nStat,
G4double  ell 
) const
inherited

Definition at line 265 of file G4VSolid.cc.

266{
267 static const G4double s2 = 1./std::sqrt(2.);
268 static const G4double s3 = 1./std::sqrt(3.);
269 static const G4ThreeVector directions[64] =
270 {
271 G4ThreeVector( 0, 0, 0), G4ThreeVector( -1, 0, 0), // ( , , ) ( -, , )
272 G4ThreeVector( 1, 0, 0), G4ThreeVector( -1, 0, 0), // ( +, , ) (-+, , )
273 G4ThreeVector( 0, -1, 0), G4ThreeVector(-s2,-s2, 0), // ( , -, ) ( -, -, )
274 G4ThreeVector( s2, -s2, 0), G4ThreeVector( 0, -1, 0), // ( +, -, ) (-+, -, )
275
276 G4ThreeVector( 0, 1, 0), G4ThreeVector( -s2, s2, 0), // ( , +, ) ( -, +, )
277 G4ThreeVector( s2, s2, 0), G4ThreeVector( 0, 1, 0), // ( +, +, ) (-+, +, )
278 G4ThreeVector( 0, -1, 0), G4ThreeVector( -1, 0, 0), // ( ,-+, ) ( -,-+, )
279 G4ThreeVector( 1, 0, 0), G4ThreeVector( -1, 0, 0), // ( +,-+, ) (-+,-+, )
280
281 G4ThreeVector( 0, 0, -1), G4ThreeVector(-s2, 0,-s2), // ( , , -) ( -, , -)
282 G4ThreeVector( s2, 0,-s2), G4ThreeVector( 0, 0, -1), // ( +, , -) (-+, , -)
283 G4ThreeVector( 0,-s2,-s2), G4ThreeVector(-s3,-s3,-s3), // ( , -, -) ( -, -, -)
284 G4ThreeVector( s3,-s3,-s3), G4ThreeVector( 0,-s2,-s2), // ( +, -, -) (-+, -, -)
285
286 G4ThreeVector( 0, s2,-s2), G4ThreeVector(-s3, s3,-s3), // ( , +, -) ( -, +, -)
287 G4ThreeVector( s3, s3,-s3), G4ThreeVector( 0, s2,-s2), // ( +, +, -) (-+, +, -)
288 G4ThreeVector( 0, 0, -1), G4ThreeVector(-s2, 0,-s2), // ( ,-+, -) ( -,-+, -)
289 G4ThreeVector( s2, 0,-s2), G4ThreeVector( 0, 0, -1), // ( +,-+, -) (-+,-+, -)
290
291 G4ThreeVector( 0, 0, 1), G4ThreeVector(-s2, 0, s2), // ( , , +) ( -, , +)
292 G4ThreeVector( s2, 0, s2), G4ThreeVector( 0, 0, 1), // ( +, , +) (-+, , +)
293 G4ThreeVector( 0,-s2, s2), G4ThreeVector(-s3,-s3, s3), // ( , -, +) ( -, -, +)
294 G4ThreeVector( s3,-s3, s3), G4ThreeVector( 0,-s2, s2), // ( +, -, +) (-+, -, +)
295
296 G4ThreeVector( 0, s2, s2), G4ThreeVector(-s3, s3, s3), // ( , +, +) ( -, +, +)
297 G4ThreeVector( s3, s3, s3), G4ThreeVector( 0, s2, s2), // ( +, +, +) (-+, +, +)
298 G4ThreeVector( 0, 0, 1), G4ThreeVector(-s2, 0, s2), // ( ,-+, +) ( -,-+, +)
299 G4ThreeVector( s2, 0, s2), G4ThreeVector( 0, 0, 1), // ( +,-+, +) (-+,-+, +)
300
301 G4ThreeVector( 0, 0, -1), G4ThreeVector( -1, 0, 0), // ( , ,-+) ( -, ,-+)
302 G4ThreeVector( 1, 0, 0), G4ThreeVector( -1, 0, 0), // ( +, ,-+) (-+, ,-+)
303 G4ThreeVector( 0, -1, 0), G4ThreeVector(-s2,-s2, 0), // ( , -,-+) ( -, -,-+)
304 G4ThreeVector( s2, -s2, 0), G4ThreeVector( 0, -1, 0), // ( +, -,-+) (-+, -,-+)
305
306 G4ThreeVector( 0, 1, 0), G4ThreeVector( -s2, s2, 0), // ( , +,-+) ( -, +,-+)
307 G4ThreeVector( s2, s2, 0), G4ThreeVector( 0, 1, 0), // ( +, +,-+) (-+, +,-+)
308 G4ThreeVector( 0, -1, 0), G4ThreeVector( -1, 0, 0), // ( ,-+,-+) ( -,-+,-+)
309 G4ThreeVector( 1, 0, 0), G4ThreeVector( -1, 0, 0), // ( +,-+,-+) (-+,-+,-+)
310 };
311
312 G4ThreeVector bmin, bmax;
313 BoundingLimits(bmin, bmax);
314
315 G4double dX = bmax.x() - bmin.x();
316 G4double dY = bmax.y() - bmin.y();
317 G4double dZ = bmax.z() - bmin.z();
318
319 // Define statistics and shell thickness
320 //
321 G4int npoints = (nstat < 1000) ? 1000 : nstat;
322 G4double coeff = 0.5 / std::cbrt(G4double(npoints));
323 G4double eps = (ell > 0) ? ell : coeff * std::min(std::min(dX, dY), dZ);
324 G4double del = 1.8 * eps; // shold be more than sqrt(3.)
325
326 G4double minX = bmin.x() - eps;
327 G4double minY = bmin.y() - eps;
328 G4double minZ = bmin.z() - eps;
329
330 G4double dd = 2. * eps;
331 dX += dd;
332 dY += dd;
333 dZ += dd;
334
335 // Calculate surface area
336 //
337 G4int icount = 0;
338 for(auto i = 0; i < npoints; ++i)
339 {
340 G4double px = minX + dX*G4QuickRand();
341 G4double py = minY + dY*G4QuickRand();
342 G4double pz = minZ + dZ*G4QuickRand();
343 G4ThreeVector p = G4ThreeVector(px, py, pz);
344 EInside in = Inside(p);
345 G4double dist = 0;
346 if (in == kInside)
347 {
348 if (DistanceToOut(p) >= eps) continue;
349 G4int icase = 0;
350 if (Inside(G4ThreeVector(px-del, py, pz)) != kInside) icase += 1;
351 if (Inside(G4ThreeVector(px+del, py, pz)) != kInside) icase += 2;
352 if (Inside(G4ThreeVector(px, py-del, pz)) != kInside) icase += 4;
353 if (Inside(G4ThreeVector(px, py+del, pz)) != kInside) icase += 8;
354 if (Inside(G4ThreeVector(px, py, pz-del)) != kInside) icase += 16;
355 if (Inside(G4ThreeVector(px, py, pz+del)) != kInside) icase += 32;
356 if (icase == 0) continue;
357 G4ThreeVector v = directions[icase];
358 dist = DistanceToOut(p, v);
359 G4ThreeVector n = SurfaceNormal(p + v*dist);
360 dist *= v.dot(n);
361 }
362 else if (in == kOutside)
363 {
364 if (DistanceToIn(p) >= eps) continue;
365 G4int icase = 0;
366 if (Inside(G4ThreeVector(px-del, py, pz)) != kOutside) icase += 1;
367 if (Inside(G4ThreeVector(px+del, py, pz)) != kOutside) icase += 2;
368 if (Inside(G4ThreeVector(px, py-del, pz)) != kOutside) icase += 4;
369 if (Inside(G4ThreeVector(px, py+del, pz)) != kOutside) icase += 8;
370 if (Inside(G4ThreeVector(px, py, pz-del)) != kOutside) icase += 16;
371 if (Inside(G4ThreeVector(px, py, pz+del)) != kOutside) icase += 32;
372 if (icase == 0) continue;
373 G4ThreeVector v = directions[icase];
374 dist = DistanceToIn(p, v);
375 if (dist == kInfinity) continue;
376 G4ThreeVector n = SurfaceNormal(p + v*dist);
377 dist *= -(v.dot(n));
378 }
379 if (dist < eps) ++icount;
380 }
381 return dX*dY*dZ*icount/npoints/dd;
382}
static const G4double eps
double z() const
double x() const
double y() const
double dot(const Hep3Vector &) const
virtual G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=false, G4bool *validNorm=nullptr, G4ThreeVector *n=nullptr) const =0
virtual G4ThreeVector SurfaceNormal(const G4ThreeVector &p) const =0
virtual void BoundingLimits(G4ThreeVector &pMin, G4ThreeVector &pMax) const
Definition: G4VSolid.cc:665
virtual G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const =0
@ kInside
Definition: geomdefs.hh:70
T min(const T t1, const T t2)
brief Return the smallest of the two arguments

References G4VSolid::BoundingLimits(), G4VSolid::DistanceToIn(), G4VSolid::DistanceToOut(), CLHEP::Hep3Vector::dot(), eps, G4QuickRand(), G4VSolid::Inside(), kInfinity, kInside, kOutside, G4INCL::Math::min(), CLHEP::detail::n, G4VSolid::SurfaceNormal(), CLHEP::Hep3Vector::x(), CLHEP::Hep3Vector::y(), and CLHEP::Hep3Vector::z().

Referenced by G4VSolid::GetSurfaceArea(), G4MultiUnion::GetSurfaceArea(), and G4VCSGfaceted::GetSurfaceArea().

◆ GetAreaAccuracy()

G4double G4VCSGfaceted::GetAreaAccuracy ( ) const
inherited

Definition at line 514 of file G4VCSGfaceted.cc.

515{
516 return fAreaAccuracy;
517}
G4double fAreaAccuracy

References G4VCSGfaceted::fAreaAccuracy.

◆ GetAreaStatistics()

G4int G4VCSGfaceted::GetAreaStatistics ( ) const
inherited

Definition at line 505 of file G4VCSGfaceted.cc.

506{
507 return fStatistics;
508}

References G4VCSGfaceted::fStatistics.

◆ GetConstituentSolid() [1/2]

G4VSolid * G4VSolid::GetConstituentSolid ( G4int  no)
virtualinherited

Reimplemented in G4BooleanSolid.

Definition at line 170 of file G4VSolid.cc.

171{ return nullptr; }

◆ GetConstituentSolid() [2/2]

const G4VSolid * G4VSolid::GetConstituentSolid ( G4int  no) const
virtualinherited

Reimplemented in G4BooleanSolid.

Definition at line 167 of file G4VSolid.cc.

168{ return nullptr; }

Referenced by G4BooleanSolid::StackPolyhedron().

◆ GetCorner()

G4PolyhedraSideRZ G4Polyhedra::GetCorner ( const G4int  index) const
inline

◆ GetCosEndPhi()

G4double G4Polyhedra::GetCosEndPhi ( ) const
inline

◆ GetCosStartPhi()

G4double G4Polyhedra::GetCosStartPhi ( ) const
inline

Referenced by BoundingLimits(), and CalculateExtent().

◆ GetCubicVolume()

G4double G4Polyhedra::GetCubicVolume ( )
virtual

Reimplemented from G4VCSGfaceted.

Definition at line 808 of file G4Polyhedra.cc.

809{
810 if (fCubicVolume == 0.)
811 {
812 G4double total = 0.;
813 G4int nrz = GetNumRZCorner();
814 G4PolyhedraSideRZ a = GetCorner(nrz - 1);
815 for (G4int i=0; i<nrz; ++i)
816 {
818 total += (b.r*b.r + b.r*a.r + a.r*a.r)*(b.z - a.z);
819 a = b;
820 }
821 fCubicVolume = std::abs(total)*
822 std::sin((GetEndPhi() - GetStartPhi())/GetNumSide())*GetNumSide()/6.;
823 }
824 return fCubicVolume;
825}
G4double total(Particle const *const p1, Particle const *const p2)

References G4VCSGfaceted::fCubicVolume, GetCorner(), GetEndPhi(), GetNumRZCorner(), GetNumSide(), GetStartPhi(), G4PolyhedraSideRZ::r, G4INCL::CrossSections::total(), and G4PolyhedraSideRZ::z.

◆ GetCubVolEpsilon()

G4double G4VCSGfaceted::GetCubVolEpsilon ( ) const
inherited

Definition at line 476 of file G4VCSGfaceted.cc.

477{
478 return fCubVolEpsilon;
479}
G4double fCubVolEpsilon

References G4VCSGfaceted::fCubVolEpsilon.

◆ GetCubVolStatistics()

G4int G4VCSGfaceted::GetCubVolStatistics ( ) const
inherited

Definition at line 467 of file G4VCSGfaceted.cc.

468{
469 return fStatistics;
470}

References G4VCSGfaceted::fStatistics.

◆ GetDisplacedSolidPtr() [1/2]

G4DisplacedSolid * G4VSolid::GetDisplacedSolidPtr ( )
virtualinherited

Reimplemented in G4DisplacedSolid.

Definition at line 176 of file G4VSolid.cc.

177{ return nullptr; }

◆ GetDisplacedSolidPtr() [2/2]

const G4DisplacedSolid * G4VSolid::GetDisplacedSolidPtr ( ) const
virtualinherited

Reimplemented in G4DisplacedSolid.

Definition at line 173 of file G4VSolid.cc.

174{ return nullptr; }

◆ GetEndPhi()

G4double G4Polyhedra::GetEndPhi ( ) const
inline

◆ GetEntityType()

G4GeometryType G4Polyhedra::GetEntityType ( ) const
virtual

Reimplemented from G4VCSGfaceted.

Definition at line 742 of file G4Polyhedra.cc.

743{
744 return G4String("G4Polyhedra");
745}

◆ GetExtent()

G4VisExtent G4VCSGfaceted::GetExtent ( ) const
virtualinherited

Reimplemented from G4VSolid.

Definition at line 407 of file G4VCSGfaceted.cc.

408{
409 static const G4ThreeVector xMax(1,0,0), xMin(-1,0,0),
410 yMax(0,1,0), yMin(0,-1,0),
411 zMax(0,0,1), zMin(0,0,-1);
412 static const G4ThreeVector *axes[6] =
413 { &xMin, &xMax, &yMin, &yMax, &zMin, &zMax };
414
415 G4double answers[6] =
417
418 G4VCSGface **face = faces;
419 do // Loop checking, 13.08.2015, G.Cosmo
420 {
421 const G4ThreeVector **axis = axes+5 ;
422 G4double* answer = answers+5;
423 do // Loop checking, 13.08.2015, G.Cosmo
424 {
425 G4double testFace = (*face)->Extent( **axis );
426 if (testFace > *answer) { *answer = testFace; }
427 }
428 while( --axis, --answer >= answers );
429
430 } while( ++face < faces + numFace );
431
432 return G4VisExtent( -answers[0], answers[1],
433 -answers[2], answers[3],
434 -answers[4], answers[5] );
435}

References G4VCSGfaceted::faces, kInfinity, and G4VCSGfaceted::numFace.

◆ GetName()

G4String G4VSolid::GetName ( ) const
inlineinherited

Referenced by G4GMocrenFileSceneHandler::AddDetector(), G4HepRepFileSceneHandler::AddHepRepInstance(), G4GMocrenFileSceneHandler::AddPrimitive(), G4HepRepFileSceneHandler::AddSolid(), G4GMocrenFileSceneHandler::AddSolid(), G4VtkSceneHandler::AddSolid(), G4GDMLWriteSolids::AddSolid(), G4NavigationLogger::AlongComputeStepLog(), G4GDMLWriteSolids::BooleanWrite(), G4ReflectedSolid::BoundingLimits(), G4DisplacedSolid::BoundingLimits(), G4IntersectionSolid::BoundingLimits(), G4ScaledSolid::BoundingLimits(), G4SubtractionSolid::BoundingLimits(), G4UnionSolid::BoundingLimits(), G4Box::BoundingLimits(), G4Cons::BoundingLimits(), G4CutTubs::BoundingLimits(), G4Orb::BoundingLimits(), G4Para::BoundingLimits(), G4Sphere::BoundingLimits(), G4Torus::BoundingLimits(), G4Trap::BoundingLimits(), G4Trd::BoundingLimits(), G4Tubs::BoundingLimits(), G4EllipticalCone::BoundingLimits(), G4ExtrudedSolid::BoundingLimits(), G4GenericPolycone::BoundingLimits(), G4GenericTrap::BoundingLimits(), G4Hype::BoundingLimits(), G4Paraboloid::BoundingLimits(), G4Polycone::BoundingLimits(), BoundingLimits(), G4TessellatedSolid::BoundingLimits(), G4TwistedTubs::BoundingLimits(), G4GDMLWriteSolids::BoxWrite(), G4ExtrudedSolid::CalculateExtent(), G4GenericPolycone::CalculateExtent(), G4Polycone::CalculateExtent(), CalculateExtent(), G4NavigationLogger::CheckDaughterEntryPoint(), G4VDivisionParameterisation::CheckNDivAndWidth(), G4VDivisionParameterisation::CheckOffset(), G4GenericTrap::CheckOrder(), G4Para::CheckParameters(), G4Trap::CheckParameters(), G4Trd::CheckParameters(), G4Ellipsoid::CheckParameters(), G4EllipticalTube::CheckParameters(), G4ParameterisationPolyconeRho::CheckParametersValidity(), G4ParameterisationPolyconeZ::CheckParametersValidity(), G4ParameterisationPolyhedraRho::CheckParametersValidity(), G4ParameterisationPolyhedraPhi::CheckParametersValidity(), G4ParameterisationPolyhedraZ::CheckParametersValidity(), G4PhantomParameterisation::CheckVoxelsFillContainer(), G4GenericTrap::ComputeIsTwisted(), G4VoxelNavigation::ComputeSafety(), G4VoxelSafety::ComputeSafety(), G4NavigationLogger::ComputeSafetyLog(), G4ParameterisedNavigation::ComputeStep(), G4ReplicaNavigation::ComputeStep(), G4GDMLWriteSolids::ConeWrite(), Create(), G4GenericPolycone::Create(), G4Polycone::Create(), G4PhysicalVolumeModel::CreateCurrentAttValues(), G4ReflectedSolid::CreatePolyhedron(), G4ReflectionFactory::CreateReflectedLV(), G4GenericTrap::CreateTessellatedSolid(), G4GDMLWriteSolids::CutTubeWrite(), G4SolidStore::DeRegister(), G4PhysicalVolumeModel::DescribeSolid(), G4SubtractionSolid::DistanceToIn(), G4Paraboloid::DistanceToIn(), G4TessellatedSolid::DistanceToIn(), G4Box::DistanceToOut(), G4Orb::DistanceToOut(), G4Para::DistanceToOut(), G4Trap::DistanceToOut(), G4Trd::DistanceToOut(), G4EllipticalCone::DistanceToOut(), G4TessellatedSolid::DistanceToOut(), G4Ellipsoid::DistanceToOut(), G4EllipticalTube::DistanceToOut(), G4tgbGeometryDumper::DumpMultiUnionVolume(), G4tgbGeometryDumper::DumpScaledVolume(), G4tgbGeometryDumper::DumpSolid(), G4GDMLWriteSolids::ElconeWrite(), G4GDMLWriteSolids::EllipsoidWrite(), G4GDMLWriteSolids::EltubeWrite(), G4PVDivision::ErrorInAxis(), G4ReplicatedSlice::ErrorInAxis(), export_G4VSolid(), G4Box::G4Box(), G4Cons::G4Cons(), G4CutTubs::G4CutTubs(), G4EllipticalCone::G4EllipticalCone(), G4Hype::G4Hype(), G4Para::G4Para(), G4Paraboloid::G4Paraboloid(), G4Polycone::G4Polycone(), G4Polyhedra(), G4Sphere::G4Sphere(), G4Tet::G4Tet(), G4Trap::G4Trap(), G4Tubs::G4Tubs(), G4VParameterisationCons::G4VParameterisationCons(), G4VParameterisationPara::G4VParameterisationPara(), G4VParameterisationPolycone::G4VParameterisationPolycone(), G4VParameterisationPolyhedra::G4VParameterisationPolyhedra(), G4VParameterisationTrd::G4VParameterisationTrd(), G4VTwistedFaceted::G4VTwistedFaceted(), G4GDMLWriteSolids::GenericPolyconeWrite(), G4GDMLWriteSolids::GenTrapWrite(), G4Navigator::GetGlobalExitNormal(), G4Navigator::GetLocalExitNormal(), G4ITNavigator1::GetLocalExitNormal(), G4ITNavigator2::GetLocalExitNormal(), G4BooleanSolid::GetPointOnSurface(), G4PhantomParameterisation::GetReplicaNo(), G4GDMLWriteSolids::HypeWrite(), G4TessellatedSolid::InsideNoVoxels(), G4TessellatedSolid::InsideVoxels(), G4ITNavigator1::LocateGlobalPointAndSetup(), G4ITNavigator2::LocateGlobalPointAndSetup(), G4Navigator::LocateGlobalPointAndSetup(), G4GenericTrap::MakeDownFacet(), G4Trap::MakePlanes(), G4GenericTrap::MakeUpFacet(), G4GDMLWriteSolids::MultiUnionWrite(), G4GDMLWriteSolids::OrbWrite(), G4GDMLWriteSolids::ParaboloidWrite(), G4GDMLWriteParamvol::ParametersWrite(), G4GDMLWriteSolids::ParaWrite(), G4GDMLWriteSolids::PolyconeWrite(), G4GDMLWriteSolids::PolyhedraWrite(), G4NavigationLogger::PostComputeStepLog(), G4NavigationLogger::PreComputeStepLog(), G4NavigationLogger::PrintDaughterLog(), G4PseudoScene::ProcessVolume(), G4SolidStore::Register(), G4tgbVolumeMgr::RegisterMe(), G4NavigationLogger::ReportOutsideMother(), G4ASCIITreeSceneHandler::RequestPrimitives(), G4VSceneHandler::RequestPrimitives(), G4GenericPolycone::Reset(), Reset(), G4VoxelSafety::SafetyForVoxelNode(), G4GDMLWriteSolids::ScaledWrite(), G4Torus::SetAllParameters(), G4Tet::SetBoundingLimits(), G4Polycone::SetOriginalParameters(), SetOriginalParameters(), G4TessellatedSolid::SetSolidClosed(), G4Tet::SetVertices(), G4Box::SetXHalfLength(), G4Box::SetYHalfLength(), G4Box::SetZHalfLength(), G4GDMLWriteSolids::SphereWrite(), G4BooleanSolid::StackPolyhedron(), G4ReflectedSolid::StreamInfo(), G4BooleanSolid::StreamInfo(), G4DisplacedSolid::StreamInfo(), G4MultiUnion::StreamInfo(), G4ScaledSolid::StreamInfo(), G4Box::StreamInfo(), G4Cons::StreamInfo(), G4CSGSolid::StreamInfo(), G4CutTubs::StreamInfo(), G4Orb::StreamInfo(), G4Para::StreamInfo(), G4Sphere::StreamInfo(), G4Torus::StreamInfo(), G4Trap::StreamInfo(), G4Trd::StreamInfo(), G4Tubs::StreamInfo(), G4Ellipsoid::StreamInfo(), G4EllipticalCone::StreamInfo(), G4EllipticalTube::StreamInfo(), G4ExtrudedSolid::StreamInfo(), G4GenericPolycone::StreamInfo(), G4GenericTrap::StreamInfo(), G4Hype::StreamInfo(), G4Paraboloid::StreamInfo(), G4Polycone::StreamInfo(), StreamInfo(), G4TessellatedSolid::StreamInfo(), G4Tet::StreamInfo(), G4TwistedBox::StreamInfo(), G4TwistedTrap::StreamInfo(), G4TwistedTrd::StreamInfo(), G4TwistedTubs::StreamInfo(), G4VCSGfaceted::StreamInfo(), G4VTwistedFaceted::StreamInfo(), G4GDMLRead::StripNames(), SubstractSolids(), G4UnionSolid::SurfaceNormal(), G4Box::SurfaceNormal(), G4Para::SurfaceNormal(), G4Trap::SurfaceNormal(), G4Trd::SurfaceNormal(), G4Ellipsoid::SurfaceNormal(), G4EllipticalCone::SurfaceNormal(), G4EllipticalTube::SurfaceNormal(), G4ExtrudedSolid::SurfaceNormal(), G4Tet::SurfaceNormal(), G4GDMLWriteSolids::TessellatedWrite(), G4GDMLWriteSolids::TetWrite(), G4GDMLWriteSolids::TorusWrite(), G4GDMLWriteSolids::TrapWrite(), G4GDMLWriteStructure::TraverseVolumeTree(), G4GDMLWriteSolids::TrdWrite(), G4GDMLWriteSolids::TubeWrite(), G4GDMLWriteSolids::TwistedboxWrite(), G4GDMLWriteSolids::TwistedtrapWrite(), G4GDMLWriteSolids::TwistedtrdWrite(), G4GDMLWriteSolids::TwistedtubsWrite(), G4PhysicalVolumeModel::VisitGeometryAndGetVisReps(), and G4GDMLWriteSolids::XtruWrite().

◆ GetNumRZCorner()

G4int G4Polyhedra::GetNumRZCorner ( ) const
inline

◆ GetNumSide()

G4int G4Polyhedra::GetNumSide ( ) const
inline

◆ GetOriginalParameters()

G4PolyhedraHistorical * G4Polyhedra::GetOriginalParameters ( ) const
inline

◆ GetPointOnSurface()

G4ThreeVector G4Polyhedra::GetPointOnSurface ( ) const
virtual

Reimplemented from G4VSolid.

Definition at line 950 of file G4Polyhedra.cc.

951{
952 // Set surface elements
953 if (!fElements)
954 {
957 l.unlock();
958 }
959
960 // Select surface element
962 selem = fElements->back();
963 G4double select = selem.area*G4QuickRand();
964 auto it = std::lower_bound(fElements->begin(), fElements->end(), select,
965 [](const G4Polyhedra::surface_element& x, G4double val)
966 -> G4bool { return x.area < val; });
967
968 // Generate random point
969 G4double x = 0, y = 0, z = 0;
970 G4double u = G4QuickRand();
971 G4double v = G4QuickRand();
972 if (u + v > 1.) { u = 1. - u; v = 1. - v; }
973 G4int i0 = (*it).i0;
974 G4int i1 = (*it).i1;
975 G4int i2 = (*it).i2;
976 if (i2 < 0) // lateral surface
977 {
978 // sample point
979 G4int nside = GetNumSide();
980 G4double dphi = (GetEndPhi() - GetStartPhi())/nside;
981 G4double cosa = std::cos(dphi);
982 G4double sina = std::sin(dphi);
985 G4ThreeVector p0(a.r, 0, a.z);
986 G4ThreeVector p1(b.r, 0, b.z);
987 G4ThreeVector p2(b.r*cosa, b.r*sina, b.z);
988 if (i2 == -1) p1.set(a.r*cosa, a.r*sina, a.z);
989 p0 += (p1 - p0)*u + (p2 - p0)*v;
990 // find selected side and rotate point
991 G4double scurr = (*it).area;
992 G4double sprev = (it == fElements->begin()) ? 0. : (*(--it)).area;
993 G4int iside = nside*(select - sprev)/(scurr - sprev);
994 if (iside == 0 && GetStartPhi() == 0.)
995 {
996 x = p0.x();
997 y = p0.y();
998 z = p0.z();
999 }
1000 else
1001 {
1002 if (iside == nside) --iside; // iside must be less then nside
1003 G4double phi = iside*dphi + GetStartPhi();
1004 G4double cosphi = std::cos(phi);
1005 G4double sinphi = std::sin(phi);
1006 x = p0.x()*cosphi - p0.y()*sinphi;
1007 y = p0.x()*sinphi + p0.y()*cosphi;
1008 z = p0.z();
1009 }
1010 }
1011 else // phi cut
1012 {
1013 G4int nrz = GetNumRZCorner();
1014 G4double phi = (i0 < nrz) ? GetStartPhi() : GetEndPhi();
1015 if (i0 >= nrz) { i0 -= nrz; }
1019 G4double r = (p1.r - p0.r)*u + (p2.r - p0.r)*v + p0.r;
1020 x = r*std::cos(phi);
1021 y = r*std::sin(phi);
1022 z = (p1.z - p0.z)*u + (p2.z - p0.z)*v + p0.z;
1023 }
1024 return G4ThreeVector(x, y, z);
1025}
void SetSurfaceElements() const
Definition: G4Polyhedra.cc:872

References G4Polyhedra::surface_element::area, fElements, G4QuickRand(), GetCorner(), GetEndPhi(), GetNumRZCorner(), GetNumSide(), GetStartPhi(), G4PolyhedraSideRZ::r, CLHEP::Hep3Vector::set(), SetSurfaceElements(), anonymous_namespace{G4Polyhedra.cc}::surface_elementsMutex, G4TemplateAutoLock< _Mutex_t >::unlock(), CLHEP::Hep3Vector::x(), CLHEP::Hep3Vector::y(), CLHEP::Hep3Vector::z(), and G4PolyhedraSideRZ::z.

◆ GetPointOnSurfaceGeneric()

G4ThreeVector G4VCSGfaceted::GetPointOnSurfaceGeneric ( ) const
protectedinherited

Definition at line 586 of file G4VCSGfaceted.cc.

587{
588 // Preparing variables
589 //
590 G4ThreeVector answer=G4ThreeVector(0.,0.,0.);
591 G4VCSGface **face = faces;
592 G4double area = 0.;
593 G4int i;
594 std::vector<G4double> areas;
595
596 // First step: calculate surface areas
597 //
598 do // Loop checking, 13.08.2015, G.Cosmo
599 {
600 G4double result = (*face)->SurfaceArea( );
601 areas.push_back(result);
602 area=area+result;
603 } while( ++face < faces + numFace );
604
605 // Second Step: choose randomly one surface
606 //
607 G4VCSGface **face1 = faces;
608 G4double chose = area*G4UniformRand();
609 G4double Achose1, Achose2;
610 Achose1=0.; Achose2=0.;
611 i=0;
612
613 do
614 {
615 Achose2+=areas[i];
616 if(chose>=Achose1 && chose<Achose2)
617 {
618 G4ThreeVector point;
619 point= (*face1)->GetPointOnFace();
620 return point;
621 }
622 ++i;
623 Achose1=Achose2;
624 } while( ++face1 < faces + numFace );
625
626 return answer;
627}
#define G4UniformRand()
Definition: Randomize.hh:52
virtual G4double SurfaceArea()=0

References G4VCSGfaceted::faces, G4UniformRand, G4VCSGfaceted::numFace, and G4VCSGface::SurfaceArea().

◆ GetPolyhedron()

G4Polyhedron * G4VCSGfaceted::GetPolyhedron ( ) const
virtualinherited

◆ GetSinEndPhi()

G4double G4Polyhedra::GetSinEndPhi ( ) const
inline

◆ GetSinStartPhi()

G4double G4Polyhedra::GetSinStartPhi ( ) const
inline

Referenced by BoundingLimits(), and CalculateExtent().

◆ GetStartPhi()

G4double G4Polyhedra::GetStartPhi ( ) const
inline

◆ GetSurfaceArea()

G4double G4Polyhedra::GetSurfaceArea ( )
virtual

Reimplemented from G4VCSGfaceted.

Definition at line 831 of file G4Polyhedra.cc.

832{
833 if (fSurfaceArea == 0.)
834 {
835 G4double total = 0.;
836 G4int nrz = GetNumRZCorner();
837 if (IsOpen())
838 {
839 G4PolyhedraSideRZ a = GetCorner(nrz - 1);
840 for (G4int i=0; i<nrz; ++i)
841 {
843 total += a.r*b.z - a.z*b.r;
844 a = b;
845 }
846 total = std::abs(total);
847 }
849 G4double cosa = std::cos(alp);
850 G4double sina = std::sin(alp);
851 G4PolyhedraSideRZ a = GetCorner(nrz - 1);
852 for (G4int i=0; i<nrz; ++i)
853 {
855 G4ThreeVector p1(a.r, 0, a.z);
856 G4ThreeVector p2(a.r*cosa, a.r*sina, a.z);
857 G4ThreeVector p3(b.r*cosa, b.r*sina, b.z);
858 G4ThreeVector p4(b.r, 0, b.z);
859 total += GetNumSide()*(G4GeomTools::QuadAreaNormal(p1, p2, p3, p4)).mag();
860 a = b;
861 }
863 }
864 return fSurfaceArea;
865}
static G4ThreeVector QuadAreaNormal(const G4ThreeVector &A, const G4ThreeVector &B, const G4ThreeVector &C, const G4ThreeVector &D)
Definition: G4GeomTools.cc:609

References G4VCSGfaceted::fSurfaceArea, GetCorner(), GetEndPhi(), GetNumRZCorner(), GetNumSide(), GetStartPhi(), IsOpen(), G4GeomTools::QuadAreaNormal(), G4PolyhedraSideRZ::r, G4INCL::CrossSections::total(), and G4PolyhedraSideRZ::z.

◆ GetTolerance()

G4double G4VSolid::GetTolerance ( ) const
inlineinherited

◆ Inside()

EInside G4Polyhedra::Inside ( const G4ThreeVector p) const
virtual

Reimplemented from G4VCSGfaceted.

Definition at line 507 of file G4Polyhedra.cc.

508{
509 //
510 // Quick test
511 //
513
514 //
515 // Long answer
516 //
517 return G4VCSGfaceted::Inside(p);
518}
G4bool MustBeOutside(const G4ThreeVector &p) const

References enclosingCylinder, G4VCSGfaceted::Inside(), kOutside, and G4EnclosingCylinder::MustBeOutside().

◆ IsGeneric()

G4bool G4Polyhedra::IsGeneric ( ) const
inline

◆ IsOpen()

G4bool G4Polyhedra::IsOpen ( ) const
inline

◆ operator=()

G4Polyhedra & G4Polyhedra::operator= ( const G4Polyhedra source)

Definition at line 389 of file G4Polyhedra.cc.

390{
391 if (this == &source) return *this;
392
394
395 delete [] corners;
396 delete original_parameters;
397 delete enclosingCylinder;
398
399 CopyStuff( source );
400
401 return *this;
402}
G4VCSGfaceted & operator=(const G4VCSGfaceted &source)

References CopyStuff(), corners, enclosingCylinder, G4VCSGfaceted::operator=(), and original_parameters.

◆ operator==()

G4bool G4VSolid::operator== ( const G4VSolid s) const
inlineinherited

◆ Reset()

G4bool G4Polyhedra::Reset ( )

Definition at line 463 of file G4Polyhedra.cc.

464{
465 if (genericPgon)
466 {
467 std::ostringstream message;
468 message << "Solid " << GetName() << " built using generic construct."
469 << G4endl << "Not applicable to the generic construct !";
470 G4Exception("G4Polyhedra::Reset()", "GeomSolids1001",
471 JustWarning, message, "Parameters NOT resetted.");
472 return true;
473 }
474
475 //
476 // Clear old setup
477 //
479 delete [] corners;
480 delete enclosingCylinder;
481 delete fElements;
482 corners = nullptr;
483 fElements = nullptr;
484 enclosingCylinder = nullptr;
485
486 //
487 // Rebuild polyhedra
488 //
497 delete rz;
498
499 return false;
500}

References corners, Create(), G4VCSGfaceted::DeleteStuff(), enclosingCylinder, fElements, G4endl, G4Exception(), genericPgon, G4VSolid::GetName(), JustWarning, G4PolyhedraHistorical::Num_z_planes, G4PolyhedraHistorical::numSide, G4PolyhedraHistorical::Opening_angle, original_parameters, G4PolyhedraHistorical::Rmax, G4PolyhedraHistorical::Rmin, G4PolyhedraHistorical::Start_angle, and G4PolyhedraHistorical::Z_values.

Referenced by G4GDMLParameterisation::ComputeDimensions(), G4ParameterisationPolyhedraRho::ComputeDimensions(), G4ParameterisationPolyhedraPhi::ComputeDimensions(), and G4ParameterisationPolyhedraZ::ComputeDimensions().

◆ SetAreaAccuracy()

void G4VCSGfaceted::SetAreaAccuracy ( G4double  ep)
inherited

Definition at line 533 of file G4VCSGfaceted.cc.

534{
535 fSurfaceArea=0.;
536 fAreaAccuracy=ep;
537}

References G4VCSGfaceted::fAreaAccuracy, and G4VCSGfaceted::fSurfaceArea.

◆ SetAreaStatistics()

void G4VCSGfaceted::SetAreaStatistics ( G4int  st)
inherited

Definition at line 523 of file G4VCSGfaceted.cc.

524{
525 fSurfaceArea=0.;
526 fStatistics=st;
527}

References G4VCSGfaceted::fStatistics, and G4VCSGfaceted::fSurfaceArea.

◆ SetCubVolEpsilon()

void G4VCSGfaceted::SetCubVolEpsilon ( G4double  ep)
inherited

Definition at line 495 of file G4VCSGfaceted.cc.

496{
497 fCubicVolume=0.;
499}

References G4VCSGfaceted::fCubicVolume, and G4VCSGfaceted::fCubVolEpsilon.

◆ SetCubVolStatistics()

void G4VCSGfaceted::SetCubVolStatistics ( G4int  st)
inherited

Definition at line 485 of file G4VCSGfaceted.cc.

486{
487 fCubicVolume=0.;
488 fStatistics=st;
489}

References G4VCSGfaceted::fCubicVolume, and G4VCSGfaceted::fStatistics.

◆ SetName()

void G4VSolid::SetName ( const G4String name)
inherited

◆ SetOriginalParameters() [1/2]

void G4Polyhedra::SetOriginalParameters ( G4PolyhedraHistorical pars)
inline

◆ SetOriginalParameters() [2/2]

void G4Polyhedra::SetOriginalParameters ( G4ReduciblePolygon rz)
protected

Definition at line 1041 of file G4Polyhedra.cc.

1042{
1043 G4int numPlanes = numCorner;
1044 G4bool isConvertible = true;
1045 G4double Zmax=rz->Bmax();
1046 rz->StartWithZMin();
1047
1048 // Prepare vectors for storage
1049 //
1050 std::vector<G4double> Z;
1051 std::vector<G4double> Rmin;
1052 std::vector<G4double> Rmax;
1053
1054 G4int countPlanes=1;
1055 G4int icurr=0;
1056 G4int icurl=0;
1057
1058 // first plane Z=Z[0]
1059 //
1060 Z.push_back(corners[0].z);
1061 G4double Zprev=Z[0];
1062 if (Zprev == corners[1].z)
1063 {
1064 Rmin.push_back(corners[0].r);
1065 Rmax.push_back (corners[1].r);icurr=1;
1066 }
1067 else if (Zprev == corners[numPlanes-1].z)
1068 {
1069 Rmin.push_back(corners[numPlanes-1].r);
1070 Rmax.push_back (corners[0].r);
1071 icurl=numPlanes-1;
1072 }
1073 else
1074 {
1075 Rmin.push_back(corners[0].r);
1076 Rmax.push_back (corners[0].r);
1077 }
1078
1079 // next planes until last
1080 //
1081 G4int inextr=0, inextl=0;
1082 for (G4int i=0; i < numPlanes-2; ++i)
1083 {
1084 inextr=1+icurr;
1085 inextl=(icurl <= 0)? numPlanes-1 : icurl-1;
1086
1087 if((corners[inextr].z >= Zmax) & (corners[inextl].z >= Zmax)) { break; }
1088
1089 G4double Zleft = corners[inextl].z;
1090 G4double Zright = corners[inextr].z;
1091 if(Zright>Zleft)
1092 {
1093 Z.push_back(Zleft);
1094 countPlanes++;
1095 G4double difZr=corners[inextr].z - corners[icurr].z;
1096 G4double difZl=corners[inextl].z - corners[icurl].z;
1097
1098 if(std::fabs(difZl) < kCarTolerance)
1099 {
1100 if(std::fabs(difZr) < kCarTolerance)
1101 {
1102 Rmin.push_back(corners[inextl].r);
1103 Rmax.push_back(corners[icurr].r);
1104 }
1105 else
1106 {
1107 Rmin.push_back(corners[inextl].r);
1108 Rmax.push_back(corners[icurr].r + (Zleft-corners[icurr].z)/difZr
1109 *(corners[inextr].r - corners[icurr].r));
1110 }
1111 }
1112 else if (difZl >= kCarTolerance)
1113 {
1114 if(std::fabs(difZr) < kCarTolerance)
1115 {
1116 Rmin.push_back(corners[icurl].r);
1117 Rmax.push_back(corners[icurr].r);
1118 }
1119 else
1120 {
1121 Rmin.push_back(corners[icurl].r);
1122 Rmax.push_back(corners[icurr].r + (Zleft-corners[icurr].z)/difZr
1123 *(corners[inextr].r - corners[icurr].r));
1124 }
1125 }
1126 else
1127 {
1128 isConvertible=false; break;
1129 }
1130 icurl=(icurl == 0)? numPlanes-1 : icurl-1;
1131 }
1132 else if(std::fabs(Zright-Zleft)<kCarTolerance) // Zright=Zleft
1133 {
1134 Z.push_back(Zleft);
1135 ++countPlanes;
1136 ++icurr;
1137
1138 icurl=(icurl == 0)? numPlanes-1 : icurl-1;
1139
1140 Rmin.push_back(corners[inextl].r);
1141 Rmax.push_back (corners[inextr].r);
1142 }
1143 else // Zright<Zleft
1144 {
1145 Z.push_back(Zright);
1146 ++countPlanes;
1147
1148 G4double difZr=corners[inextr].z - corners[icurr].z;
1149 G4double difZl=corners[inextl].z - corners[icurl].z;
1150 if(std::fabs(difZr) < kCarTolerance)
1151 {
1152 if(std::fabs(difZl) < kCarTolerance)
1153 {
1154 Rmax.push_back(corners[inextr].r);
1155 Rmin.push_back(corners[icurr].r);
1156 }
1157 else
1158 {
1159 Rmin.push_back(corners[icurl].r + (Zright-corners[icurl].z)/difZl
1160 * (corners[inextl].r - corners[icurl].r));
1161 Rmax.push_back(corners[inextr].r);
1162 }
1163 ++icurr;
1164 } // plate
1165 else if (difZr >= kCarTolerance)
1166 {
1167 if(std::fabs(difZl) < kCarTolerance)
1168 {
1169 Rmax.push_back(corners[inextr].r);
1170 Rmin.push_back (corners[icurr].r);
1171 }
1172 else
1173 {
1174 Rmax.push_back(corners[inextr].r);
1175 Rmin.push_back (corners[icurl].r+(Zright-corners[icurl].z)/difZl
1176 * (corners[inextl].r - corners[icurl].r));
1177 }
1178 ++icurr;
1179 }
1180 else
1181 {
1182 isConvertible=false; break;
1183 }
1184 }
1185 } // end for loop
1186
1187 // last plane Z=Zmax
1188 //
1189 Z.push_back(Zmax);
1190 ++countPlanes;
1191 inextr=1+icurr;
1192 inextl=(icurl <= 0)? numPlanes-1 : icurl-1;
1193
1194 Rmax.push_back(corners[inextr].r);
1195 Rmin.push_back(corners[inextl].r);
1196
1197 // Set original parameters Rmin,Rmax,Z
1198 //
1199 if(isConvertible)
1200 {
1203 original_parameters->Z_values = new G4double[countPlanes];
1204 original_parameters->Rmin = new G4double[countPlanes];
1205 original_parameters->Rmax = new G4double[countPlanes];
1206
1207 for(G4int j=0; j < countPlanes; ++j)
1208 {
1210 original_parameters->Rmax[j] = Rmax[j];
1211 original_parameters->Rmin[j] = Rmin[j];
1212 }
1215 original_parameters->Num_z_planes = countPlanes;
1216
1217 }
1218 else // Set parameters(r,z) with Rmin==0 as convention
1219 {
1220#ifdef G4SPECSDEBUG
1221 std::ostringstream message;
1222 message << "Polyhedra " << GetName() << G4endl
1223 << "cannot be converted to Polyhedra with (Rmin,Rmaz,Z) parameters!";
1224 G4Exception("G4Polyhedra::SetOriginalParameters()",
1225 "GeomSolids0002", JustWarning, message);
1226#endif
1229 original_parameters->Z_values = new G4double[numPlanes];
1230 original_parameters->Rmin = new G4double[numPlanes];
1231 original_parameters->Rmax = new G4double[numPlanes];
1232
1233 for(G4int j=0; j < numPlanes; ++j)
1234 {
1237 original_parameters->Rmin[j] = 0.0;
1238 }
1241 original_parameters->Num_z_planes = numPlanes;
1242 }
1243}
const G4int Z[17]
G4double Bmax() const

References G4ReduciblePolygon::Bmax(), corners, endPhi, G4endl, G4Exception(), G4VSolid::GetName(), JustWarning, G4VSolid::kCarTolerance, G4PolyhedraHistorical::Num_z_planes, numCorner, numSide, G4PolyhedraHistorical::numSide, G4PolyhedraHistorical::Opening_angle, original_parameters, G4PolyhedraSideRZ::r, G4PolyhedraHistorical::Rmax, G4PolyhedraHistorical::Rmin, G4PolyhedraHistorical::Start_angle, startPhi, G4ReduciblePolygon::StartWithZMin(), G4PolyhedraSideRZ::z, Z, and G4PolyhedraHistorical::Z_values.

◆ SetSurfaceElements()

void G4Polyhedra::SetSurfaceElements ( ) const
protected

Definition at line 872 of file G4Polyhedra.cc.

873{
874 fElements = new std::vector<G4Polyhedra::surface_element>;
875 G4double total = 0.;
876 G4int nrz = GetNumRZCorner();
877
878 // set lateral surface elements
879 G4double dphi = (GetEndPhi() - GetStartPhi())/GetNumSide();
880 G4double cosa = std::cos(dphi);
881 G4double sina = std::sin(dphi);
882 G4int ia = nrz - 1;
883 for (G4int ib=0; ib<nrz; ++ib)
884 {
888 selem.i0 = ia;
889 selem.i1 = ib;
890 ia = ib;
891 if (a.r == 0. && b.r == 0.) continue;
892 G4ThreeVector p1(a.r, 0, a.z);
893 G4ThreeVector p2(a.r*cosa, a.r*sina, a.z);
894 G4ThreeVector p3(b.r*cosa, b.r*sina, b.z);
895 G4ThreeVector p4(b.r, 0, b.z);
896 if (a.r > 0.)
897 {
898 selem.i2 = -1;
899 total += GetNumSide()*(G4GeomTools::TriangleAreaNormal(p1, p2, p3)).mag();
900 selem.area = total;
901 fElements->push_back(selem);
902 }
903 if (b.r > 0.)
904 {
905 selem.i2 = -2;
906 total += GetNumSide()*(G4GeomTools::TriangleAreaNormal(p1, p3, p4)).mag();
907 selem.area = total;
908 fElements->push_back(selem);
909 }
910 }
911
912 // set elements for phi cuts
913 if (IsOpen())
914 {
915 G4TwoVectorList contourRZ;
916 std::vector<G4int> triangles;
917 for (G4int i=0; i<nrz; ++i)
918 {
919 G4PolyhedraSideRZ corner = GetCorner(i);
920 contourRZ.push_back(G4TwoVector(corner.r, corner.z));
921 }
922 G4GeomTools::TriangulatePolygon(contourRZ, triangles);
923 G4int ntria = triangles.size();
924 for (G4int i=0; i<ntria; i+=3)
925 {
927 selem.i0 = triangles[i];
928 selem.i1 = triangles[i+1];
929 selem.i2 = triangles[i+2];
930 G4PolyhedraSideRZ a = GetCorner(selem.i0);
931 G4PolyhedraSideRZ b = GetCorner(selem.i1);
932 G4PolyhedraSideRZ c = GetCorner(selem.i2);
933 G4double stria =
934 std::abs(G4GeomTools::TriangleArea(a.r, a.z, b.r, b.z, c.r, c.z));
935 total += stria;
936 selem.area = total;
937 fElements->push_back(selem); // start phi
938 total += stria;
939 selem.area = total;
940 selem.i0 += nrz;
941 fElements->push_back(selem); // end phi
942 }
943 }
944}
static G4double TriangleArea(G4double Ax, G4double Ay, G4double Bx, G4double By, G4double Cx, G4double Cy)
Definition: G4GeomTools.cc:41
static G4ThreeVector TriangleAreaNormal(const G4ThreeVector &A, const G4ThreeVector &B, const G4ThreeVector &C)
Definition: G4GeomTools.cc:598

References G4Polyhedra::surface_element::area, fElements, GetCorner(), GetEndPhi(), GetNumRZCorner(), GetNumSide(), GetStartPhi(), G4Polyhedra::surface_element::i0, G4Polyhedra::surface_element::i1, G4Polyhedra::surface_element::i2, IsOpen(), G4PolyhedraSideRZ::r, G4INCL::CrossSections::total(), G4GeomTools::TriangleArea(), G4GeomTools::TriangleAreaNormal(), G4GeomTools::TriangulatePolygon(), and G4PolyhedraSideRZ::z.

Referenced by GetPointOnSurface().

◆ StreamInfo()

std::ostream & G4Polyhedra::StreamInfo ( std::ostream &  os) const
virtual

Reimplemented from G4VCSGfaceted.

Definition at line 756 of file G4Polyhedra.cc.

757{
758 G4int oldprc = os.precision(16);
759 os << "-----------------------------------------------------------\n"
760 << " *** Dump for solid - " << GetName() << " ***\n"
761 << " ===================================================\n"
762 << " Solid type: G4Polyhedra\n"
763 << " Parameters: \n"
764 << " starting phi angle : " << startPhi/degree << " degrees \n"
765 << " ending phi angle : " << endPhi/degree << " degrees \n"
766 << " number of sides : " << numSide << " \n";
767 G4int i=0;
768 if (!genericPgon)
769 {
771 os << " number of Z planes: " << numPlanes << "\n"
772 << " Z values: \n";
773 for (i=0; i<numPlanes; ++i)
774 {
775 os << " Z plane " << i << ": "
776 << original_parameters->Z_values[i] << "\n";
777 }
778 os << " Tangent distances to inner surface (Rmin): \n";
779 for (i=0; i<numPlanes; ++i)
780 {
781 os << " Z plane " << i << ": "
782 << original_parameters->Rmin[i] << "\n";
783 }
784 os << " Tangent distances to outer surface (Rmax): \n";
785 for (i=0; i<numPlanes; ++i)
786 {
787 os << " Z plane " << i << ": "
788 << original_parameters->Rmax[i] << "\n";
789 }
790 }
791 os << " number of RZ points: " << numCorner << "\n"
792 << " RZ values (corners): \n";
793 for (i=0; i<numCorner; ++i)
794 {
795 os << " "
796 << corners[i].r << ", " << corners[i].z << "\n";
797 }
798 os << "-----------------------------------------------------------\n";
799 os.precision(oldprc);
800
801 return os;
802}
static constexpr double degree
Definition: G4SIunits.hh:124

References corners, degree, endPhi, genericPgon, G4VSolid::GetName(), G4PolyhedraHistorical::Num_z_planes, numCorner, numSide, original_parameters, G4PolyhedraSideRZ::r, G4PolyhedraHistorical::Rmax, G4PolyhedraHistorical::Rmin, startPhi, G4PolyhedraSideRZ::z, and G4PolyhedraHistorical::Z_values.

◆ SurfaceNormal()

G4ThreeVector G4VCSGfaceted::SurfaceNormal ( const G4ThreeVector p) const
virtualinherited

Implements G4VSolid.

Definition at line 225 of file G4VCSGfaceted.cc.

226{
227 G4ThreeVector answer;
228 G4VCSGface **face = faces;
229 G4double best = kInfinity;
230 do // Loop checking, 13.08.2015, G.Cosmo
231 {
232 G4double distance;
233 G4ThreeVector normal = (*face)->Normal( p, &distance );
234 if (distance < best)
235 {
236 best = distance;
237 answer = normal;
238 }
239 } while( ++face < faces + numFace );
240
241 return answer;
242}

References G4VCSGfaceted::faces, kInfinity, CLHEP::normal(), and G4VCSGfaceted::numFace.

Field Documentation

◆ corners

G4PolyhedraSideRZ* G4Polyhedra::corners = nullptr
protected

◆ enclosingCylinder

G4EnclosingCylinder* G4Polyhedra::enclosingCylinder = nullptr
protected

Definition at line 191 of file G4Polyhedra.hh.

Referenced by CopyStuff(), Create(), DistanceToIn(), Inside(), operator=(), Reset(), and ~G4Polyhedra().

◆ endPhi

G4double G4Polyhedra::endPhi
protected

◆ faces

G4VCSGface** G4VCSGfaceted::faces = nullptr
protectedinherited

◆ fAreaAccuracy

G4double G4VCSGfaceted::fAreaAccuracy
privateinherited

◆ fCubicVolume

G4double G4VCSGfaceted::fCubicVolume = 0.0
protectedinherited

◆ fCubVolEpsilon

G4double G4VCSGfaceted::fCubVolEpsilon
privateinherited

◆ fElements

std::vector<surface_element>* G4Polyhedra::fElements = nullptr
mutableprotected

Definition at line 194 of file G4Polyhedra.hh.

Referenced by CopyStuff(), GetPointOnSurface(), Reset(), SetSurfaceElements(), and ~G4Polyhedra().

◆ fpPolyhedron

G4Polyhedron* G4VCSGfaceted::fpPolyhedron = nullptr
mutableprotectedinherited

◆ fRebuildPolyhedron

G4bool G4VCSGfaceted::fRebuildPolyhedron = false
mutableprotectedinherited

◆ fshapeName

G4String G4VSolid::fshapeName
privateinherited

Definition at line 312 of file G4VSolid.hh.

Referenced by G4VSolid::operator=(), and G4VSolid::SetName().

◆ fStatistics

G4int G4VCSGfaceted::fStatistics
privateinherited

◆ fSurfaceArea

G4double G4VCSGfaceted::fSurfaceArea = 0.0
protectedinherited

◆ genericPgon

G4bool G4Polyhedra::genericPgon = false
protected

Definition at line 186 of file G4Polyhedra.hh.

Referenced by CopyStuff(), Reset(), and StreamInfo().

◆ kCarTolerance

G4double G4VSolid::kCarTolerance
protectedinherited

Definition at line 299 of file G4VSolid.hh.

Referenced by G4TessellatedSolid::AddFacet(), G4Polycone::CalculateExtent(), CalculateExtent(), G4Tet::CheckDegeneracy(), G4Para::CheckParameters(), G4Trd::CheckParameters(), G4Ellipsoid::CheckParameters(), G4EllipticalTube::CheckParameters(), G4GenericTrap::ComputeIsTwisted(), Create(), G4GenericPolycone::Create(), G4Polycone::Create(), G4CutTubs::CreatePolyhedron(), G4TessellatedSolid::CreateVertexList(), G4VCSGfaceted::DistanceTo(), G4Sphere::DistanceToIn(), G4Ellipsoid::DistanceToIn(), G4Hype::DistanceToIn(), G4Paraboloid::DistanceToIn(), G4VCSGfaceted::DistanceToIn(), G4TessellatedSolid::DistanceToInCore(), G4Cons::DistanceToOut(), G4CutTubs::DistanceToOut(), G4Sphere::DistanceToOut(), G4Torus::DistanceToOut(), G4Tubs::DistanceToOut(), G4GenericTrap::DistanceToOut(), G4Hype::DistanceToOut(), G4Paraboloid::DistanceToOut(), G4VCSGfaceted::DistanceToOut(), G4TessellatedSolid::DistanceToOutCandidates(), G4TessellatedSolid::DistanceToOutCore(), G4TessellatedSolid::DistanceToOutNoVoxels(), G4GenericTrap::DistToPlane(), G4GenericTrap::DistToTriangle(), G4Box::G4Box(), G4Cons::G4Cons(), G4CutTubs::G4CutTubs(), G4EllipticalCone::G4EllipticalCone(), G4ExtrudedSolid::G4ExtrudedSolid(), G4GenericTrap::G4GenericTrap(), G4Hype::G4Hype(), G4Para::G4Para(), G4Sphere::G4Sphere(), G4Tet::G4Tet(), G4Trap::G4Trap(), G4Tubs::G4Tubs(), G4UnionSolid::G4UnionSolid(), G4VSolid::G4VSolid(), G4VTwistedFaceted::G4VTwistedFaceted(), G4GenericPolycone::GetPointOnSurface(), G4Polycone::GetPointOnSurface(), G4UnionSolid::Init(), G4Orb::Initialize(), G4TessellatedSolid::Initialize(), G4SubtractionSolid::Inside(), G4Hype::Inside(), G4Paraboloid::Inside(), G4VCSGfaceted::Inside(), G4VTwistedFaceted::Inside(), G4TessellatedSolid::InsideNoVoxels(), G4GenericTrap::InsidePolygone(), G4TessellatedSolid::InsideVoxels(), G4CutTubs::IsCrossingCutPlanes(), G4GenericTrap::IsSegCrossingZ(), G4Trap::MakePlane(), G4GenericTrap::NormalToPlane(), G4VSolid::operator=(), G4TessellatedSolid::SafetyFromInside(), G4TessellatedSolid::SafetyFromOutside(), G4Torus::SetAllParameters(), G4Polycone::SetOriginalParameters(), SetOriginalParameters(), G4Box::SetXHalfLength(), G4Box::SetYHalfLength(), G4Box::SetZHalfLength(), G4Torus::SurfaceNormal(), G4GenericTrap::SurfaceNormal(), and G4Paraboloid::SurfaceNormal().

◆ numCorner

G4int G4Polyhedra::numCorner = 0
protected

◆ numFace

G4int G4VCSGfaceted::numFace = 0
protectedinherited

◆ numSide

G4int G4Polyhedra::numSide = 0
protected

◆ original_parameters

G4PolyhedraHistorical* G4Polyhedra::original_parameters = nullptr
protected

◆ phiIsOpen

G4bool G4Polyhedra::phiIsOpen = false
protected

Definition at line 185 of file G4Polyhedra.hh.

Referenced by CopyStuff(), and Create().

◆ startPhi

G4double G4Polyhedra::startPhi
protected

The documentation for this class was generated from the following files: