42 #if !defined(G4GEOM_USE_UGENERICPOLYCONE)
54 using namespace CLHEP;
70 Create( phiStart, phiTotal, rz );
94 std::ostringstream message;
95 message <<
"Illegal input parameters - " <<
GetName() <<
G4endl
96 <<
" All R values must be >= 0 !";
97 G4Exception(
"G4GenericPolycone::Create()",
"GeomSolids0002",
107 std::ostringstream message;
108 message <<
"Illegal input parameters - " <<
GetName() <<
G4endl
109 <<
" R/Z cross section is zero or near zero: " << rzArea;
110 G4Exception(
"G4GenericPolycone::Create()",
"GeomSolids0002",
117 std::ostringstream message;
118 message <<
"Illegal input parameters - " <<
GetName() <<
G4endl
119 <<
" Too few unique R/Z values !";
120 G4Exception(
"G4GenericPolycone::Create()",
"GeomSolids0002",
126 std::ostringstream message;
127 message <<
"Illegal input parameters - " <<
GetName() <<
G4endl
128 <<
" R/Z segments cross !";
129 G4Exception(
"G4GenericPolycone::Create()",
"GeomSolids0002",
139 if (phiTotal <= 0 || phiTotal > twopi-1E-10)
155 endPhi = phiStart+phiTotal;
173 next->
r = iterRZ.
GetA();
174 next->
z = iterRZ.
GetB();
175 }
while( ++next, iterRZ.
Next() );
207 if (corner->
z > next->
z)
224 }
while( prev=corner, corner=next, corner >
corners );
253 :
G4VCSGfaceted(a), startPhi(0.), endPhi(0.), phiIsOpen(false),
254 numCorner(0), corners(0), enclosingCylinder(0)
284 if (
this == &source)
return *
this;
337 std::ostringstream message;
338 message <<
"Solid " <<
GetName() <<
" built using generic construct."
339 <<
G4endl <<
"Not applicable to the generic construct !";
340 G4Exception(
"G4GenericPolycone::Reset()",
"GeomSolids1001",
413 return G4String(
"G4GenericPolycone");
430 G4int oldprc = os.precision(16);
431 os <<
"-----------------------------------------------------------\n"
432 <<
" *** Dump for solid - " <<
GetName() <<
" ***\n"
433 <<
" ===================================================\n"
434 <<
" Solid type: G4GenericPolycone\n"
437 <<
" ending phi angle : " <<
endPhi/
degree <<
" degrees \n";
440 os <<
" number of RZ points: " <<
numCorner <<
"\n"
441 <<
" RZ values (corners): \n";
447 os <<
"-----------------------------------------------------------\n";
448 os.precision(oldprc);
491 const G4int numSide =
492 G4int(G4Polyhedron::GetNumberOfRotationSteps()
498 typedef G4int int4[4];
505 std::vector<G4bool> chopped(
numCorner,
false);
506 std::vector<G4int*> triQuads;
509 while (remaining >= 3)
513 G4int A = -1, B = -1, C = -1;
514 G4int iStepper = iStarter;
517 if (A < 0) { A = iStepper; }
518 else if (B < 0) { B = iStepper; }
519 else if (C < 0) { C = iStepper; }
522 if (++iStepper >=
numCorner) { iStepper = 0; }
524 while (chopped[iStepper]);
526 while (C < 0 && iStepper != iStarter);
541 triQuads.push_back(tq);
549 if (++iStarter >=
numCorner) { iStarter = 0; }
551 while (chopped[iStarter]);
557 nFaces = numSide *
numCorner + 2 * triQuads.size();
558 faces_vec =
new int4[nFaces];
562 for (
G4int iEnd = 0; iEnd < 2; ++iEnd)
564 for (
size_t i = 0; i < triQuads.size(); ++i)
577 a = triQuads[i][0] + addition;
578 b = triQuads[i][2] + addition;
579 c = triQuads[i][1] + addition;
582 G4int bc = std::abs(c - b);
583 G4int ca = std::abs(a - c);
584 faces_vec[iface][0] = (ab == 1 || ab == d)? a: -a;
585 faces_vec[iface][1] = (bc == 1 || bc == d)? b: -b;
586 faces_vec[iface][2] = (ca == 1 || ca == d)? c: -c;
587 faces_vec[iface][3] = 0;
594 xyz =
new double3[nNodes];
598 for (
G4int iSide = 0; iSide < numSide; ++iSide)
602 xyz[ixyz][0] =
corners[iCorner].
r * std::cos(phi);
603 xyz[ixyz][1] =
corners[iCorner].
r * std::sin(phi);
607 if (iCorner < numCorner - 1)
609 faces_vec[iface][0] = ixyz + 1;
610 faces_vec[iface][1] = -(ixyz + numCorner + 1);
611 faces_vec[iface][2] = ixyz + numCorner + 2;
612 faces_vec[iface][3] = ixyz + 2;
616 faces_vec[iface][0] = ixyz + 1;
617 faces_vec[iface][1] = -(ixyz + numCorner + 1);
618 faces_vec[iface][2] = ixyz + 2;
619 faces_vec[iface][3] = ixyz - numCorner + 2;
622 else if (iSide == numSide - 1)
624 if (iCorner < numCorner - 1)
626 faces_vec[iface][0] = ixyz + 1;
627 faces_vec[iface][1] = ixyz + numCorner + 1;
628 faces_vec[iface][2] = ixyz + numCorner + 2;
629 faces_vec[iface][3] = -(ixyz + 2);
633 faces_vec[iface][0] = ixyz + 1;
634 faces_vec[iface][1] = ixyz + numCorner + 1;
635 faces_vec[iface][2] = ixyz + 2;
636 faces_vec[iface][3] = -(ixyz - numCorner + 2);
641 if (iCorner < numCorner - 1)
643 faces_vec[iface][0] = ixyz + 1;
644 faces_vec[iface][1] = -(ixyz + numCorner + 1);
645 faces_vec[iface][2] = ixyz + numCorner + 2;
646 faces_vec[iface][3] = -(ixyz + 2);
650 faces_vec[iface][0] = ixyz + 1;
651 faces_vec[iface][1] = -(ixyz + numCorner + 1);
652 faces_vec[iface][2] = ixyz + 2;
653 faces_vec[iface][3] = -(ixyz - numCorner + 2);
666 xyz[ixyz][0] =
corners[iCorner].
r * std::cos(phi);
667 xyz[ixyz][1] =
corners[iCorner].
r * std::sin(phi);
676 xyz =
new double3[nNodes];
677 faces_vec =
new int4[nFaces];
680 G4int ixyz = 0, iface = 0;
681 for (
G4int iSide = 0; iSide < numSide; ++iSide)
685 xyz[ixyz][0] =
corners[iCorner].
r * std::cos(phi);
686 xyz[ixyz][1] =
corners[iCorner].
r * std::sin(phi);
689 if (iSide < numSide - 1)
691 if (iCorner < numCorner - 1)
693 faces_vec[iface][0] = ixyz + 1;
694 faces_vec[iface][1] = -(ixyz + numCorner + 1);
695 faces_vec[iface][2] = ixyz + numCorner + 2;
696 faces_vec[iface][3] = -(ixyz + 2);
700 faces_vec[iface][0] = ixyz + 1;
701 faces_vec[iface][1] = -(ixyz + numCorner + 1);
702 faces_vec[iface][2] = ixyz + 2;
703 faces_vec[iface][3] = -(ixyz - numCorner + 2);
708 if (iCorner < numCorner - 1)
710 faces_vec[iface][0] = ixyz + 1;
711 faces_vec[iface][1] = -(ixyz + numCorner - nFaces + 1);
712 faces_vec[iface][2] = ixyz + numCorner - nFaces + 2;
713 faces_vec[iface][3] = -(ixyz + 2);
717 faces_vec[iface][0] = ixyz + 1;
718 faces_vec[iface][1] = -(ixyz - nFaces + numCorner + 1);
719 faces_vec[iface][2] = ixyz - nFaces + 2;
720 faces_vec[iface][3] = -(ixyz - numCorner + 2);
730 G4int problem = polyhedron->createPolyhedron(nNodes, nFaces, xyz, faces_vec);
735 std::ostringstream message;
736 message <<
"Problem creating G4Polyhedron for: " <<
GetName();
737 G4Exception(
"G4GenericPolycone::CreatePolyhedron()",
"GeomSolids1002",
G4bool CrossesItself(G4double tolerance)
const G4GenericPolycone & operator=(const G4GenericPolycone &source)
static const G4double kInfinity
G4PolyconeSideRZ * corners
CLHEP::Hep3Vector G4ThreeVector
virtual G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const
G4bool MustBeOutside(const G4ThreeVector &p) const
G4GenericPolycone(const G4String &name, G4double phiStart, G4double phiTotal, G4int numRZ, const G4double r[], const G4double z[])
G4GeometryType GetEntityType() const
G4Polyhedron * CreatePolyhedron() const
G4bool RemoveDuplicateVertices(G4double tolerance)
G4ThreeVector GetPointOnSurface() const
G4EnclosingCylinder * enclosingCylinder
void Create(G4double phiStart, G4double phiTotal, G4ReduciblePolygon *rz)
G4bool RemoveRedundantVertices(G4double tolerance)
G4ThreeVector GetPointOnSurfaceGeneric() const
G4int NumVertices() const
void CopyStuff(const G4GenericPolycone &source)
std::ostream & StreamInfo(std::ostream &os) const
G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const
const G4VCSGfaceted & operator=(const G4VCSGfaceted &source)
static const G4double A[nN]
virtual ~G4GenericPolycone()
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
EInside Inside(const G4ThreeVector &p) const
static const double degree
G4bool BisectedBy(G4double a1, G4double b1, G4double a2, G4double b2, G4double tolerance)
virtual EInside Inside(const G4ThreeVector &p) const
G4bool ShouldMiss(const G4ThreeVector &p, const G4ThreeVector &v) const