Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions | Protected Member Functions | Protected Attributes
UPolyhedra Class Reference

#include <UPolyhedra.hh>

Inheritance diagram for UPolyhedra:
UVCSGfaceted VUSolid

Public Member Functions

void Init (double phiStart, double phiTotal, int numSide, int numZPlanes, const double zPlane[], const double rInner[], const double rOuter[])
 
 UPolyhedra (const std::string &name, double phiStart, double phiTotal, int numSide, int numZPlanes, const double zPlane[], const double rInner[], const double rOuter[])
 
 UPolyhedra (const std::string &name, double phiStart, double phiTotal, int numSide, int numRZ, const double r[], const double z[])
 
virtual ~UPolyhedra ()
 
void GetParametersList (int, double *) const
 
void ComputeBBox (UBBox *, bool)
 
VUSolid::EnumInside Inside (const UVector3 &p) const
 
double SafetyFromOutside (const UVector3 &aPoint, bool aAccurate=false) const
 
UGeometryType GetEntityType () const
 
VUSolidClone () const
 
UVector3 GetPointOnSurface () const
 
std::ostream & StreamInfo (std::ostream &os) const
 
bool Reset ()
 
int GetNumSide () const
 
double GetStartPhi () const
 
double GetEndPhi () const
 
bool IsOpen () const
 
bool IsGeneric () const
 
int GetNumRZCorner () const
 
UPolyhedraSideRZ GetCorner (const int index) const
 
UPolyhedraHistoricalGetOriginalParameters ()
 
void SetOriginalParameters (UPolyhedraHistorical &pars)
 
double DistanceToIn (const UVector3 &p, const UVector3 &v, double aPstep=UUtils::kInfinity) const
 
 UPolyhedra (const UPolyhedra &source)
 
UPolyhedraoperator= (const UPolyhedra &source)
 
- Public Member Functions inherited from UVCSGfaceted
 UVCSGfaceted (const std::string &name)
 
virtual ~UVCSGfaceted ()
 
 UVCSGfaceted (const UVCSGfaceted &source)
 
UVCSGfacetedoperator= (const UVCSGfaceted &source)
 
VUSolid::EnumInside InsideNoVoxels (const UVector3 &p) const
 
virtual bool Normal (const UVector3 &p, UVector3 &n) const
 
double DistanceToInNoVoxels (const UVector3 &p, const UVector3 &v) const
 
double DistanceTo (const UVector3 &p, const bool outgoing) const
 
double DistanceToOutNoVoxels (const UVector3 &p, const UVector3 &v, UVector3 &n, bool &aConvex) const
 
virtual double DistanceToOut (const UVector3 &p, const UVector3 &v, UVector3 &n, bool &aConvex, double aPstep=UUtils::kInfinity) const
 
virtual double SafetyFromInside (const UVector3 &aPoint, bool aAccurate=false) const
 
virtual double SafetyFromInsideNoVoxels (const UVector3 &aPoint, bool aAccurate=false) const
 
int GetCubVolStatistics () const
 
double GetCubVolEpsilon () const
 
void SetCubVolStatistics (int st)
 
void SetCubVolEpsilon (double ep)
 
int GetAreaStatistics () const
 
double GetAreaAccuracy () const
 
void SetAreaStatistics (int st)
 
void SetAreaAccuracy (double ep)
 
virtual double Capacity ()
 
virtual double SurfaceArea ()
 
- Public Member Functions inherited from VUSolid
 VUSolid ()
 
 VUSolid (const std::string &name)
 
virtual ~VUSolid ()
 
double GetCarTolerance () const
 
double GetRadTolerance () const
 
double GetAngTolerance () const
 
void SetCarTolerance (double eps)
 
void SetRadTolerance (double eps)
 
void SetAngTolerance (double eps)
 
virtual void ExtentAxis (EAxisType aAxis, double &aMin, double &aMax) const
 
const std::string & GetName () const
 
void SetName (const std::string &aName)
 
virtual void SamplePointsInside (int, UVector3 *) const
 
virtual void SamplePointsOnSurface (int, UVector3 *) const
 
virtual void SamplePointsOnEdge (int, UVector3 *) const
 
double EstimateCubicVolume (int nStat, double epsilon) const
 
double EstimateSurfaceArea (int nStat, double ell) const
 

Protected Member Functions

 UPolyhedra (const std::string &name)
 
void SetOriginalParameters ()
 
void Create (double phiStart, double phiTotal, int numSide, UReduciblePolygon *rz)
 
void CopyStuff (const UPolyhedra &source)
 
void DeleteStuff ()
 
UVector3 GetPointOnPlane (UVector3 p0, UVector3 p1, UVector3 p2, UVector3 p3) const
 
UVector3 GetPointOnTriangle (UVector3 p0, UVector3 p1, UVector3 p2) const
 
UVector3 GetPointOnSurfaceCorners () const
 
void Extent (UVector3 &aMin, UVector3 &aMax) const
 
- Protected Member Functions inherited from UVCSGfaceted
double SafetyFromInsideSection (int index, const UVector3 &p, UBits &bits) const
 
int GetSection (double z) const
 
UVector3 GetPointOnSurfaceGeneric () const
 
void CopyStuff (const UVCSGfaceted &source)
 
void DeleteStuff ()
 
void FindCandidates (double z, std::vector< int > &candidates, bool sides=false)
 
void InitVoxels (UReduciblePolygon &z, double radius)
 

Protected Attributes

int fNumSides
 
double fStartPhi
 
double fEndPhi
 
bool fPhiIsOpen
 
bool fGenericPgon
 
int fNumCorner
 
UPolyhedraSideRZfCorners
 
UPolyhedraHistorical fOriginalParameters
 
UEnclosingCylinderfEnclosingCylinder
 
- Protected Attributes inherited from UVCSGfaceted
int numFace
 
UVCSGface ** faces
 
double fCubicVolume
 
double fSurfaceArea
 
std::vector< double > fZs
 
std::vector< std::vector< int > > fCandidates
 
int fMaxSection
 
UBox fBox
 
double fBoxShift
 
bool fNoVoxels
 

Additional Inherited Members

- Public Types inherited from VUSolid
enum  EnumInside { eInside =0, eSurface =1, eOutside =2 }
 
enum  EAxisType { eXaxis =0, eYaxis =1, eZaxis =2 }
 
- Static Public Member Functions inherited from VUSolid
static double Tolerance ()
 
- Static Protected Attributes inherited from VUSolid
static double fgTolerance = 1.0E-9
 
static double frTolerance = 1.0E-9
 
static double faTolerance = 1.0E-9
 

Detailed Description

Definition at line 64 of file UPolyhedra.hh.

Constructor & Destructor Documentation

UPolyhedra::UPolyhedra ( const std::string &  name)
inlineprotected

Definition at line 68 of file UPolyhedra.hh.

Referenced by Clone().

68 : UVCSGfaceted(name) {}
const XML_Char * name
UVCSGfaceted(const std::string &name)
Definition: UVCSGfaceted.cc:31
UPolyhedra::UPolyhedra ( const std::string &  name,
double  phiStart,
double  phiTotal,
int  numSide,
int  numZPlanes,
const double  zPlane[],
const double  rInner[],
const double  rOuter[] 
)

Definition at line 49 of file UPolyhedra.cc.

References Init().

58 {
59  Init(phiStart, thePhiTotal, thefNumSide, numZPlanes, zPlane, rInner, rOuter);
60 }
const XML_Char * name
void Init(double phiStart, double phiTotal, int numSide, int numZPlanes, const double zPlane[], const double rInner[], const double rOuter[])
Definition: UPolyhedra.cc:67
UVCSGfaceted(const std::string &name)
Definition: UVCSGfaceted.cc:31
UPolyhedra::UPolyhedra ( const std::string &  name,
double  phiStart,
double  phiTotal,
int  numSide,
int  numRZ,
const double  r[],
const double  z[] 
)

Definition at line 156 of file UPolyhedra.cc.

References Create(), and SetOriginalParameters().

163  : UVCSGfaceted(name), fGenericPgon(true)
164 {
165  UReduciblePolygon* rz = new UReduciblePolygon(r, z, numRZ);
166 
167  Create(phiStart, phiTotal, thefNumSide, rz);
168 
169  // Set fOriginalParameters struct for consistency
170  //
172 
173  delete rz;
174 }
G4double z
Definition: TRTMaterials.hh:39
const XML_Char * name
void SetOriginalParameters()
void Create(double phiStart, double phiTotal, int numSide, UReduciblePolygon *rz)
Definition: UPolyhedra.cc:183
UVCSGfaceted(const std::string &name)
Definition: UVCSGfaceted.cc:31
bool fGenericPgon
Definition: UPolyhedra.hh:184
UPolyhedra::~UPolyhedra ( )
virtual

Definition at line 382 of file UPolyhedra.cc.

References fCorners, and fEnclosingCylinder.

383 {
384  delete [] fCorners;
385 // if (fOriginalParameters) delete fOriginalParameters;
386 
387  delete fEnclosingCylinder;
388 }
UEnclosingCylinder * fEnclosingCylinder
Definition: UPolyhedra.hh:188
UPolyhedraSideRZ * fCorners
Definition: UPolyhedra.hh:186
UPolyhedra::UPolyhedra ( const UPolyhedra source)

Definition at line 394 of file UPolyhedra.cc.

References CopyStuff().

395  : UVCSGfaceted(source)
396 {
397  CopyStuff(source);
398 }
void CopyStuff(const UPolyhedra &source)
Definition: UPolyhedra.cc:424
UVCSGfaceted(const std::string &name)
Definition: UVCSGfaceted.cc:31

Member Function Documentation

VUSolid * UPolyhedra::Clone ( ) const
virtual

Implements VUSolid.

Definition at line 541 of file UPolyhedra.cc.

References UPolyhedra().

542 {
543  return new UPolyhedra(*this);
544 }
UPolyhedra(const std::string &name)
Definition: UPolyhedra.hh:68
void UPolyhedra::ComputeBBox ( UBBox ,
bool   
)
inlinevirtual

Implements VUSolid.

Definition at line 104 of file UPolyhedra.hh.

105  {
106  // Computes bounding box.
107  std::cout << "ComputeBBox - Not implemented" << std::endl;
108  }
void UPolyhedra::CopyStuff ( const UPolyhedra source)
protected

Definition at line 424 of file UPolyhedra.cc.

References fCorners, fEnclosingCylinder, fEndPhi, fGenericPgon, fNumCorner, fNumSides, fOriginalParameters, fPhiIsOpen, and fStartPhi.

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

425 {
426  //
427  // Simple stuff
428  //
429  fNumSides = source.fNumSides;
430  fStartPhi = source.fStartPhi;
431  fEndPhi = source.fEndPhi;
432  fPhiIsOpen = source.fPhiIsOpen;
433  fNumCorner = source.fNumCorner;
434  fGenericPgon = source.fGenericPgon;
435 
436  //
437  // The corner array
438  //
440 
441  UPolyhedraSideRZ* corn = fCorners,
442  *sourceCorn = source.fCorners;
443  do
444  {
445  *corn = *sourceCorn;
446  }
447  while (++sourceCorn, ++corn < fCorners + fNumCorner);
448 
450 
451  //
452  // Enclosing cylinder
453  //
455 }
double fEndPhi
Definition: UPolyhedra.hh:182
int fNumCorner
Definition: UPolyhedra.hh:185
bool fPhiIsOpen
Definition: UPolyhedra.hh:183
double fStartPhi
Definition: UPolyhedra.hh:181
UEnclosingCylinder * fEnclosingCylinder
Definition: UPolyhedra.hh:188
UPolyhedraSideRZ * fCorners
Definition: UPolyhedra.hh:186
UPolyhedraHistorical fOriginalParameters
Definition: UPolyhedra.hh:187
bool fGenericPgon
Definition: UPolyhedra.hh:184
void UPolyhedra::Create ( double  phiStart,
double  phiTotal,
int  numSide,
UReduciblePolygon rz 
)
protected

Definition at line 183 of file UPolyhedra.cc.

References UReduciblePolygon::Amax(), UReduciblePolygon::Amin(), UReduciblePolygon::Area(), UReduciblePolygonIterator::Begin(), UReduciblePolygon::Bmax(), UReduciblePolygon::Bmin(), UReduciblePolygon::CrossesItself(), DBL_EPSILON, UUtils::Exception(), UVCSGfaceted::faces, FatalErrorInArguments, fCorners, fEnclosingCylinder, fEndPhi, UVCSGfaceted::fMaxSection, UVCSGfaceted::fNoVoxels, fNumCorner, fNumSides, fPhiIsOpen, fStartPhi, UReduciblePolygonIterator::GetA(), UReduciblePolygonIterator::GetB(), VUSolid::GetName(), UVCSGfaceted::InitVoxels(), UReduciblePolygonIterator::Next(), UVCSGfaceted::numFace, UReduciblePolygon::NumVertices(), UPolyhedraSideRZ::r, UEnclosingCylinder::radius, UReduciblePolygon::RemoveDuplicateVertices(), UReduciblePolygon::RemoveRedundantVertices(), UReduciblePolygon::ReverseOrder(), VUSolid::Tolerance(), and UPolyhedraSideRZ::z.

Referenced by Init(), Reset(), and UPolyhedra().

187 {
188  //
189  // Perform checks of rz values
190  //
191  if (rz->Amin() < 0.0)
192  {
193  std::ostringstream message;
194  message << "Illegal input parameters - " << GetName() << std::endl
195  << " All R values must be >= 0 !";
196  UUtils::Exception("UPolyhedra::Create()", "GeomSolids0002",
197  FatalErrorInArguments, 1, message.str().c_str());
198  }
199 
200  double rzArea = rz->Area();
201  if (rzArea < -VUSolid::Tolerance())
202  rz->ReverseOrder();
203 
204  else if (rzArea < -VUSolid::Tolerance())
205  {
206  std::ostringstream message;
207  message << "Illegal input parameters - " << GetName() << std::endl
208  << " R/Z Cross section is zero or near zero: " << rzArea;
209  UUtils::Exception("UPolyhedra::Create()", "GeomSolids0002",
210  FatalErrorInArguments, 1, message.str().c_str());
211  }
212 
215  {
216  std::ostringstream message;
217  message << "Illegal input parameters - " << GetName() << std::endl
218  << " Too few unique R/Z values !";
219  UUtils::Exception("UPolyhedra::Create()", "GeomSolids0002",
220  FatalErrorInArguments, 1, message.str().c_str());
221  }
222 
223  if (rz->CrossesItself(1 / UUtils::kInfinity))
224  {
225  std::ostringstream message;
226  message << "Illegal input parameters - " << GetName() << std::endl
227  << " R/Z segments Cross !";
228  UUtils::Exception("UPolyhedra::Create()", "GeomSolids0002",
229  FatalErrorInArguments, 1, message.str().c_str());
230  }
231 
232  fNumCorner = rz->NumVertices();
233 
234  fStartPhi = phiStart;
235  while (fStartPhi < 0) fStartPhi += 2 * UUtils::kPi;
236  //
237  // Phi opening? Account for some possible roundoff, and interpret
238  // nonsense value as representing no phi opening
239  //
240  if ((phiTotal <= 0) || (phiTotal > 2 * UUtils::kPi * (1 - DBL_EPSILON)))
241  {
242  fPhiIsOpen = false;
243  fEndPhi = phiStart + 2 * UUtils::kPi;
244  }
245  else
246  {
247  fPhiIsOpen = true;
248 
249  //
250  // Convert phi into our convention
251  //
252  fEndPhi = phiStart + phiTotal;
253  while (fEndPhi < fStartPhi) fEndPhi += 2 * UUtils::kPi;
254  }
255 
256  //
257  // Save number sides
258  //
259  fNumSides = thefNumSide;
260 
261  //
262  // Allocate corner array.
263  //
265 
266  //
267  // Copy fCorners
268  //
269  UReduciblePolygonIterator iterRZ(rz);
270 
271  UPolyhedraSideRZ* next = fCorners;
272  iterRZ.Begin();
273  do
274  {
275  next->r = iterRZ.GetA();
276  next->z = iterRZ.GetB();
277  }
278  while (++next, iterRZ.Next());
279 
280  //
281  // Allocate face pointer array
282  //
284  faces = new UVCSGface*[numFace];
285 
286  //
287  // Construct side faces
288  //
289  // To do so properly, we need to keep track of four successive RZ
290  // fCorners.
291  //
292  // But! Don't construct a face if both points are at zero radius!
293 
294  //
295  UPolyhedraSideRZ* corner = fCorners,
296  *prev = fCorners + fNumCorner - 1,
297  *nextNext;
298  UVCSGface** face = faces;
299  do
300  {
301  next = corner + 1;
302  if (next >= fCorners + fNumCorner) next = fCorners;
303  nextNext = next + 1;
304  if (nextNext >= fCorners + fNumCorner) nextNext = fCorners;
305 
306  if (corner->r < 1 / UUtils::kInfinity && next->r < 1 / UUtils::kInfinity) continue;
307  /*
308  // We must decide here if we can dare declare one of our faces
309  // as having a "valid" normal (i.e. allBehind = true). This
310  // is never possible if the face faces "inward" in r *unless*
311  // we have only one side
312  //
313  bool allBehind;
314  if ((corner->z > next->z) && (fNumSides > 1))
315  {
316  allBehind = false;
317  }
318  else
319  {
320  //
321  // Otherwise, it is only true if the line passing
322  // through the two points of the segment do not
323  // split the r/z Cross section
324  //
325  allBehind = !rz->BisectedBy( corner->r, corner->z,
326  next->r, next->z, VUSolid::Tolerance() );
327  }
328  */
329  *face++ = new UPolyhedraSide(prev, corner, next, nextNext,
331  }
332  while (prev = corner, corner = next, corner > fCorners);
333 
334  if (fPhiIsOpen)
335  {
336  //
337  // Construct phi open edges
338  //
339  *face++ = new UPolyPhiFace(rz, fStartPhi, phiTotal / fNumSides, fEndPhi);
340  *face++ = new UPolyPhiFace(rz, fEndPhi, phiTotal / fNumSides, fStartPhi);
341  }
342 
343  //
344  // We might have dropped a face or two: recalculate numFace
345  //
346  numFace = face - faces;
347 
348  //
349  // Make fEnclosingCylinder
350  //
351 
352  /*
353  double mxy = rz->Amax();
354  double alfa = UUtils::kPi / fNumSides;
355 
356  double r= rz->Amax();
357 
358  if (fNumSides != 0)
359  {
360  // mxy *= std::sqrt(2.0); // this is old and wrong, works only for n = 4
361  double k = std::tan(alfa) * mxy;
362  double l = mxy / std::cos(alfa);
363  mxy = l;
364  r = l;
365  }
366  mxy += fgTolerance;
367  */
368 
370  new UEnclosingCylinder(rz->Amax(), rz->Bmax(), rz->Bmin(), fPhiIsOpen, phiStart, phiTotal);
371 
373 
374  fNoVoxels = fMaxSection < 2; // minimally, sections with at least numbers 0,1,2 values required, this corresponds to fMaxSection == 2
375 }
double fEndPhi
Definition: UPolyhedra.hh:182
double Amin() const
int fNumCorner
Definition: UPolyhedra.hh:185
bool RemoveRedundantVertices(double tolerance)
bool fPhiIsOpen
Definition: UPolyhedra.hh:183
const std::string & GetName() const
Definition: VUSolid.hh:103
double fStartPhi
Definition: UPolyhedra.hh:181
bool RemoveDuplicateVertices(double tolerance)
static double Tolerance()
Definition: VUSolid.hh:127
void InitVoxels(UReduciblePolygon &z, double radius)
int NumVertices() const
#define DBL_EPSILON
Definition: templates.hh:87
double Bmin() const
UEnclosingCylinder * fEnclosingCylinder
Definition: UPolyhedra.hh:188
UPolyhedraSideRZ * fCorners
Definition: UPolyhedra.hh:186
bool CrossesItself(double tolerance)
double Amax() const
double Bmax() const
UVCSGface ** faces
void Exception(const char *originOfException, const char *exceptionCode, ExceptionSeverity severity, int level, const char *description)
Definition: UUtils.cc:177
void UPolyhedra::DeleteStuff ( )
protected
double UPolyhedra::DistanceToIn ( const UVector3 p,
const UVector3 v,
double  aPstep = UUtils::kInfinity 
) const
virtual

Reimplemented from UVCSGfaceted.

Definition at line 935 of file UPolyhedra.cc.

References UVCSGfaceted::DistanceToIn(), fEnclosingCylinder, UVCSGfaceted::fNoVoxels, and UEnclosingCylinder::ShouldMiss().

937 {
938  //
939  // Quick test
940  //
942  return UUtils::kInfinity;
943 
944  //
945  // Long answer
946  //
947  return UVCSGfaceted::DistanceToIn(p, v, aPstep);
948 }
UEnclosingCylinder * fEnclosingCylinder
Definition: UPolyhedra.hh:188
bool ShouldMiss(const UVector3 &p, const UVector3 &v) const
virtual double DistanceToIn(const UVector3 &p, const UVector3 &v, double aPstep=UUtils::kInfinity) const
void UPolyhedra::Extent ( UVector3 aMin,
UVector3 aMax 
) const
protectedvirtual

Implements VUSolid.

Definition at line 923 of file UPolyhedra.cc.

References UEnclosingCylinder::Extent(), and fEnclosingCylinder.

924 {
925  fEnclosingCylinder->Extent(aMin, aMax);
926 }
UEnclosingCylinder * fEnclosingCylinder
Definition: UPolyhedra.hh:188
void Extent(UVector3 &aMin, UVector3 &aMax) const
UPolyhedraSideRZ UPolyhedra::GetCorner ( const int  index) const
inline

Referenced by G4UPolyhedra::GetCorner().

double UPolyhedra::GetEndPhi ( ) const
inline

Referenced by G4UPolyhedra::GetEndPhi().

UGeometryType UPolyhedra::GetEntityType ( ) const
virtual

Reimplemented from UVCSGfaceted.

Definition at line 532 of file UPolyhedra.cc.

533 {
534  return std::string("Polyhedra");
535 }
int UPolyhedra::GetNumRZCorner ( ) const
inline
int UPolyhedra::GetNumSide ( ) const
inline
UPolyhedraHistorical* UPolyhedra::GetOriginalParameters ( )
inline
void UPolyhedra::GetParametersList ( int  ,
double *   
) const
inlinevirtual

Implements VUSolid.

Definition at line 102 of file UPolyhedra.hh.

102 {}
UVector3 UPolyhedra::GetPointOnPlane ( UVector3  p0,
UVector3  p1,
UVector3  p2,
UVector3  p3 
) const
protected

Definition at line 603 of file UPolyhedra.cc.

References UUtils::Random(), and test::v.

Referenced by GetPointOnSurface().

605 {
606  double lambda1, lambda2, chose, aOne, aTwo;
607  UVector3 t, u, v, w, Area, normal;
608  aOne = 1.;
609  aTwo = 1.;
610 
611  t = p1 - p0;
612  u = p2 - p1;
613  v = p3 - p2;
614  w = p0 - p3;
615 
616  chose = UUtils::Random(0., aOne + aTwo);
617  if ((chose >= 0.) && (chose < aOne))
618  {
619  lambda1 = UUtils::Random(0., 1.);
620  lambda2 = UUtils::Random(0., lambda1);
621  return (p2 + lambda1 * v + lambda2 * w);
622  }
623 
624  lambda1 = UUtils::Random(0., 1.);
625  lambda2 = UUtils::Random(0., lambda1);
626  return (p0 + lambda1 * t + lambda2 * u);
627 }
double Random(double min=0.0, double max=1.0)
Definition: UUtils.cc:69
UVector3 UPolyhedra::GetPointOnSurface ( ) const
virtual

Implements VUSolid.

Definition at line 652 of file UPolyhedra.cc.

References test::a, test::b, fEndPhi, fGenericPgon, fNumSides, UPolyhedraHistorical::fNumZPlanes, fOriginalParameters, fPhiIsOpen, fStartPhi, UPolyhedraHistorical::fZValues, GetPointOnPlane(), UVCSGfaceted::GetPointOnSurfaceGeneric(), UUtils::Random(), UPolyhedraHistorical::Rmax, UPolyhedraHistorical::Rmin, and UUtils::sqr().

653 {
654  if (!fGenericPgon) // Polyhedra by faces
655  {
656  int j, numPlanes = fOriginalParameters.fNumZPlanes, Flag = 0;
657  double chose, totArea = 0., Achose1, Achose2,
658  rad1, rad2, sinphi1, sinphi2, cosphi1, cosphi2;
659  double a, b, l2, rang, totalPhi, ksi,
660  area, aTop = 0., aBottom = 0., zVal = 0.;
661 
662  UVector3 p0, p1, p2, p3;
663  std::vector<double> aVector1;
664  std::vector<double> aVector2;
665  std::vector<double> aVector3;
666 
667  totalPhi = (fPhiIsOpen) ? (fEndPhi - fStartPhi) : 2 * UUtils::kPi;
668  ksi = totalPhi / fNumSides;
669  double cosksi = std::cos(ksi / 2.);
670 
671  // Below we generate the areas relevant to our solid
672  //
673  for (j = 0; j < numPlanes - 1; j++)
674  {
675  a = fOriginalParameters.Rmax[j + 1];
676  b = fOriginalParameters.Rmax[j];
678  - fOriginalParameters.fZValues[j + 1]) + UUtils::sqr(b - a);
679  area = std::sqrt(l2 - UUtils::sqr((a - b) * cosksi)) * (a + b) * cosksi;
680  aVector1.push_back(area);
681  }
682 
683  for (j = 0; j < numPlanes - 1; j++)
684  {
685  a = fOriginalParameters.Rmin[j + 1]; //*cosksi;
686  b = fOriginalParameters.Rmin[j];//*cosksi;
688  - fOriginalParameters.fZValues[j + 1]) + UUtils::sqr(b - a);
689  area = std::sqrt(l2 - UUtils::sqr((a - b) * cosksi)) * (a + b) * cosksi;
690  aVector2.push_back(area);
691  }
692 
693  for (j = 0; j < numPlanes - 1; j++)
694  {
695  if (fPhiIsOpen == true)
696  {
697  aVector3.push_back(0.5 * (fOriginalParameters.Rmax[j]
699  + fOriginalParameters.Rmax[j + 1]
700  - fOriginalParameters.Rmin[j + 1])
701  *std::fabs(fOriginalParameters.fZValues[j + 1]
703  }
704  else
705  {
706  aVector3.push_back(0.);
707  }
708  }
709 
710  for (j = 0; j < numPlanes - 1; j++)
711  {
712  totArea += fNumSides * (aVector1[j] + aVector2[j]) + 2.*aVector3[j];
713  }
714 
715  // Must include top and bottom areas
716  //
717  if (fOriginalParameters.Rmax[numPlanes - 1] != 0.)
718  {
719  a = fOriginalParameters.Rmax[numPlanes - 1];
720  b = fOriginalParameters.Rmin[numPlanes - 1];
721  l2 = UUtils::sqr(a - b);
722  aTop = std::sqrt(l2 - UUtils::sqr((a - b) * cosksi)) * (a + b) * cosksi;
723  }
724 
725  if (fOriginalParameters.Rmax[0] != 0.)
726  {
727  a = fOriginalParameters.Rmax[0];
728  b = fOriginalParameters.Rmin[0];
729  l2 = UUtils::sqr(a - b);
730  aBottom = std::sqrt(l2 - UUtils::sqr((a - b) * cosksi)) * (a + b) * cosksi;
731  }
732 
733  Achose1 = 0.;
734  Achose2 = fNumSides * (aVector1[0] + aVector2[0]) + 2.*aVector3[0];
735 
736  chose = UUtils::Random(0., totArea + aTop + aBottom);
737  if ((chose >= 0.) && (chose < aTop + aBottom))
738  {
739  chose = UUtils::Random(fStartPhi, fStartPhi + totalPhi);
740  rang = std::floor((chose - fStartPhi) / ksi - 0.01);
741  if (rang < 0)
742  {
743  rang = 0;
744  }
745  rang = std::fabs(rang);
746  sinphi1 = std::sin(fStartPhi + rang * ksi);
747  sinphi2 = std::sin(fStartPhi + (rang + 1) * ksi);
748  cosphi1 = std::cos(fStartPhi + rang * ksi);
749  cosphi2 = std::cos(fStartPhi + (rang + 1) * ksi);
750  chose = UUtils::Random(0., aTop + aBottom);
751  if (chose >= 0. && chose < aTop)
752  {
753  rad1 = fOriginalParameters.Rmin[numPlanes - 1];
754  rad2 = fOriginalParameters.Rmax[numPlanes - 1];
755  zVal = fOriginalParameters.fZValues[numPlanes - 1];
756  }
757  else
758  {
759  rad1 = fOriginalParameters.Rmin[0];
760  rad2 = fOriginalParameters.Rmax[0];
761  zVal = fOriginalParameters.fZValues[0];
762  }
763  p0 = UVector3(rad1 * cosphi1, rad1 * sinphi1, zVal);
764  p1 = UVector3(rad2 * cosphi1, rad2 * sinphi1, zVal);
765  p2 = UVector3(rad2 * cosphi2, rad2 * sinphi2, zVal);
766  p3 = UVector3(rad1 * cosphi2, rad1 * sinphi2, zVal);
767  return GetPointOnPlane(p0, p1, p2, p3);
768  }
769  else
770  {
771  for (j = 0; j < numPlanes - 1; j++)
772  {
773  if (((chose >= Achose1) && (chose < Achose2)) || (j == numPlanes - 2))
774  {
775  Flag = j;
776  break;
777  }
778  Achose1 += fNumSides * (aVector1[j] + aVector2[j]) + 2.*aVector3[j];
779  Achose2 = Achose1 + fNumSides * (aVector1[j + 1] + aVector2[j + 1])
780  + 2.*aVector3[j + 1];
781  }
782  }
783 
784  // At this point we have chosen a subsection
785  // between to adjacent plane cuts...
786 
787  j = Flag;
788 
789  totArea = fNumSides * (aVector1[j] + aVector2[j]) + 2.*aVector3[j];
790  chose = UUtils::Random(0., totArea);
791 
792  if ((chose >= 0.) && (chose < fNumSides * aVector1[j]))
793  {
794  chose = UUtils::Random(fStartPhi, fStartPhi + totalPhi);
795  rang = std::floor((chose - fStartPhi) / ksi - 0.01);
796  if (rang < 0)
797  {
798  rang = 0;
799  }
800  rang = std::fabs(rang);
801  rad1 = fOriginalParameters.Rmax[j];
802  rad2 = fOriginalParameters.Rmax[j + 1];
803  sinphi1 = std::sin(fStartPhi + rang * ksi);
804  sinphi2 = std::sin(fStartPhi + (rang + 1) * ksi);
805  cosphi1 = std::cos(fStartPhi + rang * ksi);
806  cosphi2 = std::cos(fStartPhi + (rang + 1) * ksi);
807  zVal = fOriginalParameters.fZValues[j];
808 
809  p0 = UVector3(rad1 * cosphi1, rad1 * sinphi1, zVal);
810  p1 = UVector3(rad1 * cosphi2, rad1 * sinphi2, zVal);
811 
812  zVal = fOriginalParameters.fZValues[j + 1];
813 
814  p2 = UVector3(rad2 * cosphi2, rad2 * sinphi2, zVal);
815  p3 = UVector3(rad2 * cosphi1, rad2 * sinphi1, zVal);
816  return GetPointOnPlane(p0, p1, p2, p3);
817  }
818  else if ((chose >= fNumSides * aVector1[j])
819  && (chose <= fNumSides * (aVector1[j] + aVector2[j])))
820  {
821  chose = UUtils::Random(fStartPhi, fStartPhi + totalPhi);
822  rang = std::floor((chose - fStartPhi) / ksi - 0.01);
823  if (rang < 0)
824  {
825  rang = 0;
826  }
827  rang = std::fabs(rang);
828  rad1 = fOriginalParameters.Rmin[j];
829  rad2 = fOriginalParameters.Rmin[j + 1];
830  sinphi1 = std::sin(fStartPhi + rang * ksi);
831  sinphi2 = std::sin(fStartPhi + (rang + 1) * ksi);
832  cosphi1 = std::cos(fStartPhi + rang * ksi);
833  cosphi2 = std::cos(fStartPhi + (rang + 1) * ksi);
834  zVal = fOriginalParameters.fZValues[j];
835 
836  p0 = UVector3(rad1 * cosphi1, rad1 * sinphi1, zVal);
837  p1 = UVector3(rad1 * cosphi2, rad1 * sinphi2, zVal);
838 
839  zVal = fOriginalParameters.fZValues[j + 1];
840 
841  p2 = UVector3(rad2 * cosphi2, rad2 * sinphi2, zVal);
842  p3 = UVector3(rad2 * cosphi1, rad2 * sinphi1, zVal);
843  return GetPointOnPlane(p0, p1, p2, p3);
844  }
845 
846  chose = UUtils::Random(0., 2.2);
847  if ((chose >= 0.) && (chose < 1.))
848  {
849  rang = fStartPhi;
850  }
851  else
852  {
853  rang = fEndPhi;
854  }
855 
856  cosphi1 = std::cos(rang);
857  rad1 = fOriginalParameters.Rmin[j];
858  sinphi1 = std::sin(rang);
859  rad2 = fOriginalParameters.Rmax[j];
860 
861  p0 = UVector3(rad1 * cosphi1, rad1 * sinphi1,
863  p1 = UVector3(rad2 * cosphi1, rad2 * sinphi1,
865 
866  rad1 = fOriginalParameters.Rmax[j + 1];
867  rad2 = fOriginalParameters.Rmin[j + 1];
868 
869  p2 = UVector3(rad1 * cosphi1, rad1 * sinphi1,
871  p3 = UVector3(rad2 * cosphi1, rad2 * sinphi1,
873  return GetPointOnPlane(p0, p1, p2, p3);
874  }
875  else // Generic polyhedra
876  {
877  return GetPointOnSurfaceGeneric();
878  }
879 }
double fEndPhi
Definition: UPolyhedra.hh:182
bool fPhiIsOpen
Definition: UPolyhedra.hh:183
UVector3 GetPointOnPlane(UVector3 p0, UVector3 p1, UVector3 p2, UVector3 p3) const
Definition: UPolyhedra.cc:603
double fStartPhi
Definition: UPolyhedra.hh:181
std::vector< double > fZValues
Definition: UPolyhedra.hh:59
std::vector< double > Rmin
Definition: UPolyhedra.hh:60
T sqr(const T &x)
Definition: UUtils.hh:142
std::vector< double > Rmax
Definition: UPolyhedra.hh:61
UPolyhedraHistorical fOriginalParameters
Definition: UPolyhedra.hh:187
UVector3 GetPointOnSurfaceGeneric() const
double Random(double min=0.0, double max=1.0)
Definition: UUtils.cc:69
bool fGenericPgon
Definition: UPolyhedra.hh:184
UVector3 UPolyhedra::GetPointOnSurfaceCorners ( ) const
protected
UVector3 UPolyhedra::GetPointOnTriangle ( UVector3  p0,
UVector3  p1,
UVector3  p2 
) const
protected

Definition at line 635 of file UPolyhedra.cc.

References UUtils::Random(), and test::v.

638 {
639  double lambda1, lambda2;
640  UVector3 v = p3 - p1, w = p1 - p2;
641 
642  lambda1 = UUtils::Random(0., 1.);
643  lambda2 = UUtils::Random(0., lambda1);
644 
645  return (p2 + lambda1 * w + lambda2 * v);
646 }
double Random(double min=0.0, double max=1.0)
Definition: UUtils.cc:69
double UPolyhedra::GetStartPhi ( ) const
inline
void UPolyhedra::Init ( double  phiStart,
double  phiTotal,
int  numSide,
int  numZPlanes,
const double  zPlane[],
const double  rInner[],
const double  rOuter[] 
)

Definition at line 67 of file UPolyhedra.cc.

References Create(), DBL_EPSILON, UUtils::Exception(), FatalErrorInArguments, fGenericPgon, UPolyhedraHistorical::fNumSide, UPolyhedraHistorical::fNumZPlanes, UPolyhedraHistorical::fOpeningAngle, fOriginalParameters, UPolyhedraHistorical::fStartAngle, UPolyhedraHistorical::fZValues, VUSolid::GetName(), UPolyhedraHistorical::Rmax, UPolyhedraHistorical::Rmin, and UReduciblePolygon::ScaleA().

Referenced by UPolyhedra().

75 {
76  fGenericPgon = false;
77 
78  if (thefNumSide <= 0)
79  {
80  std::ostringstream message;
81  message << "Solid must have at least one side - " << GetName() << std::endl
82  << " No sides specified !";
83  UUtils::Exception("UPolyhedra::UPolyhedra()", "GeomSolids0002",
84  FatalErrorInArguments, 1, message.str().c_str());
85  }
86 
87  //
88  // Calculate conversion factor from G3 radius to U radius
89  //
90  double phiTotal = thePhiTotal;
91  if ((phiTotal <= 0) || (phiTotal >= 2 * UUtils::kPi * (1 - DBL_EPSILON)))
92  {
93  phiTotal = 2 * UUtils::kPi;
94  }
95  double convertRad = std::cos(0.5 * phiTotal / thefNumSide);
96 
97  //
98  // Some historical stuff
99  //
100 // fOriginalParameters = new UPolyhedraHistorical;
101 
102  fOriginalParameters.fNumSide = thefNumSide;
103  fOriginalParameters.fStartAngle = phiStart;
105  fOriginalParameters.fNumZPlanes = numZPlanes;
106  fOriginalParameters.fZValues.resize(numZPlanes);
107  fOriginalParameters.Rmin.resize(numZPlanes);
108  fOriginalParameters.Rmax.resize(numZPlanes);
109 
110  int i;
111  for (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 
119  std::ostringstream message;
120  message << "Cannot create a Polyhedra with no contiguous segments."
121  << std::endl
122  << " Segments are not contiguous !" << std::endl
123  << " rMin[" << i << "] = " << rInner[i]
124  << " -- rMax[" << i + 1 << "] = " << rOuter[i + 1] << std::endl
125  << " rMin[" << i + 1 << "] = " << rInner[i + 1]
126  << " -- rMax[" << i << "] = " << rOuter[i];
127  UUtils::Exception("UPolyhedra::UPolyhedra()", "GeomSolids0002",
128  FatalErrorInArguments, 1, message.str().c_str());
129  }
130  }
131  fOriginalParameters.fZValues[i] = zPlane[i];
132  fOriginalParameters.Rmin[i] = rInner[i] / convertRad;
133  fOriginalParameters.Rmax[i] = rOuter[i] / convertRad;
134  }
135 
136 
137  //
138  // Build RZ polygon using special PCON/PGON GEANT3 constructor
139  //
140  UReduciblePolygon* rz =
141  new UReduciblePolygon(rInner, rOuter, zPlane, numZPlanes);
142  rz->ScaleA(1 / convertRad);
143 
144  //
145  // Do the real work
146  //
147  Create(phiStart, phiTotal, thefNumSide, rz);
148 
149  delete rz;
150 }
const std::string & GetName() const
Definition: VUSolid.hh:103
std::vector< double > fZValues
Definition: UPolyhedra.hh:59
void ScaleA(double scale)
#define DBL_EPSILON
Definition: templates.hh:87
std::vector< double > Rmin
Definition: UPolyhedra.hh:60
void Create(double phiStart, double phiTotal, int numSide, UReduciblePolygon *rz)
Definition: UPolyhedra.cc:183
std::vector< double > Rmax
Definition: UPolyhedra.hh:61
UPolyhedraHistorical fOriginalParameters
Definition: UPolyhedra.hh:187
void Exception(const char *originOfException, const char *exceptionCode, ExceptionSeverity severity, int level, const char *description)
Definition: UUtils.cc:177
bool fGenericPgon
Definition: UPolyhedra.hh:184
VUSolid::EnumInside UPolyhedra::Inside ( const UVector3 p) const
virtual

Reimplemented from UVCSGfaceted.

Definition at line 506 of file UPolyhedra.cc.

References VUSolid::eOutside, fEnclosingCylinder, UVCSGfaceted::Inside(), and UEnclosingCylinder::MustBeOutside().

507 {
508  //
509  // Quick test
510  //
511  if (fEnclosingCylinder->MustBeOutside(p)) return eOutside;
512 
513  //
514  // Long answer
515  //
516  return UVCSGfaceted::Inside(p);
517 }
bool MustBeOutside(const UVector3 &p) const
UEnclosingCylinder * fEnclosingCylinder
Definition: UPolyhedra.hh:188
virtual VUSolid::EnumInside Inside(const UVector3 &p) const
bool UPolyhedra::IsGeneric ( ) const
inline

Referenced by G4UPolyhedra::IsGeneric().

bool UPolyhedra::IsOpen ( ) const
inline

Referenced by G4UPolyhedra::IsOpen().

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

Definition at line 404 of file UPolyhedra.cc.

References CopyStuff(), fCorners, fEnclosingCylinder, and UVCSGfaceted::operator=().

405 {
406  if (this == &source) return *this;
407 
408  UVCSGfaceted::operator=(source);
409 
410  delete [] fCorners;
411 // if (fOriginalParameters) delete fOriginalParameters;
412 
413  delete fEnclosingCylinder;
414 
415  CopyStuff(source);
416 
417  return *this;
418 }
void CopyStuff(const UPolyhedra &source)
Definition: UPolyhedra.cc:424
UVCSGfaceted & operator=(const UVCSGfaceted &source)
Definition: UVCSGfaceted.cc:63
UEnclosingCylinder * fEnclosingCylinder
Definition: UPolyhedra.hh:188
UPolyhedraSideRZ * fCorners
Definition: UPolyhedra.hh:186
bool UPolyhedra::Reset ( )

Definition at line 464 of file UPolyhedra.cc.

References Create(), UVCSGfaceted::DeleteStuff(), UUtils::Exception(), fCorners, fEnclosingCylinder, fGenericPgon, UPolyhedraHistorical::fNumSide, UPolyhedraHistorical::fNumZPlanes, UPolyhedraHistorical::fOpeningAngle, fOriginalParameters, UPolyhedraHistorical::fStartAngle, UPolyhedraHistorical::fZValues, VUSolid::GetName(), UPolyhedraHistorical::Rmax, UPolyhedraHistorical::Rmin, and Warning.

Referenced by G4UPolyhedra::Reset().

465 {
466  if (fGenericPgon)
467  {
468  std::ostringstream message;
469  message << "Solid " << GetName() << " built using generic construct."
470  << std::endl << "Not applicable to the generic construct !";
471  UUtils::Exception("UPolyhedra::Reset(,,)", "GeomSolids1001",
472  Warning, 1, message.str().c_str());
473  return 1;
474  }
475 
476  //
477  // Clear old setup
478  //
480  delete [] fCorners;
481  delete fEnclosingCylinder;
482 
483  //
484  // Rebuild polyhedra
485  //
486  UReduciblePolygon* rz =
494  delete rz;
495 
496  return 0;
497 }
const std::string & GetName() const
Definition: VUSolid.hh:103
std::vector< double > fZValues
Definition: UPolyhedra.hh:59
void DeleteStuff()
std::vector< double > Rmin
Definition: UPolyhedra.hh:60
UEnclosingCylinder * fEnclosingCylinder
Definition: UPolyhedra.hh:188
UPolyhedraSideRZ * fCorners
Definition: UPolyhedra.hh:186
void Create(double phiStart, double phiTotal, int numSide, UReduciblePolygon *rz)
Definition: UPolyhedra.cc:183
std::vector< double > Rmax
Definition: UPolyhedra.hh:61
UPolyhedraHistorical fOriginalParameters
Definition: UPolyhedra.hh:187
void Exception(const char *originOfException, const char *exceptionCode, ExceptionSeverity severity, int level, const char *description)
Definition: UUtils.cc:177
bool fGenericPgon
Definition: UPolyhedra.hh:184
double UPolyhedra::SafetyFromOutside ( const UVector3 aPoint,
bool  aAccurate = false 
) const
virtual

Reimplemented from UVCSGfaceted.

Definition at line 523 of file UPolyhedra.cc.

References UVCSGfaceted::SafetyFromOutside().

524 {
525  return UVCSGfaceted::SafetyFromOutside(aPoint, aAccurate);
526 }
virtual double SafetyFromOutside(const UVector3 &aPoint, bool aAccurate=false) const
void UPolyhedra::SetOriginalParameters ( UPolyhedraHistorical pars)
inline
void UPolyhedra::SetOriginalParameters ( )
inlineprotected

Referenced by UPolyhedra().

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

Reimplemented from UVCSGfaceted.

Definition at line 550 of file UPolyhedra.cc.

References fCorners, fEndPhi, fGenericPgon, fNumCorner, UPolyhedraHistorical::fNumZPlanes, fOriginalParameters, fStartPhi, UPolyhedraHistorical::fZValues, VUSolid::GetName(), UPolyhedraSideRZ::r, UPolyhedraHistorical::Rmax, UPolyhedraHistorical::Rmin, and UPolyhedraSideRZ::z.

551 {
552  int oldprc = os.precision(16);
553  os << "-----------------------------------------------------------\n"
554  << " *** Dump for solid - " << GetName() << " ***\n"
555  << " ===================================================\n"
556  << " Solid type: UPolyhedra\n"
557  << " Parameters: \n"
558  << " starting phi angle : " << fStartPhi / (UUtils::kPi / 180.0) << " degrees \n"
559  << " ending phi angle : " << fEndPhi / (UUtils::kPi / 180.0) << " degrees \n";
560  int i = 0;
561  if (!fGenericPgon)
562  {
563  int numPlanes = fOriginalParameters.fNumZPlanes;
564  os << " number of Z planes: " << numPlanes << "\n"
565  << " Z values: \n";
566  for (i = 0; i < numPlanes; i++)
567  {
568  os << " Z plane " << i << ": "
569  << fOriginalParameters.fZValues[i] << "\n";
570  }
571  os << " Tangent distances to inner surface (Rmin): \n";
572  for (i = 0; i < numPlanes; i++)
573  {
574  os << " Z plane " << i << ": "
575  << fOriginalParameters.Rmin[i] << "\n";
576  }
577  os << " Tangent distances to outer surface (Rmax): \n";
578  for (i = 0; i < numPlanes; i++)
579  {
580  os << " Z plane " << i << ": "
581  << fOriginalParameters.Rmax[i] << "\n";
582  }
583  }
584  os << " number of RZ points: " << fNumCorner << "\n"
585  << " RZ values (fCorners): \n";
586  for (i = 0; i < fNumCorner; i++)
587  {
588  os << " "
589  << fCorners[i].r << ", " << fCorners[i].z << "\n";
590  }
591  os << "-----------------------------------------------------------\n";
592  os.precision(oldprc);
593 
594  return os;
595 }
double fEndPhi
Definition: UPolyhedra.hh:182
int fNumCorner
Definition: UPolyhedra.hh:185
const std::string & GetName() const
Definition: VUSolid.hh:103
double fStartPhi
Definition: UPolyhedra.hh:181
std::vector< double > fZValues
Definition: UPolyhedra.hh:59
std::vector< double > Rmin
Definition: UPolyhedra.hh:60
UPolyhedraSideRZ * fCorners
Definition: UPolyhedra.hh:186
std::vector< double > Rmax
Definition: UPolyhedra.hh:61
UPolyhedraHistorical fOriginalParameters
Definition: UPolyhedra.hh:187
bool fGenericPgon
Definition: UPolyhedra.hh:184

Field Documentation

UPolyhedraSideRZ* UPolyhedra::fCorners
protected

Definition at line 186 of file UPolyhedra.hh.

Referenced by CopyStuff(), Create(), operator=(), Reset(), StreamInfo(), and ~UPolyhedra().

UEnclosingCylinder* UPolyhedra::fEnclosingCylinder
protected

Definition at line 188 of file UPolyhedra.hh.

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

double UPolyhedra::fEndPhi
protected

Definition at line 182 of file UPolyhedra.hh.

Referenced by CopyStuff(), Create(), GetPointOnSurface(), and StreamInfo().

bool UPolyhedra::fGenericPgon
protected

Definition at line 184 of file UPolyhedra.hh.

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

int UPolyhedra::fNumCorner
protected

Definition at line 185 of file UPolyhedra.hh.

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

int UPolyhedra::fNumSides
protected

Definition at line 180 of file UPolyhedra.hh.

Referenced by CopyStuff(), Create(), and GetPointOnSurface().

UPolyhedraHistorical UPolyhedra::fOriginalParameters
protected

Definition at line 187 of file UPolyhedra.hh.

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

bool UPolyhedra::fPhiIsOpen
protected

Definition at line 183 of file UPolyhedra.hh.

Referenced by CopyStuff(), Create(), and GetPointOnSurface().

double UPolyhedra::fStartPhi
protected

Definition at line 181 of file UPolyhedra.hh.

Referenced by CopyStuff(), Create(), GetPointOnSurface(), and StreamInfo().


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