34#if ( defined(G4GEOM_USE_USOLIDS) || defined(G4GEOM_USE_PARTIAL_USOLIDS) )
47G4UEllipticalCone::G4UEllipticalCone(
const G4String& pName,
52 : Base_t(pName, a, b, h, cut)
59G4UEllipticalCone::G4UEllipticalCone(
const G4UEllipticalCone& rhs)
67G4UEllipticalCone& G4UEllipticalCone::operator = (
const G4UEllipticalCone& rhs)
71 if (
this == &rhs) {
return *
this; }
75 Base_t::operator=(rhs);
84G4double G4UEllipticalCone::GetSemiAxisX()
const
86 return Base_t::GetSemiAxisX();
89G4double G4UEllipticalCone::GetSemiAxisY()
const
91 return Base_t::GetSemiAxisY();
94G4double G4UEllipticalCone::GetZMax()
const
96 return Base_t::GetZMax();
99G4double G4UEllipticalCone::GetZTopCut()
const
101 return Base_t::GetZTopCut();
104G4double G4UEllipticalCone::GetSemiAxisMax ()
const
106 return std::max(GetSemiAxisX(),GetSemiAxisY());
109G4double G4UEllipticalCone::GetSemiAxisMin ()
const
111 return std::min(GetSemiAxisX(),GetSemiAxisY());
120 Base_t::SetParameters(x, y, z, GetZTopCut());
123void G4UEllipticalCone::SetZCut(
G4double newzTopCut)
125 Base_t::SetParameters(GetSemiAxisX(), GetSemiAxisY(), GetZMax(), newzTopCut);
132G4VSolid* G4UEllipticalCone::Clone()
const
134 return new G4UEllipticalCone(*
this);
146 G4double xmax = GetSemiAxisX()*(height+zcut);
147 G4double ymax = GetSemiAxisY()*(height+zcut);
148 pMin.
set(-xmax,-ymax,-zcut);
149 pMax.
set( xmax, ymax, zcut);
153 if (pMin.
x() >= pMax.
x() || pMin.
y() >= pMax.
y() || pMin.
z() >= pMax.
z())
155 std::ostringstream message;
156 message <<
"Bad bounding box (min >= max) for solid: "
158 <<
"\npMin = " << pMin
159 <<
"\npMax = " << pMax;
160 G4Exception(
"G4UEllipticalCone::BoundingLimits()",
"GeomMgt0001",
171G4UEllipticalCone::CalculateExtent(
const EAxis pAxis,
181 BoundingLimits(bmin,bmax);
184 return bbox.CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax);
186 if (bbox.BoundingBoxVsVoxelLimits(pAxis,pVoxelLimit,pTransform,pMin,pMax))
188 return exist = pMin < pMax;
193 static const G4int NSTEPS = 48;
194 static const G4double ang = twopi/NSTEPS;
195 static const G4double sinHalf = std::sin(0.5*ang);
196 static const G4double cosHalf = std::cos(0.5*ang);
197 static const G4double sinStep = 2.*sinHalf*cosHalf;
198 static const G4double cosStep = 1. - 2.*sinHalf*sinHalf;
201 G4double sxmin = GetSemiAxisX()*(height-zcut)/cosHalf;
202 G4double symin = GetSemiAxisY()*(height-zcut)/cosHalf;
209 for (
G4int k=0; k<NSTEPS; ++k)
211 baseA[k].set(sxmax*cosCur,symax*sinCur,-zcut);
212 baseB[k].set(sxmin*cosCur,symin*sinCur, zcut);
215 sinCur = sinCur*cosStep + cosCur*sinStep;
216 cosCur = cosCur*cosStep - sinTmp*sinStep;
219 std::vector<const G4ThreeVectorList *> polygons(2);
220 polygons[0] = &baseA;
221 polygons[1] = &baseB;
223 exist = benv.CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax);
231G4Polyhedron* G4UEllipticalCone::CreatePolyhedron()
const
234 GetZMax(), GetZTopCut());
std::vector< G4ThreeVector > G4ThreeVectorList
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
CLHEP::Hep3Vector G4ThreeVector
G4GLOB_DLL std::ostream G4cout
void set(double x, double y, double z)
G4BoundingEnvelope is a helper class to facilitate calculation of the extent of a solid within the li...
G4VSolid is an abstract base class for solids, physical shapes that can be tracked through....
G4VoxelLimits represents limitation/restrictions of space, where restrictions are only made perpendic...