Files
geant4/source/geometry/solids/usolids/include/UGenericPolycone.hh
T
2016-06-10 11:51:14 +02:00

148 lines
4.6 KiB
C++

//
// ********************************************************************
// * This Software is part of the AIDA Unified Solids Library package *
// * See: https://aidasoft.web.cern.ch/USolids *
// ********************************************************************
//
// $Id:$
//
// --------------------------------------------------------------------
//
// UGenericPolycone
//
// Class description:
//
// Implementing a CSG-like type "PCON" volume with possibility of
// specifying also 'decreasing' Z sections:
//
// UGenericPolycone( const std::string& name,
// double phiStart, // initial phi starting angle
// double phiTotal, // total phi angle
// int numRZ, // number corners in r,z space
// const double r[], // r coordinate of these corners
// const double z[]) // z coordinate of these corners
//
// 19.10.13 Tatiana Nikitina
// Created from original implementation in Geant4
// --------------------------------------------------------------------
#ifndef UGenericPolycone_hh
#define UGenericPolycone_hh
#include "UVCSGfaceted.hh"
#include "UPolyconeSide.hh"
class UEnclosingCylinder;
class UReduciblePolygon;
class UVCSGface;
class UGenericPolycone: public UVCSGfaceted
{
public: // with description
UGenericPolycone(const std::string& name,
double phiStart, // initial phi starting angle
double phiTotal, // total phi angle
int numZPlanes, // number of z planes
const double zPlane[], // position of z planes
const double rInner[], // tangent distance to inner surface
const double rOuter[]); // tangent distance to outer surface
UGenericPolycone(const std::string& name,
double phiStart, // initial phi starting angle
double phiTotal, // total phi angle
int numRZ, // number corners in r,z space
const double r[], // r coordinate of these corners
const double z[]); // z coordinate of these corners
virtual ~UGenericPolycone();
// Methods for solid
VUSolid::EnumInside Inside(const UVector3& p) const;
double DistanceToIn(const UVector3& p, const UVector3& v, double aPstep = UUtils::kInfinity) const;
// double SafetyFromOutside( const UVector3 &p, bool aAccurate=false) const;
UVector3 GetPointOnSurface() const;
/*
void ComputeDimensions( UVPVParameterisation* p,
const int n,
const UVPhysicalVolume* pRep );
*/
UGeometryType GetEntityType() const;
VUSolid* Clone() const;
std::ostream& StreamInfo(std::ostream& os) const;
bool Reset();
// Accessors
inline double GetStartPhi() const;
inline double GetEndPhi() const;
inline bool IsOpen() const;
inline int GetNumRZCorner() const;
inline UPolyconeSideRZ GetCorner(int index) const;
public: // without description
//UPolycone(__void__&);
// Fake default constructor for usage restricted to direct object
// persistency for clients requiring preallocation of memory for
// persistifiable objects.
UGenericPolycone(const UGenericPolycone& source);
UGenericPolycone& operator=(const UGenericPolycone& source);
// Copy constructor and assignment operator.
protected: // without description
// Generic initializer, called by all constructors
void Create(double phiStart, // initial phi starting angle
double phiTotal, // total phi angle
UReduciblePolygon* rz); // r/z coordinate of these corners
void CopyStuff(const UGenericPolycone& source);
// Methods for random point generation
void GetParametersList(int /*aNumber*/, double* /*aArray*/) const {}
void ComputeBBox(UBBox* /*aBox*/, bool /*aStore*/)
{
// Computes bounding box.
std::cout << "ComputeBBox - Not implemented" << std::endl;
}
void Extent(UVector3& aMin, UVector3& aMax) const;
protected: // without description
// Here are our parameters
double startPhi; // Starting phi value (0 < phiStart < 2pi)
double endPhi; // end phi value (0 < endPhi-phiStart < 2pi)
bool phiIsOpen; // true if there is a phi segment
int numCorner; // number RZ points
UPolyconeSideRZ* corners; // corner r,z points
// Our quick test
UEnclosingCylinder* enclosingCylinder;
};
#include "UGenericPolycone.icc"
#endif