91 if (
this == &source)
return *
this;
124 const G4int numSide =
125 G4int(G4Polyhedron::GetNumberOfRotationSteps()
131 typedef G4int int4[4];
139 std::vector<G4int*> triQuads;
142 while (remaining >= 3)
146 G4int A = -1, B = -1, C = -1;
147 G4int iStepper = iStarter;
150 if (A < 0) { A = iStepper; }
151 else if (B < 0) { B = iStepper; }
152 else if (C < 0) { C = iStepper; }
157 while (chopped[iStepper]);
159 while (C < 0 && iStepper != iStarter);
174 triQuads.push_back(tq);
184 while (chopped[iStarter]);
191 faces_vec =
new int4[nFaces];
195 for (
G4int iEnd = 0; iEnd < 2; ++iEnd)
197 for (
size_t i = 0; i < triQuads.size(); ++i)
210 a = triQuads[i][0] + addition;
211 b = triQuads[i][2] + addition;
212 c = triQuads[i][1] + addition;
215 G4int bc = std::abs(c - b);
216 G4int ca = std::abs(a - c);
217 faces_vec[iface][0] = (ab == 1 || ab == d)? a: -a;
218 faces_vec[iface][1] = (bc == 1 || bc == d)? b: -b;
219 faces_vec[iface][2] = (ca == 1 || ca == d)? c: -c;
220 faces_vec[iface][3] = 0;
227 xyz =
new double3[nNodes];
231 for (
G4int iSide = 0; iSide < numSide; ++iSide)
235 xyz[ixyz][0] =
GetCorner(iCorner).
r * std::cos(phi);
236 xyz[ixyz][1] =
GetCorner(iCorner).
r * std::sin(phi);
242 faces_vec[iface][0] = ixyz + 1;
245 faces_vec[iface][3] = ixyz + 2;
249 faces_vec[iface][0] = ixyz + 1;
251 faces_vec[iface][2] = ixyz + 2;
255 else if (iSide == numSide - 1)
259 faces_vec[iface][0] = ixyz + 1;
262 faces_vec[iface][3] = -(ixyz + 2);
266 faces_vec[iface][0] = ixyz + 1;
268 faces_vec[iface][2] = ixyz + 2;
276 faces_vec[iface][0] = ixyz + 1;
279 faces_vec[iface][3] = -(ixyz + 2);
283 faces_vec[iface][0] = ixyz + 1;
285 faces_vec[iface][2] = ixyz + 2;
299 xyz[ixyz][0] =
GetCorner(iCorner).
r * std::cos(phi);
300 xyz[ixyz][1] =
GetCorner(iCorner).
r * std::sin(phi);
309 xyz =
new double3[nNodes];
310 faces_vec =
new int4[nFaces];
313 G4int ixyz = 0, iface = 0;
314 for (
G4int iSide = 0; iSide < numSide; ++iSide)
318 xyz[ixyz][0] =
GetCorner(iCorner).
r * std::cos(phi);
319 xyz[ixyz][1] =
GetCorner(iCorner).
r * std::sin(phi);
322 if (iSide < numSide - 1)
326 faces_vec[iface][0] = ixyz + 1;
329 faces_vec[iface][3] = -(ixyz + 2);
333 faces_vec[iface][0] = ixyz + 1;
335 faces_vec[iface][2] = ixyz + 2;
343 faces_vec[iface][0] = ixyz + 1;
346 faces_vec[iface][3] = -(ixyz + 2);
350 faces_vec[iface][0] = ixyz + 1;
352 faces_vec[iface][2] = ixyz - nFaces + 2;
363 G4int problem = polyhedron->createPolyhedron(nNodes, nFaces, xyz, faces_vec);
368 std::ostringstream message;
369 message <<
"Problem creating G4Polyhedron for: " <<
GetName();
370 G4Exception(
"G4GenericPolycone::CreatePolyhedron()",
"GeomSolids1002",
G4double GetStartPhi() const
G4Polyhedron * CreatePolyhedron() const
G4PolyconeSideRZ GetCorner(G4int index) const
G4double GetEndPhi() const
G4int GetNumRZCorner() const
G4UGenericPolycone(const G4String &name, G4double phiStart, G4double phiTotal, G4int numRZ, const G4double r[], const G4double z[])
static const G4double A[nN]
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
G4UGenericPolycone & operator=(const G4UGenericPolycone &source)
G4USolid & operator=(const G4USolid &rhs)