79 fLowerEndcap(0), fUpperEndcap(0), fLatterTwisted(0),
80 fFormerTwisted(0), fInnerHype(0), fOuterHype(0),
81 fCubicVolume(0.), fSurfaceArea(0.),
82 fRebuildPolyhedron(false), fpPolyhedron(0)
86 G4Exception(
"G4TwistedTubs::G4TwistedTubs()",
"GeomSolids0002",
90 G4double sinhalftwist = std::sin(0.5 * twistedangle);
92 G4double endinnerradX = endinnerrad * sinhalftwist;
93 G4double innerrad = std::sqrt( endinnerrad * endinnerrad
94 - endinnerradX * endinnerradX );
96 G4double endouterradX = endouterrad * sinhalftwist;
97 G4double outerrad = std::sqrt( endouterrad * endouterrad
98 - endouterradX * endouterradX );
101 SetFields(twistedangle, innerrad, outerrad, -halfzlen, halfzlen);
113 fLowerEndcap(0), fUpperEndcap(0), fLatterTwisted(0),
114 fFormerTwisted(0), fInnerHype(0), fOuterHype(0),
115 fCubicVolume(0.), fSurfaceArea(0.),
116 fRebuildPolyhedron(false), fpPolyhedron(0)
121 std::ostringstream message;
122 message <<
"Invalid number of segments." <<
G4endl
123 <<
" nseg = " << nseg;
124 G4Exception(
"G4TwistedTubs::G4TwistedTubs()",
"GeomSolids0002",
129 G4Exception(
"G4TwistedTubs::G4TwistedTubs()",
"GeomSolids0002",
133 G4double sinhalftwist = std::sin(0.5 * twistedangle);
135 G4double endinnerradX = endinnerrad * sinhalftwist;
136 G4double innerrad = std::sqrt( endinnerrad * endinnerrad
137 - endinnerradX * endinnerradX );
139 G4double endouterradX = endouterrad * sinhalftwist;
140 G4double outerrad = std::sqrt( endouterrad * endouterrad
141 - endouterradX * endouterradX );
144 fDPhi = totphi / nseg;
145 SetFields(twistedangle, innerrad, outerrad, -halfzlen, halfzlen);
157 fLowerEndcap(0), fUpperEndcap(0), fLatterTwisted(0),
158 fFormerTwisted(0), fInnerHype(0), fOuterHype(0),
159 fCubicVolume(0.), fSurfaceArea(0.),
160 fRebuildPolyhedron(false), fpPolyhedron(0)
164 G4Exception(
"G4TwistedTubs::G4TwistedTubs()",
"GeomSolids0002",
168 SetFields(twistedangle, innerrad, outerrad, negativeEndz, positiveEndz);
181 fLowerEndcap(0), fUpperEndcap(0), fLatterTwisted(0),
182 fFormerTwisted(0), fInnerHype(0), fOuterHype(0),
183 fCubicVolume(0.), fSurfaceArea(0.),
184 fRebuildPolyhedron(false), fpPolyhedron(0)
188 std::ostringstream message;
189 message <<
"Invalid number of segments." <<
G4endl
190 <<
" nseg = " << nseg;
191 G4Exception(
"G4TwistedTubs::G4TwistedTubs()",
"GeomSolids0002",
196 G4Exception(
"G4TwistedTubs::G4TwistedTubs()",
"GeomSolids0002",
200 fDPhi = totphi / nseg;
201 SetFields(twistedangle, innerrad, outerrad, negativeEndz, positiveEndz);
209 :
G4VSolid(a), fPhiTwist(0.), fInnerRadius(0.), fOuterRadius(0.), fDPhi(0.),
210 fZHalfLength(0.), fInnerStereo(0.), fOuterStereo(0.), fTanInnerStereo(0.),
211 fTanOuterStereo(0.), fKappa(0.), fInnerRadius2(0.), fOuterRadius2(0.),
212 fTanInnerStereo2(0.), fTanOuterStereo2(0.), fLowerEndcap(0), fUpperEndcap(0),
213 fLatterTwisted(0), fFormerTwisted(0), fInnerHype(0), fOuterHype(0),
214 fCubicVolume(0.), fSurfaceArea(0.),
215 fRebuildPolyhedron(false), fpPolyhedron(0)
237 :
G4VSolid(rhs), fPhiTwist(rhs.fPhiTwist),
238 fInnerRadius(rhs.fInnerRadius), fOuterRadius(rhs.fOuterRadius),
239 fDPhi(rhs.fDPhi), fZHalfLength(rhs.fZHalfLength),
240 fInnerStereo(rhs.fInnerStereo), fOuterStereo(rhs.fOuterStereo),
241 fTanInnerStereo(rhs.fTanInnerStereo), fTanOuterStereo(rhs.fTanOuterStereo),
242 fKappa(rhs.fKappa), fInnerRadius2(rhs.fInnerRadius2),
243 fOuterRadius2(rhs.fOuterRadius2), fTanInnerStereo2(rhs.fTanInnerStereo2),
244 fTanOuterStereo2(rhs.fTanOuterStereo2),
245 fLowerEndcap(0), fUpperEndcap(0), fLatterTwisted(0), fFormerTwisted(0),
246 fInnerHype(0), fOuterHype(0),
247 fCubicVolume(rhs.fCubicVolume), fSurfaceArea(rhs.fSurfaceArea),
248 fRebuildPolyhedron(false), fpPolyhedron(0),
249 fLastInside(rhs.fLastInside), fLastNormal(rhs.fLastNormal),
250 fLastDistanceToIn(rhs.fLastDistanceToIn),
251 fLastDistanceToOut(rhs.fLastDistanceToOut),
252 fLastDistanceToInWithV(rhs.fLastDistanceToInWithV),
253 fLastDistanceToOutWithV(rhs.fLastDistanceToOutWithV)
255 for (
size_t i=0; i<2; ++i)
274 if (
this == &rhs) {
return *
this; }
299 for (
size_t i=0; i<2; ++i)
324 "G4TwistedTubs does not support Parameterisation.");
352 G4double rFudge = 1.0/std::cos(0.5*sigPhi);
353 G4double fudgeEndOuterRad = rFudge * maxEndOuterRad;
401 if ( phimax >
pi/2) { phimax =
pi-phimax; }
417 G4ThreeVector(fudgeEndOuterRad*cosPhi, fudgeEndOuterRad*sinPhi,
420 G4ThreeVector(fudgeEndOuterRad*cosPhi, fudgeEndOuterRad*sinPhi,
425 G4ThreeVector(fudgeEndOuterRad*cosPhi, fudgeEndOuterRad*sinPhi, 0));
468 cosPhi = std::cos(phimax);
469 sinPhi = std::sin(phimax);
474 G4ThreeVector(fudgeEndOuterRad*cosPhi, fudgeEndOuterRad*sinPhi,
477 G4ThreeVector(fudgeEndOuterRad*cosPhi, fudgeEndOuterRad*sinPhi,
563 phiPoly.
SetNormal( (v1-v0).cross(w0-v0).unit() );
591 tmpp->set(p.x(), p.y(), p.z());
596 G4double distanceToOut = p.getRho() - innerhyperho;
598 if ((outerhypearea ==
kOutside) || (distanceToOut < -halftol))
608 if (distanceToOut <= halftol)
643 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());
756 if (tmpdistance < distance)
758 distance = tmpdistance;
790 tmpp->set(p.x(), p.y(), p.z());
828 if (tmpdistance < distance)
830 distance = tmpdistance;
839 G4Exception(
"G4TwistedTubs::DistanceToIn(p)",
"GeomSolids0003",
878 tmpp->set(p.x(), p.y(), p.z());
879 tmpv->set(v.x(), v.y(), v.z());
904 *norm = (blockedsurface->
GetNormal(p,
true));
936 if (tmpdistance < distance)
938 distance = tmpdistance;
948 *norm = (surfaces[besti]->
GetNormal(p,
true));
982 tmpp->set(p.x(), p.y(), p.z());
1018 for (i=0; i< 6; i++)
1021 if (tmpdistance < distance)
1023 distance = tmpdistance;
1027 *tmpdist = distance;
1033 G4Exception(
"G4TwistedTubs::DistanceToOut(p)",
"GeomSolids0003",
1049 G4int oldprc = os.precision(16);
1050 os <<
"-----------------------------------------------------------\n"
1051 <<
" *** Dump for solid - " <<
GetName() <<
" ***\n"
1052 <<
" ===================================================\n"
1053 <<
" Solid type: G4TwistedTubs\n"
1054 <<
" Parameters: \n"
1055 <<
" -ve end Z : " <<
fEndZ[0]/
mm <<
" mm \n"
1056 <<
" +ve end Z : " <<
fEndZ[1]/
mm <<
" mm \n"
1066 <<
" phi-width of a piece : " <<
fDPhi/
degree <<
" degrees \n"
1067 <<
"-----------------------------------------------------------\n";
1068 os.precision(oldprc);
1090 return G4VisExtent( -maxEndOuterRad, maxEndOuterRad,
1091 -maxEndOuterRad, maxEndOuterRad,
1104 G4int(G4Polyhedron::GetNumberOfRotationSteps() * dA / twopi) + 2;
1106 G4int(G4Polyhedron::GetNumberOfRotationSteps() *
fPhiTwist / twopi) + 2;
1108 const G4int nnodes = 4*(k-1)*(n-2) + 2*k*k ;
1109 const G4int nfaces = 4*(k-1)*(n-1) + 2*(k-1)*(k-1) ;
1113 typedef G4int G4int4[4];
1114 G4double3* xyz =
new G4double3[nnodes];
1115 G4int4* faces =
new G4int4[nfaces] ;
1123 ph->createPolyhedron(nnodes,nfaces,xyz,faces);
1169 rotHalfDPhi.rotateZ(0.5*
fDPhi);
1278 else if ( (chose >= a1) && (chose < a1 + a2 ) )
1288 else if ( (chose >= a1 + a2 ) && (chose < a1 + a2 + a3 ) )
1298 else if ( (chose >= a1 + a2 + a3 ) && (chose < a1 + a2 + a3 + a4 ) )
1307 else if( (chose >= a1 + a2 + a3 + a4 )&&(chose < a1 + a2 + a3 + a4 + a5 ) )
ThreeVector shoot(const G4int Ap, const G4int Af)
G4double GetEndInnerRadius() const
static const G4double kInfinity
CLHEP::Hep3Vector G4ThreeVector
G4ThreeVector GetPointOnSurface() const
CLHEP::HepRotation G4RotationMatrix
virtual G4ThreeVector GetNormal(const G4ThreeVector &xx, G4bool isGlobal)=0
static void AddPolyToExtent(const G4ThreeVector &v0, const G4ThreeVector &v1, const G4ThreeVector &w1, const G4ThreeVector &w0, const G4VoxelLimits &voxellimit, const EAxis axis, G4SolidExtentList &extentlist)
std::ostream & StreamInfo(std::ostream &os) const
G4bool GetExtent(G4double &min, G4double &max) const
G4Polyhedron * CreatePolyhedron() const
G4VTwistSurface * fFormerTwisted
void SetNormal(const G4ThreeVector &newNormal)
G4double fEndOuterRadius[2]
LastValueWithDoubleVector fLastDistanceToInWithV
virtual G4bool PartialClip(const G4VoxelLimits &voxelLimit, const EAxis IgnoreMe)
virtual void AddVertexInOrder(const G4ThreeVector vertex)
LastValue fLastDistanceToIn
EInside Inside(const G4ThreeVector &p) const
virtual void AddSolid(const G4Box &)=0
void ComputeDimensions(G4VPVParameterisation *, const G4int, const G4VPhysicalVolume *)
G4double fEndInnerRadius[2]
#define G4MUTEX_INITIALIZER
G4bool IsValidNorm() const
G4GeometryType GetEntityType() const
G4VTwistSurface * fUpperEndcap
virtual G4double DistanceToIn(const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector &gxxbest)
G4double GetEndOuterRadius() const
G4ThreeVector SurfaceNormal(const G4ThreeVector &p) const
static double normal(HepRandomEngine *eptr)
G4VTwistSurface * fOuterHype
virtual G4double GetSurfaceArea()=0
void SetNeighbours(G4VTwistSurface *axis0min, G4VTwistSurface *axis1min, G4VTwistSurface *axis0max, G4VTwistSurface *axis1max)
virtual G4double DistanceTo(const G4ThreeVector &gp, G4ThreeVector &gxx)
void DescribeYourselfTo(G4VGraphicsScene &scene) const
virtual G4double DistanceToOut(const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector &gxxbest)
virtual G4ThreeVector SurfacePoint(G4double, G4double, G4bool isGlobal=false)=0
G4double GetRadialTolerance() const
G4VTwistSurface ** surface
void SetFields(G4double phitwist, G4double innerrad, G4double outerrad, G4double negativeEndz, G4double positiveEndz)
G4bool fRebuildPolyhedron
void AddSurface(const G4ClippablePolygon &surface)
LastValueWithDoubleVector fLastDistanceToOutWithV
G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcnorm=G4bool(false), G4bool *validnorm=0, G4ThreeVector *n=0) const
virtual G4double GetBoundaryMax(G4double)=0
G4double GetSurfaceArea()
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
LastValue fLastDistanceToOut
virtual void GetFacets(G4int m, G4int n, G4double xyz[][3], G4int faces[][4], G4int iside)=0
virtual G4double GetBoundaryMin(G4double)=0
G4VTwistSurface * fLatterTwisted
G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4VTwistSurface * fInnerHype
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
static const double degree
G4double fTanInnerStereo2
G4Polyhedron * fpPolyhedron
G4TwistedTubs(const G4String &pname, G4double twistedangle, G4double endinnerrad, G4double endouterrad, G4double halfzlen, G4double dphi)
G4VSolid & operator=(const G4VSolid &rhs)
G4int GetNumberOfRotationStepsAtTimeOfCreation() const
G4double fTanOuterStereo2
G4double GetCubicVolume()
G4VTwistSurface * fLowerEndcap
G4VisExtent GetExtent() const
virtual G4double GetSurfaceArea()
static G4GeometryTolerance * GetInstance()
G4Polyhedron * GetPolyhedron() const
G4bool CalculateExtent(const EAxis paxis, const G4VoxelLimits &pvoxellimit, const G4AffineTransform &ptransform, G4double &pmin, G4double &pmax) const
G4TwistedTubs & operator=(const G4TwistedTubs &rhs)