64 using namespace CLHEP;
75 :
G4VSolid(pName), fRebuildPolyhedron(false), fpPolyhedron(0),
76 fCubicVolume(0.), fSurfaceArea(0.), zTopCut(0.)
86 if ( (pxSemiAxis <= 0.) || (pySemiAxis <= 0.) || (pzMax <= 0.) )
88 std::ostringstream message;
89 message <<
"Invalid semi-axis or height - " <<
GetName();
90 G4Exception(
"G4EllipticalCone::G4EllipticalCone()",
"GeomSolids0002",
95 std::ostringstream message;
96 message <<
"Invalid z-coordinate for cutting plane - " <<
GetName();
97 G4Exception(
"G4EllipticalCone::G4EllipticalCone()",
"InvalidSetup",
150 if (
this == &rhs) {
return *
this; }
198 G4double rFudge = 1.0/std::cos(0.5*sigPhi);
212 cosPhi = std::cos(phi),
213 sinPhi = std::sin(phi);
215 v1( dxFudgeBot*cosPhi, dyFudgeBot*sinPhi, -
zTopCut ),
222 if (numPhi == 1) phi = 0;
223 cosPhi = std::cos(phi),
224 sinPhi = std::sin(phi);
252 phiPoly.
SetNormal( (v1-v0).cross(w0-v0).unit() );
262 }
while( --numPhi > 0 );
367 return norm /= norm.
mag();
372 return norm /= norm.
mag();
388 return norm /= norm.
mag();
399 return norm /= norm.
mag();
404 return norm /= norm.
mag();
420 return norm /= norm.
mag();
428 if( p.
z() < -k*rds +
c )
431 return norm /= norm.
mag();
487 yi = p.
y() + q*v.
y();
532 yi = p.
y() + q*v.
y();
562 return distMin = std::fabs(lambda);
577 return distMin = std::fabs(lambda);
621 return distMin = std::fabs(-B/(2.*A));
624 G4double plus = (-B+std::sqrt(discr))/(2.*A);
625 G4double minus = (-B-std::sqrt(discr))/(2.*A);
634 if ( truenorm*v >= 0)
690 G4double distR, distR2, distZ, maxDim;
700 return distZ = std::fabs(
zTopCut + p.
z());
706 return distZ = std::fabs(p.
z() -
zTopCut);
714 distRad = std::sqrt(p.
x()*p.
x()+p.
y()*p.
y());
719 return std::sqrt( distR2 );
722 if( distRad > maxDim*(
zheight - p.
z() ) )
728 return distR = std::sqrt(
sqr(p.
z() - zVal) +
sqr(distRad - rVal));
732 if( distRad <= maxDim*(
zheight - p.
z()) )
735 return std::sqrt( distR2 );
753 enum surface_e {kPlaneSurf, kCurvedSurf, kNoSurf} surface;
766 distMin = std::fabs(lambda);
768 if (!calcNorm) {
return distMin; }
770 distMin = std::fabs(lambda);
771 surface = kPlaneSurf;
782 distMin = std::fabs(lambda);
783 if (!calcNorm) {
return distMin; }
785 distMin = std::fabs(lambda);
786 surface = kPlaneSurf;
802 if(!calcNorm) {
return distMin = std::fabs(-B/(2.*A)); }
807 G4double plus = (-B+std::sqrt(discr))/(2.*A);
808 G4double minus = (-B-std::sqrt(discr))/(2.*A);
814 lambda = std::fabs(plus) < std::fabs(minus) ? plus : minus;
824 if ( std::fabs(lambda) < distMin )
828 distMin = std::fabs(lambda);
829 surface = kCurvedSurf;
836 if( truenorm.
dot(v) > 0 )
839 surface = kCurvedSurf;
849 if (surface == kNoSurf)
870 truenorm /= truenorm.
mag();
877 std::ostringstream message;
878 G4int oldprc = message.precision(16);
879 message <<
"Undefined side for valid surface normal to solid." 882 <<
" p.x() = " << p.
x()/
mm <<
" mm" <<
G4endl 883 <<
" p.y() = " << p.
y()/
mm <<
" mm" <<
G4endl 884 <<
" p.z() = " << p.
z()/
mm <<
" mm" <<
G4endl 886 <<
" v.x() = " << v.
x() <<
G4endl 887 <<
" v.y() = " << v.
y() <<
G4endl 888 <<
" v.z() = " << v.
z() <<
G4endl 889 <<
"Proposed distance :" <<
G4endl 890 <<
" distMin = " << distMin/
mm <<
" mm";
891 message.precision(oldprc);
892 G4Exception(
"G4EllipticalCone::DistanceToOut(p,v,..)",
910 G4double rds,roo,roo1, distR, distZ, distMin=0.;
917 std::ostringstream message;
918 G4int oldprc = message.precision(16);
919 message <<
"Point p is outside !?" <<
G4endl 921 <<
" p.x() = " << p.
x()/
mm <<
" mm" <<
G4endl 922 <<
" p.y() = " << p.
y()/
mm <<
" mm" <<
G4endl 923 <<
" p.z() = " << p.
z()/
mm <<
" mm";
924 message.precision(oldprc) ;
925 G4Exception(
"G4Ellipsoid::DistanceToOut(p)",
"GeomSolids1002",
936 rds = std::sqrt(
sqr(p.
x()) +
sqr(p.
y()));
941 distR=(roo-rds)/(std::sqrt(1+
sqr(minAxis)));
945 distMin=(
zTopCut-p.
z())*(roo-rds)/(roo-roo1);
960 return G4String(
"G4EllipticalCone");
978 G4int oldprc = os.precision(16);
979 os <<
"-----------------------------------------------------------\n" 980 <<
" *** Dump for solid - " <<
GetName() <<
" ***\n" 981 <<
" ===================================================\n" 982 <<
" Solid type: G4EllipticalCone\n" 987 <<
" height z: " <<
zheight/
mm <<
" mm \n" 988 <<
" half length in z: " <<
zTopCut/
mm <<
" mm \n" 989 <<
"-----------------------------------------------------------\n";
990 os.precision(oldprc);
1004 G4double phi, sinphi, cosphi, aOne, aTwo, aThree,
1005 chose, zRand, rRand1, rRand2;
1019 cosphi = std::cos(phi);
1020 sinphi = std::sin(phi);
1025 if((chose>=0.) && (chose<aOne))
1031 else if((chose>=aOne) && (chose<aOne+aTwo))
1037 }
while (( rRand2 >= rRand1 ) && (++it1 < 1000)) ;
1051 }
while (( rRand2 >= rRand1 ) && (++it2 < 1000));
G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const
ThreeVector shoot(const G4int Ap, const G4int Af)
G4EllipticalCone & operator=(const G4EllipticalCone &rhs)
static const G4double kInfinity
G4int GetNumberOfRotationStepsAtTimeOfCreation() const
CLHEP::Hep3Vector G4ThreeVector
G4ThreeVector GetPointOnSurface() const
void SetNormal(const G4ThreeVector &newNormal)
virtual G4bool PartialClip(const G4VoxelLimits &voxelLimit, const EAxis IgnoreMe)
virtual void AddVertexInOrder(const G4ThreeVector vertex)
virtual void ClearAllVertices()
virtual void AddSolid(const G4Box &)=0
#define G4MUTEX_INITIALIZER
G4bool GetExtent(G4double &min, G4double &max) const
static double normal(HepRandomEngine *eptr)
G4bool fRebuildPolyhedron
G4double GetRadialTolerance() const
double A(double temperature)
G4Polyhedron * fpPolyhedron
EInside Inside(const G4ThreeVector &p) const
G4EllipticalCone(const G4String &pName, G4double pxSemiAxis, G4double pySemiAxis, G4double zMax, G4double pzTopCut)
G4ThreeVector SurfaceNormal(const G4ThreeVector &p) const
static const double twopi
void AddSurface(const G4ClippablePolygon &surface)
G4VisExtent GetExtent() const
std::ostream & StreamInfo(std::ostream &os) const
G4GeometryType GetEntityType() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
double dot(const Hep3Vector &) const
void SetSemiAxis(G4double x, G4double y, G4double z)
G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pmin, G4double &pmax) const
static G4int GetNumberOfRotationSteps()
void SetZCut(G4double newzTopCut)
G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=G4bool(false), G4bool *validNorm=0, G4ThreeVector *n=0) const
G4Polyhedron * GetPolyhedron() const
void DescribeYourselfTo(G4VGraphicsScene &scene) const
G4VSolid & operator=(const G4VSolid &rhs)
virtual ~G4EllipticalCone()
G4Polyhedron * CreatePolyhedron() const
static G4GeometryTolerance * GetInstance()
const G4int kMaxMeshSections