83 :
G4VSolid(pname), fRebuildPolyhedron(false), fpPolyhedron(0),
84 fLowerEndcap(0), fUpperEndcap(0), fSide0(0),
85 fSide90(0), fSide180(0), fSide270(0),
108 fDx = ( fDxUp > fDxDown ? fDxUp : fDxDown ) ;
118 std::ostringstream message;
119 message <<
"Not planar surface in untwisted Trapezoid: " 121 <<
"fDy2 is " <<
fDy2 <<
" but should be " 123 G4Exception(
"G4VTwistedFaceted::G4VTwistedFaceted()",
"GeomSolids0002",
138 std::ostringstream message;
139 message <<
"Not planar surface in untwisted Trapezoid: " 141 <<
"One endcap is rectangular, the other is a trapezoid." <<
G4endl 142 <<
"For planarity reasons they have to be rectangles or trapezoids " 144 G4Exception(
"G4VTwistedFaceted::G4VTwistedFaceted()",
"GeomSolids0002",
175 && ( std::fabs(
fPhiTwist) > 2*kAngTolerance )
178 && ( fTheta < pi/2 && fTheta >= 0 ) )
181 std::ostringstream message;
182 message <<
"Invalid dimensions. Too small, or twist angle too big: " 257 if (
this == &rhs) {
return *
this; }
292 G4Exception(
"G4VTwistedFaceted::ComputeDimensions()",
294 "G4VTwistedFaceted does not support Parameterisation.");
320 xMin = xoffset - maxRad ;
321 xMax = xoffset + maxRad ;
340 yMin = yoffset - maxRad ;
341 yMax = yoffset + maxRad ;
360 zMin = zoffset -
fDz ;
361 zMax = zoffset +
fDz ;
403 G4bool existsAfterClip = false ;
416 if (pVoxelLimit.
IsLimited(pAxis) ==
false)
420 existsAfterClip = true ;
437 existsAfterClip = true ;
473 existsAfterClip = true ;
479 return existsAfterClip;
493 vertices->reserve(8);
518 G4Exception(
"G4VTwistedFaceted::CreateRotatedVertices()",
520 "Error in allocation of vertices. Out of memory !");
538 tmpp->
set(p.
x(), p.
y(), p.
z());
551 G4double posx = px * cphi - py * sphi ;
552 G4double posy = px * sphi + py * cphi ;
642 tmpp->
set(p.
x(), p.
y(), p.
z());
662 if (tmpdistance < distance)
664 distance = tmpdistance;
670 tmpsurface[0] = surfaces[besti];
671 *tmpnormal = tmpsurface[0]->
GetNormal(bestxx,
true);
705 tmpp->
set(p.
x(), p.
y(), p.
z());
706 tmpv->
set(v.
x(), v.
y(), v.
z());
751 for (i=0; i < 6 ; i++)
758 G4cout <<
"Solid DistanceToIn : distance = " << tmpdistance <<
G4endl ;
761 if (tmpdistance < distance)
763 distance = tmpdistance;
799 tmpp->
set(p.
x(), p.
y(), p.
z());
843 if (tmpdistance < distance)
845 distance = tmpdistance;
855 G4Exception(
"G4VTwistedFaceted::DistanceToIn(p)",
"GeomSolids0003",
896 tmpp->
set(p.
x(), p.
y(), p.
z());
897 tmpv->
set(v.
x(), v.
y(), v.
z());
920 *norm = (blockedsurface->
GetNormal(p,
true));
948 for (i=0; i< 6 ; i++) {
950 if (tmpdistance < distance)
952 distance = tmpdistance;
962 *norm = (surfaces[besti]->
GetNormal(p,
true));
997 tmpp->
set(p.
x(), p.
y(), p.
z());
1007 switch (currentside)
1019 G4cout.precision(oldprc) ;
1020 G4Exception(
"G4VTwistedFaceted::DistanceToOut(p)",
"GeomSolids1002",
1052 for (i=0; i< 6; i++)
1055 if (tmpdistance < distance)
1057 distance = tmpdistance;
1061 *tmpdist = distance;
1069 G4Exception(
"G4VTwistedFaceted::DistanceToOut(p)",
"GeomSolids0003",
1087 G4int oldprc = os.precision(16);
1088 os <<
"-----------------------------------------------------------\n" 1089 <<
" *** Dump for solid - " <<
GetName() <<
" ***\n" 1090 <<
" ===================================================\n" 1091 <<
" Solid type: G4VTwistedFaceted\n" 1092 <<
" Parameters: \n" 1097 <<
" Half length along y (lower endcap) = " <<
fDy1/
cm <<
" cm" 1099 <<
" Half length along x (lower endcap, bottom) = " <<
fDx1/
cm <<
" cm" 1101 <<
" Half length along x (lower endcap, top) = " <<
fDx2/
cm <<
" cm" 1103 <<
" Half length along y (upper endcap) = " <<
fDy2/
cm <<
" cm" 1105 <<
" Half length along x (upper endcap, bottom) = " <<
fDx3/
cm <<
" cm" 1107 <<
" Half length along x (upper endcap, top) = " <<
fDx4/
cm <<
" cm" 1109 <<
"-----------------------------------------------------------\n";
1110 os.precision(oldprc);
1191 return G4String(
"G4VTwistedFaceted");
1226 if ( z ==
fDz ) z -= 0.1*
fDz ;
1227 if ( z == -
fDz ) z += 0.1*
fDz ;
1278 else if( (chose >= a1) && (chose < a1 + a2 ) )
1289 else if( (chose >= a1 + a2 ) && (chose < a1 + a2 + a3 ) )
1299 else if( (chose >= a1 + a2 + a3 ) && (chose < a1 + a2 + a3 + a4 ) )
1309 else if( (chose >= a1 + a2 + a3 + a4 ) && (chose < a1 + a2 + a3 + a4 + a5 ) )
1342 const G4int nnodes = 4*(k-1)*(n-2) + 2*k*k ;
1343 const G4int nfaces = 4*(k-1)*(n-1) + 2*(k-1)*(k-1) ;
1347 typedef G4int G4int4[4];
1348 G4double3* xyz =
new G4double3[nnodes];
1349 G4int4* faces =
new G4int4[nfaces] ;
LastValue fLastDistanceToOut
void set(double x, double y, double z)
ThreeVector shoot(const G4int Ap, const G4int Af)
virtual void ComputeDimensions(G4VPVParameterisation *, const G4int, const G4VPhysicalVolume *)
void ClipBetweenSections(G4ThreeVectorList *pVertices, const G4int pSectionIndex, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
virtual void DescribeYourselfTo(G4VGraphicsScene &scene) const
G4double GetMinXExtent() const
G4VTwistSurface * fSide90
static const G4double kInfinity
G4double GetMinYExtent() const
G4int GetNumberOfRotationStepsAtTimeOfCreation() const
G4VTwistedFaceted(const G4String &pname, G4double PhiTwist, G4double pDz, G4double pTheta, G4double pPhi, G4double pDy1, G4double pDx1, G4double pDx2, G4double pDy2, G4double pDx3, G4double pDx4, G4double pAlph)
G4VTwistSurface * fUpperEndcap
CLHEP::Hep3Vector G4ThreeVector
LastValueWithDoubleVector fLastDistanceToOutWithV
virtual G4ThreeVector GetNormal(const G4ThreeVector &xx, G4bool isGlobal)=0
virtual G4Polyhedron * GetPolyhedron() const
G4bool fRebuildPolyhedron
G4int createPolyhedron(G4int Nnodes, G4int Nfaces, const G4double xyz[][3], const G4int faces[][4])
G4double GetMinZExtent() const
G4bool IsYLimited() const
virtual G4VisExtent GetExtent() const
void ClipCrossSection(G4ThreeVectorList *pVertices, const G4int pSectionIndex, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
G4bool IsXLimited() const
G4VTwistedFaceted & operator=(const G4VTwistedFaceted &rhs)
virtual void AddSolid(const G4Box &)=0
G4double GetMaxZExtent() const
#define G4MUTEX_INITIALIZER
G4VTwistSurface * fSide180
LastValue fLastDistanceToIn
virtual G4double DistanceToIn(const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector &gxxbest)
static double normal(HepRandomEngine *eptr)
G4double GetMaxXExtent() const
virtual G4double GetSurfaceArea()=0
G4VTwistSurface * fSide270
G4bool IsValidNorm() const
G4GLOB_DLL std::ostream G4cout
void SetNeighbours(G4VTwistSurface *axis0min, G4VTwistSurface *axis1min, G4VTwistSurface *axis0max, G4VTwistSurface *axis1max)
virtual G4double DistanceTo(const G4ThreeVector &gp, G4ThreeVector &gxx)
virtual G4double DistanceToOut(const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector &gxxbest)
virtual G4ThreeVector SurfacePoint(G4double, G4double, G4bool isGlobal=false)=0
virtual G4ThreeVector SurfaceNormal(const G4ThreeVector &p) const
virtual ~G4VTwistedFaceted()
static const double twopi
G4VTwistSurface * fLowerEndcap
std::vector< G4ThreeVector > G4ThreeVectorList
G4double GetAngularTolerance() const
G4double Xcoef(G4double u, G4double phi, G4double ftg) const
G4double GetMinExtent(const EAxis pAxis) const
LastValueWithDoubleVector fLastDistanceToInWithV
virtual G4double GetBoundaryMax(G4double)=0
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
virtual void GetFacets(G4int m, G4int n, G4double xyz[][3], G4int faces[][4], G4int iside)=0
virtual G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const
G4ThreeVector GetPointInSolid(G4double z) const
virtual G4double GetBoundaryMin(G4double)=0
G4bool IsZLimited() const
G4double GetValueB(G4double phi) const
static G4int GetNumberOfRotationSteps()
G4ThreeVectorList * CreateRotatedVertices(const G4AffineTransform &pTransform) const
G4VTwistSurface ** surface
virtual G4Polyhedron * CreatePolyhedron() const
static const double degree
virtual std::ostream & StreamInfo(std::ostream &os) const
G4double GetMaxExtent(const EAxis pAxis) const
G4VSolid & operator=(const G4VSolid &rhs)
G4ThreeVector GetPointOnSurface() const
virtual G4GeometryType GetEntityType() const
G4double GetMaxYExtent() const
G4Polyhedron * fpPolyhedron
virtual G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pMin, G4double &pMax) const
virtual EInside Inside(const G4ThreeVector &p) const
static G4GeometryTolerance * GetInstance()
virtual G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcnorm=false, G4bool *validnorm=0, G4ThreeVector *n=0) const