Geant4  v4-10.4-release
 모두 클래스 네임스페이스들 파일들 함수 변수 타입정의 열거형 타입 열거형 멤버 Friends 매크로 그룹들 페이지들
G4UGenericPolycone.cc
이 파일의 문서화 페이지로 가기
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 //
27 // $Id:$
28 //
29 //
30 // Implementation of G4UGenericPolycone wrapper class
31 // --------------------------------------------------------------------
32 
33 #include "G4GenericPolycone.hh"
34 #if 0
35 #include "G4UGenericPolycone.hh"
36 
37 #if ( defined(G4GEOM_USE_USOLIDS) || defined(G4GEOM_USE_PARTIAL_USOLIDS) )
38 
39 #include "G4GeomTools.hh"
40 #include "G4AffineTransform.hh"
41 #include "G4VPVParameterisation.hh"
42 #include "G4BoundingEnvelope.hh"
43 
44 #include "G4Polyhedron.hh"
45 
46 using namespace CLHEP;
47 
49 //
50 // Constructor (generic parameters)
51 //
52 G4UGenericPolycone::G4UGenericPolycone(const G4String& name,
53  G4double phiStart,
54  G4double phiTotal,
55  G4int numRZ,
56  const G4double r[],
57  const G4double z[] )
58  : G4USolid(name, new UGenericPolycone(name, phiStart, phiTotal, numRZ, r, z))
59 {
60 }
61 
62 
64 //
65 // Fake default constructor - sets only member data and allocates memory
66 // for usage restricted to object persistency.
67 //
68 G4UGenericPolycone::G4UGenericPolycone(__void__& a)
69  : G4USolid(a)
70 {
71 }
72 
73 
75 //
76 // Destructor
77 //
78 G4UGenericPolycone::~G4UGenericPolycone()
79 {
80 }
81 
82 
84 //
85 // Copy constructor
86 //
87 G4UGenericPolycone::G4UGenericPolycone(const G4UGenericPolycone &source)
88  : G4USolid(source)
89 {
90 }
91 
92 
94 //
95 // Assignment operator
96 //
97 G4UGenericPolycone&
98 G4UGenericPolycone::operator=(const G4UGenericPolycone &source)
99 {
100  if (this == &source) return *this;
101 
102  G4USolid::operator=( source );
103 
104  return *this;
105 }
106 
107 G4double G4UGenericPolycone::GetStartPhi() const
108 {
109  return GetShape()->GetStartPhi();
110 }
111 G4double G4UGenericPolycone::GetEndPhi() const
112 {
113  return GetShape()->GetEndPhi();
114 }
115 G4double G4UGenericPolycone::GetSinStartPhi() const
116 {
117  if (!GetShape()->IsOpen()) return 0;
118  G4double phi = GetShape()->GetStartPhi();
119  return std::sin(phi);
120 }
121 G4double G4UGenericPolycone::GetCosStartPhi() const
122 {
123  if (!GetShape()->IsOpen()) return 1;
124  G4double phi = GetShape()->GetStartPhi();
125  return std::cos(phi);
126 }
127 G4double G4UGenericPolycone::GetSinEndPhi() const
128 {
129  if (!GetShape()->IsOpen()) return 0;
130  G4double phi = GetShape()->GetEndPhi();
131  return std::sin(phi);
132 }
133 G4double G4UGenericPolycone::GetCosEndPhi() const
134 {
135  if (!GetShape()->IsOpen()) return 1;
136  G4double phi = GetShape()->GetEndPhi();
137  return std::cos(phi);
138 }
139 G4bool G4UGenericPolycone::IsOpen() const
140 {
141  return GetShape()->IsOpen();
142 }
143 G4int G4UGenericPolycone::GetNumRZCorner() const
144 {
145  return GetShape()->GetNumRZCorner();
146 }
147 G4PolyconeSideRZ G4UGenericPolycone::GetCorner(G4int index) const
148 {
149  UPolyconeSideRZ pside = GetShape()->GetCorner(index);
150  G4PolyconeSideRZ psiderz = { pside.r, pside.z };
151 
152  return psiderz;
153 }
154 
156 //
157 // Get bounding box
158 
159 void
160 G4UGenericPolycone::BoundingLimits(G4ThreeVector& pMin,
161  G4ThreeVector& pMax) const
162 {
163  G4double rmin = kInfinity, rmax = -kInfinity;
164  G4double zmin = kInfinity, zmax = -kInfinity;
165 
166  for (G4int i=0; i<GetNumRZCorner(); ++i)
167  {
168  G4PolyconeSideRZ corner = GetCorner(i);
169  if (corner.r < rmin) rmin = corner.r;
170  if (corner.r > rmax) rmax = corner.r;
171  if (corner.z < zmin) zmin = corner.z;
172  if (corner.z > zmax) zmax = corner.z;
173  }
174 
175  if (IsOpen())
176  {
177  G4TwoVector vmin,vmax;
178  G4GeomTools::DiskExtent(rmin,rmax,
179  GetSinStartPhi(),GetCosStartPhi(),
180  GetSinEndPhi(),GetCosEndPhi(),
181  vmin,vmax);
182  pMin.set(vmin.x(),vmin.y(),zmin);
183  pMax.set(vmax.x(),vmax.y(),zmax);
184  }
185  else
186  {
187  pMin.set(-rmax,-rmax, zmin);
188  pMax.set( rmax, rmax, zmax);
189  }
190 
191  // Check correctness of the bounding box
192  //
193  if (pMin.x() >= pMax.x() || pMin.y() >= pMax.y() || pMin.z() >= pMax.z())
194  {
195  std::ostringstream message;
196  message << "Bad bounding box (min >= max) for solid: "
197  << GetName() << " !"
198  << "\npMin = " << pMin
199  << "\npMax = " << pMax;
200  G4Exception("G4UGenericPolycone::BoundingLimits()", "GeomMgt0001",
201  JustWarning, message);
202  StreamInfo(G4cout);
203  }
204 }
205 
207 //
208 // Calculate extent under transform and specified limit
209 
210 G4bool
211 G4UGenericPolycone::CalculateExtent(const EAxis pAxis,
212  const G4VoxelLimits& pVoxelLimit,
213  const G4AffineTransform& pTransform,
214  G4double& pMin, G4double& pMax) const
215 {
216  G4ThreeVector bmin, bmax;
217  G4bool exist;
218 
219  // Check bounding box (bbox)
220  //
221  BoundingLimits(bmin,bmax);
222  G4BoundingEnvelope bbox(bmin,bmax);
223 #ifdef G4BBOX_EXTENT
224  if (true) return bbox.CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax);
225 #endif
226  if (bbox.BoundingBoxVsVoxelLimits(pAxis,pVoxelLimit,pTransform,pMin,pMax))
227  {
228  return exist = (pMin < pMax) ? true : false;
229  }
230 
231  // To find the extent, RZ contour of the polycone is subdivided
232  // in triangles. The extent is calculated as cumulative extent of
233  // all sub-polycones formed by rotation of triangles around Z
234  //
235  G4TwoVectorList contourRZ;
236  G4TwoVectorList triangles;
237  G4double eminlim = pVoxelLimit.GetMinExtent(pAxis);
238  G4double emaxlim = pVoxelLimit.GetMaxExtent(pAxis);
239 
240  // get RZ contour, ensure anticlockwise order of corners
241  for (G4int i=0; i<GetNumRZCorner(); ++i)
242  {
243  G4PolyconeSideRZ corner = GetCorner(i);
244  contourRZ.push_back(G4TwoVector(corner.r,corner.z));
245  }
246  G4double area = G4GeomTools::PolygonArea(contourRZ);
247  if (area < 0.) std::reverse(contourRZ.begin(),contourRZ.end());
248 
249  // triangulate RZ countour
250  if (!G4GeomTools::TriangulatePolygon(contourRZ,triangles))
251  {
252  std::ostringstream message;
253  message << "Triangulation of RZ contour has failed for solid: "
254  << GetName() << " !"
255  << "\nExtent has been calculated using boundary box";
256  G4Exception("G4UGenericPolycone::CalculateExtent()",
257  "GeomMgt1002", JustWarning, message);
258  return bbox.CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax);
259  }
260 
261  // set trigonometric values
262  const G4int NSTEPS = 24; // number of steps for whole circle
263  G4double astep = twopi/NSTEPS; // max angle for one step
264 
265  G4double sphi = GetStartPhi();
266  G4double ephi = GetEndPhi();
267  G4double dphi = IsOpen() ? ephi-sphi : twopi;
268  G4int ksteps = (dphi <= astep) ? 1 : (G4int)((dphi-deg)/astep) + 1;
269  G4double ang = dphi/ksteps;
270 
271  G4double sinHalf = std::sin(0.5*ang);
272  G4double cosHalf = std::cos(0.5*ang);
273  G4double sinStep = 2.*sinHalf*cosHalf;
274  G4double cosStep = 1. - 2.*sinHalf*sinHalf;
275 
276  G4double sinStart = GetSinStartPhi();
277  G4double cosStart = GetCosStartPhi();
278  G4double sinEnd = GetSinEndPhi();
279  G4double cosEnd = GetCosEndPhi();
280 
281  // define vectors and arrays
282  std::vector<const G4ThreeVectorList *> polygons;
283  polygons.resize(ksteps+2);
284  G4ThreeVectorList pols[NSTEPS+2];
285  for (G4int k=0; k<ksteps+2; ++k) pols[k].resize(6);
286  for (G4int k=0; k<ksteps+2; ++k) polygons[k] = &pols[k];
287  G4double r0[6],z0[6]; // contour with original edges of triangle
288  G4double r1[6]; // shifted radii of external edges of triangle
289 
290  // main loop along triangles
291  pMin = kInfinity;
292  pMax =-kInfinity;
293  G4int ntria = triangles.size()/3;
294  for (G4int i=0; i<ntria; ++i)
295  {
296  G4int i3 = i*3;
297  for (G4int k=0; k<3; ++k)
298  {
299  G4int e0 = i3+k, e1 = (k<2) ? e0+1 : i3;
300  G4int k2 = k*2;
301  // set contour with original edges of triangle
302  r0[k2+0] = triangles[e0].x(); z0[k2+0] = triangles[e0].y();
303  r0[k2+1] = triangles[e1].x(); z0[k2+1] = triangles[e1].y();
304  // set shifted radii
305  r1[k2+0] = r0[k2+0];
306  r1[k2+1] = r0[k2+1];
307  if (z0[k2+1] - z0[k2+0] <= 0) continue;
308  r1[k2+0] /= cosHalf;
309  r1[k2+1] /= cosHalf;
310  }
311 
312  // rotate countour, set sequence of 6-sided polygons
313  G4double sinCur = sinStart*cosHalf + cosStart*sinHalf;
314  G4double cosCur = cosStart*cosHalf - sinStart*sinHalf;
315  for (G4int j=0; j<6; ++j)
316  {
317  pols[0][j].set(r0[j]*cosStart,r0[j]*sinStart,z0[j]);
318  }
319  for (G4int k=1; k<ksteps+1; ++k)
320  {
321  for (G4int j=0; j<6; ++j)
322  {
323  pols[k][j].set(r1[j]*cosCur,r1[j]*sinCur,z0[j]);
324  }
325  G4double sinTmp = sinCur;
326  sinCur = sinCur*cosStep + cosCur*sinStep;
327  cosCur = cosCur*cosStep - sinTmp*sinStep;
328  }
329  for (G4int j=0; j<6; ++j)
330  {
331  pols[ksteps+1][j].set(r0[j]*cosEnd,r0[j]*sinEnd,z0[j]);
332  }
333 
334  // set sub-envelope and adjust extent
335  G4double emin,emax;
336  G4BoundingEnvelope benv(polygons);
337  if (!benv.CalculateExtent(pAxis,pVoxelLimit,pTransform,emin,emax)) continue;
338  if (emin < pMin) pMin = emin;
339  if (emax > pMax) pMax = emax;
340  if (eminlim > pMin && emaxlim < pMax) return true; // max possible extent
341  }
342  return (pMin < pMax);
343 }
344 
346 //
347 // CreatePolyhedron
348 
349 G4Polyhedron* G4UGenericPolycone::CreatePolyhedron() const
350 {
351 
352 
353  // The following code prepares for:
354  // HepPolyhedron::createPolyhedron(int Nnodes, int Nfaces,
355  // const double xyz[][3],
356  // const int faces_vec[][4])
357  // Here is an extract from the header file HepPolyhedron.h:
375  const G4int numSide =
377  * (GetEndPhi() - GetStartPhi()) / twopi) + 1;
378  G4int nNodes;
379  G4int nFaces;
380  typedef G4double double3[3];
381  double3* xyz;
382  typedef G4int int4[4];
383  int4* faces_vec;
384  if (IsOpen())
385  {
386  // Triangulate open ends. Simple ear-chopping algorithm...
387  // I'm not sure how robust this algorithm is (J.Allison).
388  //
389  std::vector<G4bool> chopped(GetNumRZCorner(), false);
390  std::vector<G4int*> triQuads;
391  G4int remaining = GetNumRZCorner();
392  G4int iStarter = 0;
393  while (remaining >= 3) // Loop checking, 13.08.2015, G.Cosmo
394  {
395  // Find unchopped corners...
396  //
397  G4int A = -1, B = -1, C = -1;
398  G4int iStepper = iStarter;
399  do // Loop checking, 13.08.2015, G.Cosmo
400  {
401  if (A < 0) { A = iStepper; }
402  else if (B < 0) { B = iStepper; }
403  else if (C < 0) { C = iStepper; }
404  do // Loop checking, 13.08.2015, G.Cosmo
405  {
406  if (++iStepper >= GetNumRZCorner()) { iStepper = 0; }
407  }
408  while (chopped[iStepper]);
409  }
410  while (C < 0 && iStepper != iStarter);
411 
412  // Check triangle at B is pointing outward (an "ear").
413  // Sign of z cross product determines...
414  //
415  G4double BAr = GetCorner(A).r - GetCorner(B).r;
416  G4double BAz = GetCorner(A).z - GetCorner(B).z;
417  G4double BCr = GetCorner(C).r - GetCorner(B).r;
418  G4double BCz = GetCorner(C).z - GetCorner(B).z;
419  if (BAr * BCz - BAz * BCr < kCarTolerance)
420  {
421  G4int* tq = new G4int[3];
422  tq[0] = A + 1;
423  tq[1] = B + 1;
424  tq[2] = C + 1;
425  triQuads.push_back(tq);
426  chopped[B] = true;
427  --remaining;
428  }
429  else
430  {
431  do // Loop checking, 13.08.2015, G.Cosmo
432  {
433  if (++iStarter >= GetNumRZCorner()) { iStarter = 0; }
434  }
435  while (chopped[iStarter]);
436  }
437  }
438  // Transfer to faces...
439  //
440  nNodes = (numSide + 1) * GetNumRZCorner();
441  nFaces = numSide * GetNumRZCorner() + 2 * triQuads.size();
442  faces_vec = new int4[nFaces];
443  G4int iface = 0;
444  G4int addition = GetNumRZCorner() * numSide;
445  G4int d = GetNumRZCorner() - 1;
446  for (G4int iEnd = 0; iEnd < 2; ++iEnd)
447  {
448  for (size_t i = 0; i < triQuads.size(); ++i)
449  {
450  // Negative for soft/auxiliary/normally invisible edges...
451  //
452  G4int a, b, c;
453  if (iEnd == 0)
454  {
455  a = triQuads[i][0];
456  b = triQuads[i][1];
457  c = triQuads[i][2];
458  }
459  else
460  {
461  a = triQuads[i][0] + addition;
462  b = triQuads[i][2] + addition;
463  c = triQuads[i][1] + addition;
464  }
465  G4int ab = std::abs(b - a);
466  G4int bc = std::abs(c - b);
467  G4int ca = std::abs(a - c);
468  faces_vec[iface][0] = (ab == 1 || ab == d)? a: -a;
469  faces_vec[iface][1] = (bc == 1 || bc == d)? b: -b;
470  faces_vec[iface][2] = (ca == 1 || ca == d)? c: -c;
471  faces_vec[iface][3] = 0;
472  ++iface;
473  }
474  }
475 
476  // Continue with sides...
477 
478  xyz = new double3[nNodes];
479  const G4double dPhi = (GetEndPhi() - GetStartPhi()) / numSide;
480  G4double phi = GetStartPhi();
481  G4int ixyz = 0;
482  for (G4int iSide = 0; iSide < numSide; ++iSide)
483  {
484  for (G4int iCorner = 0; iCorner < GetNumRZCorner(); ++iCorner)
485  {
486  xyz[ixyz][0] = GetCorner(iCorner).r * std::cos(phi);
487  xyz[ixyz][1] = GetCorner(iCorner).r * std::sin(phi);
488  xyz[ixyz][2] = GetCorner(iCorner).z;
489  if (iSide == 0) // startPhi
490  {
491  if (iCorner < GetNumRZCorner() - 1)
492  {
493  faces_vec[iface][0] = ixyz + 1;
494  faces_vec[iface][1] = -(ixyz + GetNumRZCorner() + 1);
495  faces_vec[iface][2] = ixyz + GetNumRZCorner() + 2;
496  faces_vec[iface][3] = ixyz + 2;
497  }
498  else
499  {
500  faces_vec[iface][0] = ixyz + 1;
501  faces_vec[iface][1] = -(ixyz + GetNumRZCorner() + 1);
502  faces_vec[iface][2] = ixyz + 2;
503  faces_vec[iface][3] = ixyz - GetNumRZCorner() + 2;
504  }
505  }
506  else if (iSide == numSide - 1) // endPhi
507  {
508  if (iCorner < GetNumRZCorner() - 1)
509  {
510  faces_vec[iface][0] = ixyz + 1;
511  faces_vec[iface][1] = ixyz + GetNumRZCorner() + 1;
512  faces_vec[iface][2] = ixyz + GetNumRZCorner() + 2;
513  faces_vec[iface][3] = -(ixyz + 2);
514  }
515  else
516  {
517  faces_vec[iface][0] = ixyz + 1;
518  faces_vec[iface][1] = ixyz + GetNumRZCorner() + 1;
519  faces_vec[iface][2] = ixyz + 2;
520  faces_vec[iface][3] = -(ixyz - GetNumRZCorner() + 2);
521  }
522  }
523  else
524  {
525  if (iCorner < GetNumRZCorner() - 1)
526  {
527  faces_vec[iface][0] = ixyz + 1;
528  faces_vec[iface][1] = -(ixyz + GetNumRZCorner() + 1);
529  faces_vec[iface][2] = ixyz + GetNumRZCorner() + 2;
530  faces_vec[iface][3] = -(ixyz + 2);
531  }
532  else
533  {
534  faces_vec[iface][0] = ixyz + 1;
535  faces_vec[iface][1] = -(ixyz + GetNumRZCorner() + 1);
536  faces_vec[iface][2] = ixyz + 2;
537  faces_vec[iface][3] = -(ixyz - GetNumRZCorner() + 2);
538  }
539  }
540  ++iface;
541  ++ixyz;
542  }
543  phi += dPhi;
544  }
545 
546  // Last corners...
547 
548  for (G4int iCorner = 0; iCorner < GetNumRZCorner(); ++iCorner)
549  {
550  xyz[ixyz][0] = GetCorner(iCorner).r * std::cos(phi);
551  xyz[ixyz][1] = GetCorner(iCorner).r * std::sin(phi);
552  xyz[ixyz][2] = GetCorner(iCorner).z;
553  ++ixyz;
554  }
555  }
556  else // !phiIsOpen - i.e., a complete 360 degrees.
557  {
558  nNodes = numSide * GetNumRZCorner();
559  nFaces = numSide * GetNumRZCorner();;
560  xyz = new double3[nNodes];
561  faces_vec = new int4[nFaces];
562  const G4double dPhi = (GetEndPhi() - GetStartPhi()) / numSide;
563  G4double phi = GetStartPhi();
564  G4int ixyz = 0, iface = 0;
565  for (G4int iSide = 0; iSide < numSide; ++iSide)
566  {
567  for (G4int iCorner = 0; iCorner < GetNumRZCorner(); ++iCorner)
568  {
569  xyz[ixyz][0] = GetCorner(iCorner).r * std::cos(phi);
570  xyz[ixyz][1] = GetCorner(iCorner).r * std::sin(phi);
571  xyz[ixyz][2] = GetCorner(iCorner).z;
572 
573  if (iSide < numSide - 1)
574  {
575  if (iCorner < GetNumRZCorner() - 1)
576  {
577  faces_vec[iface][0] = ixyz + 1;
578  faces_vec[iface][1] = -(ixyz + GetNumRZCorner() + 1);
579  faces_vec[iface][2] = ixyz + GetNumRZCorner() + 2;
580  faces_vec[iface][3] = -(ixyz + 2);
581  }
582  else
583  {
584  faces_vec[iface][0] = ixyz + 1;
585  faces_vec[iface][1] = -(ixyz + GetNumRZCorner() + 1);
586  faces_vec[iface][2] = ixyz + 2;
587  faces_vec[iface][3] = -(ixyz - GetNumRZCorner() + 2);
588  }
589  }
590  else // Last side joins ends...
591  {
592  if (iCorner < GetNumRZCorner() - 1)
593  {
594  faces_vec[iface][0] = ixyz + 1;
595  faces_vec[iface][1] = -(ixyz + GetNumRZCorner() - nFaces + 1);
596  faces_vec[iface][2] = ixyz + GetNumRZCorner() - nFaces + 2;
597  faces_vec[iface][3] = -(ixyz + 2);
598  }
599  else
600  {
601  faces_vec[iface][0] = ixyz + 1;
602  faces_vec[iface][1] = -(ixyz - nFaces + GetNumRZCorner() + 1);
603  faces_vec[iface][2] = ixyz - nFaces + 2;
604  faces_vec[iface][3] = -(ixyz - GetNumRZCorner() + 2);
605  }
606  }
607  ++ixyz;
608  ++iface;
609  }
610  phi += dPhi;
611  }
612  }
613  G4Polyhedron* polyhedron = new G4Polyhedron;
614  G4int prob = polyhedron->createPolyhedron(nNodes, nFaces, xyz, faces_vec);
615  delete [] faces_vec;
616  delete [] xyz;
617  if (prob)
618  {
619  std::ostringstream message;
620  message << "Problem creating G4Polyhedron for: " << GetName();
621  G4Exception("G4GenericPolycone::CreatePolyhedron()", "GeomSolids1002",
622  JustWarning, message);
623  delete polyhedron;
624  return 0;
625  }
626  else
627  {
628  return polyhedron;
629  }
630 }
631 
632 #endif // G4GEOM_USE_USOLIDS
633 #endif
void set(double x, double y, double z)
const XML_Char * name
Definition: expat.h:151
static G4bool TriangulatePolygon(const G4TwoVectorList &polygon, G4TwoVectorList &result)
Definition: G4GeomTools.cc:199
G4int createPolyhedron(G4int Nnodes, G4int Nfaces, const G4double xyz[][3], const G4int faces[][4])
G4double GetMaxExtent(const EAxis pAxis) const
std::vector< ExP01TrackerHit * > a
Definition: ExP01Classes.hh:33
static const G4double kInfinity
Definition: geomdefs.hh:42
CLHEP::Hep2Vector G4TwoVector
Definition: G4TwoVector.hh:42
Double_t z
void message(RunManager *runmanager)
Definition: ts_scorers.cc:72
double z() const
static const G4double emax
const G4double kCarTolerance
static G4bool DiskExtent(G4double rmin, G4double rmax, G4double startPhi, G4double delPhi, G4TwoVector &pmin, G4TwoVector &pmax)
Definition: G4GeomTools.cc:396
static const G4double ab
double G4double
Definition: G4Types.hh:76
bool G4bool
Definition: G4Types.hh:79
std::vector< G4ThreeVector > G4ThreeVectorList
G4double GetMinExtent(const EAxis pAxis) const
double x() const
static constexpr double deg
Definition: G4SIunits.hh:152
static constexpr double twopi
Definition: G4SIunits.hh:76
double A(double temperature)
Float_t d
static G4int GetNumberOfRotationSteps()
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.hh:65
int G4int
Definition: G4Types.hh:78
std::vector< G4TwoVector > G4TwoVectorList
Definition: G4GeomTools.hh:50
EAxis
Definition: geomdefs.hh:54
double C(double temp)
double y() const
G4GLOB_DLL std::ostream G4cout
double x() const
double y() const
double B(double temperature)
static G4double PolygonArea(const G4TwoVectorList &polygon)
Definition: G4GeomTools.cc:82