77 fLowerEndcap(0), fUpperEndcap(0), fSide0(0),
78 fSide90(0), fSide180(0), fSide270(0),
79 fSurfaceArea(0.), fpPolyhedron(0)
101 fDx = ( fDxUp > fDxDown ? fDxUp : fDxDown ) ;
111 std::ostringstream message;
112 message <<
"Not planar surface in untwisted Trapezoid: "
114 <<
"fDy2 is " <<
fDy2 <<
" but should be "
116 G4Exception(
"G4VTwistedFaceted::G4VTwistedFaceted()",
"GeomSolids0002",
131 std::ostringstream message;
132 message <<
"Not planar surface in untwisted Trapezoid: "
134 <<
"One endcap is rectangular, the other is a trapezoid." <<
G4endl
135 <<
"For planarity reasons they have to be rectangles or trapezoids "
137 G4Exception(
"G4VTwistedFaceted::G4VTwistedFaceted()",
"GeomSolids0002",
168 && ( std::fabs(
fPhiTwist) > 2*kAngTolerance )
171 && ( fTheta < pi/2 && fTheta >= 0 ) )
174 std::ostringstream message;
175 message <<
"Invalid dimensions. Too small, or twist angle too big: "
196 :
G4VSolid(a), fTheta(0.), fPhi(0.), fDy1(0.), fDx1(0.), fDx2(0.),
197 fDy2(0.), fDx3(0.), fDx4(0.), fDz(0.), fDx(0.), fDy(0.), fAlph(0.),
198 fTAlph(0.), fdeltaX(0.), fdeltaY(0.), fPhiTwist(0.),
199 fLowerEndcap(0), fUpperEndcap(0), fSide0(0), fSide90(0), fSide180(0),
200 fSide270(0), fCubicVolume(0.), fSurfaceArea(0.), fpPolyhedron(0)
223 :
G4VSolid(rhs), fTheta(rhs.fTheta), fPhi(rhs.fPhi),
224 fDy1(rhs.fDy1), fDx1(rhs.fDx1), fDx2(rhs.fDx2), fDy2(rhs.fDy2),
225 fDx3(rhs.fDx3), fDx4(rhs.fDx4), fDz(rhs.fDz), fDx(rhs.fDx), fDy(rhs.fDy),
226 fAlph(rhs.fAlph), fTAlph(rhs.fTAlph), fdeltaX(rhs.fdeltaX),
227 fdeltaY(rhs.fdeltaY), fPhiTwist(rhs.fPhiTwist), fLowerEndcap(0),
228 fUpperEndcap(0), fSide0(0), fSide90(0), fSide180(0), fSide270(0),
229 fCubicVolume(rhs.fCubicVolume), fSurfaceArea(rhs.fSurfaceArea),
231 fLastInside(rhs.fLastInside), fLastNormal(rhs.fLastNormal),
232 fLastDistanceToIn(rhs.fLastDistanceToIn),
233 fLastDistanceToOut(rhs.fLastDistanceToOut),
234 fLastDistanceToInWithV(rhs.fLastDistanceToInWithV),
235 fLastDistanceToOutWithV(rhs.fLastDistanceToOutWithV)
248 if (
this == &rhs) {
return *
this; }
282 G4Exception(
"G4VTwistedFaceted::ComputeDimensions()",
284 "G4VTwistedFaceted does not support Parameterisation.");
310 xMin = xoffset - maxRad ;
311 xMax = xoffset + maxRad ;
330 yMin = yoffset - maxRad ;
331 yMax = yoffset + maxRad ;
350 zMin = zoffset -
fDz ;
351 zMax = zoffset +
fDz ;
393 G4bool existsAfterClip = false ;
406 if (pVoxelLimit.
IsLimited(pAxis) ==
false)
410 existsAfterClip = true ;
427 existsAfterClip = true ;
463 existsAfterClip = true ;
469 return existsAfterClip;
483 vertices->reserve(8);
508 G4Exception(
"G4VTwistedFaceted::CreateRotatedVertices()",
510 "Error in allocation of vertices. Out of memory !");
528 tmpp->set(p.x(), p.y(), p.z());
541 G4double posx = px * cphi - py * sphi ;
542 G4double posy = px * sphi + py * cphi ;
632 tmpp->set(p.x(), p.y(), p.z());
652 if (tmpdistance < distance)
654 distance = tmpdistance;
660 tmpsurface[0] = surfaces[besti];
661 *tmpnormal = tmpsurface[0]->
GetNormal(bestxx,
true);
695 tmpp->set(p.x(), p.y(), p.z());
696 tmpv->set(v.x(), v.y(), v.z());
741 for (i=0; i < 6 ; i++)
748 G4cout <<
"Solid DistanceToIn : distance = " << tmpdistance <<
G4endl ;
751 if (tmpdistance < distance)
753 distance = tmpdistance;
789 tmpp->set(p.x(), p.y(), p.z());
833 if (tmpdistance < distance)
835 distance = tmpdistance;
845 G4Exception(
"G4VTwistedFaceted::DistanceToIn(p)",
"GeomSolids0003",
886 tmpp->set(p.x(), p.y(), p.z());
887 tmpv->set(v.x(), v.y(), v.z());
910 *norm = (blockedsurface->
GetNormal(p,
true));
938 for (i=0; i< 6 ; i++) {
940 if (tmpdistance < distance)
942 distance = tmpdistance;
952 *norm = (surfaces[besti]->
GetNormal(p,
true));
984 tmpp->set(p.x(), p.y(), p.z());
1006 G4cout.precision(oldprc) ;
1007 G4Exception(
"G4VTwistedFaceted::DistanceToOut(p)",
"GeomSolids1002",
1039 for (i=0; i< 6; i++)
1042 if (tmpdistance < distance)
1044 distance = tmpdistance;
1048 *tmpdist = distance;
1056 G4Exception(
"G4VTwistedFaceted::DistanceToOut(p)",
"GeomSolids0003",
1074 G4int oldprc = os.precision(16);
1075 os <<
"-----------------------------------------------------------\n"
1076 <<
" *** Dump for solid - " <<
GetName() <<
" ***\n"
1077 <<
" ===================================================\n"
1078 <<
" Solid type: G4VTwistedFaceted\n"
1079 <<
" Parameters: \n"
1084 <<
" Half length along y (lower endcap) = " <<
fDy1/
cm <<
" cm"
1086 <<
" Half length along x (lower endcap, bottom) = " <<
fDx1/
cm <<
" cm"
1088 <<
" Half length along x (lower endcap, top) = " <<
fDx2/
cm <<
" cm"
1090 <<
" Half length along y (upper endcap) = " <<
fDy2/
cm <<
" cm"
1092 <<
" Half length along x (upper endcap, bottom) = " <<
fDx3/
cm <<
" cm"
1094 <<
" Half length along x (upper endcap, top) = " <<
fDx4/
cm <<
" cm"
1096 <<
"-----------------------------------------------------------\n";
1097 os.precision(oldprc);
1178 return G4String(
"G4VTwistedFaceted");
1209 if ( z ==
fDz ) z -= 0.1*
fDz ;
1210 if ( z == -
fDz ) z += 0.1*
fDz ;
1261 else if( (chose >= a1) && (chose < a1 + a2 ) )
1272 else if( (chose >= a1 + a2 ) && (chose < a1 + a2 + a3 ) )
1282 else if( (chose >= a1 + a2 + a3 ) && (chose < a1 + a2 + a3 + a4 ) )
1292 else if( (chose >= a1 + a2 + a3 + a4 ) && (chose < a1 + a2 + a3 + a4 + a5 ) )
1322 G4int(G4Polyhedron::GetNumberOfRotationSteps() *
fPhiTwist / twopi) + 2;
1325 const G4int nnodes = 4*(k-1)*(n-2) + 2*k*k ;
1326 const G4int nfaces = 4*(k-1)*(n-1) + 2*(k-1)*(k-1) ;
1330 typedef G4int G4int4[4];
1331 G4double3* xyz =
new G4double3[nnodes];
1332 G4int4* faces =
new G4int4[nfaces] ;
1341 ph->createPolyhedron(nnodes,nfaces,xyz,faces);
LastValue fLastDistanceToOut
void ClipCrossSection(G4ThreeVectorList *pVertices, const G4int pSectionIndex, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
ThreeVector shoot(const G4int Ap, const G4int Af)
virtual void ComputeDimensions(G4VPVParameterisation *, const G4int, const G4VPhysicalVolume *)
G4ThreeVectorList * CreateRotatedVertices(const G4AffineTransform &pTransform) const
G4VTwistSurface * fSide90
static const G4double kInfinity
G4double GetMinYExtent() 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
G4bool IsYLimited() const
virtual G4GeometryType GetEntityType() const
G4ThreeVector GetPointOnSurface() const
G4ThreeVector GetPointInSolid(G4double z) const
virtual G4Polyhedron * CreatePolyhedron() const
virtual G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const
G4bool IsXLimited() const
G4VTwistedFaceted & operator=(const G4VTwistedFaceted &rhs)
virtual void AddSolid(const G4Box &)=0
virtual G4ThreeVector SurfaceNormal(const G4ThreeVector &p) const
G4bool IsValidNorm() const
G4VTwistSurface * fSide180
LastValue fLastDistanceToIn
virtual G4double DistanceToIn(const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector &gxxbest)
G4double Xcoef(G4double u, G4double phi, G4double ftg) const
static double normal(HepRandomEngine *eptr)
G4double GetMaxXExtent() const
virtual G4double GetSurfaceArea()=0
G4VTwistSurface * fSide270
G4double GetMinZExtent() const
G4GLOB_DLL std::ostream G4cout
virtual G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pMin, G4double &pMax) const
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 ~G4VTwistedFaceted()
G4double GetValueB(G4double phi) const
G4VTwistSurface * fLowerEndcap
std::vector< G4ThreeVector > G4ThreeVectorList
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 DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcnorm=false, G4bool *validnorm=0, G4ThreeVector *n=0) const
virtual G4double GetBoundaryMin(G4double)=0
G4double GetMinXExtent() const
G4double GetMaxZExtent() const
virtual G4Polyhedron * GetPolyhedron() const
G4VTwistSurface ** surface
virtual G4VisExtent GetExtent() const
virtual EInside Inside(const G4ThreeVector &p) const
virtual void DescribeYourselfTo(G4VGraphicsScene &scene) const
static const double degree
G4double GetMaxYExtent() const
G4VSolid & operator=(const G4VSolid &rhs)
G4int GetNumberOfRotationStepsAtTimeOfCreation() const
virtual std::ostream & StreamInfo(std::ostream &os) const
G4double GetMaxExtent(const EAxis pAxis) const
G4bool IsZLimited() const
G4Polyhedron * fpPolyhedron
G4double GetAngularTolerance() const
void ClipBetweenSections(G4ThreeVectorList *pVertices, const G4int pSectionIndex, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
G4double GetMinExtent(const EAxis pAxis) const
static G4GeometryTolerance * GetInstance()