Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // Implementation for G4UEllipticalCone wrappe 27 // 28 // 13-08-2019 Gabriele Cosmo, CERN 29 // ------------------------------------------- 30 31 #include "G4EllipticalCone.hh" 32 #include "G4UEllipticalCone.hh" 33 34 #if ( defined(G4GEOM_USE_USOLIDS) || defined(G 35 36 #include "G4AffineTransform.hh" 37 #include "G4VPVParameterisation.hh" 38 #include "G4PhysicalConstants.hh" 39 #include "G4BoundingEnvelope.hh" 40 #include "G4Polyhedron.hh" 41 42 ////////////////////////////////////////////// 43 // 44 // Constructor - check & set half widths 45 46 47 G4UEllipticalCone::G4UEllipticalCone(const G4S 48 G4d 49 G4d 50 G4d 51 G4d 52 : Base_t(pName, a, b, h, cut) 53 { } 54 55 ////////////////////////////////////////////// 56 // 57 // Fake default constructor - sets only member 58 // for usage restri 59 60 G4UEllipticalCone::G4UEllipticalCone( __void__ 61 : Base_t(a) 62 { } 63 64 ////////////////////////////////////////////// 65 // 66 // Destructor 67 68 G4UEllipticalCone::~G4UEllipticalCone() = defa 69 70 ////////////////////////////////////////////// 71 // 72 // Copy constructor 73 74 G4UEllipticalCone::G4UEllipticalCone(const G4U 75 : Base_t(rhs) 76 { } 77 78 ////////////////////////////////////////////// 79 // 80 // Assignment operator 81 82 G4UEllipticalCone& G4UEllipticalCone::operator 83 { 84 // Check assignment to self 85 // 86 if (this == &rhs) { return *this; } 87 88 // Copy base class data 89 // 90 Base_t::operator=(rhs); 91 92 return *this; 93 } 94 95 ////////////////////////////////////////////// 96 // 97 // Accessors 98 99 G4double G4UEllipticalCone::GetSemiAxisX() con 100 { 101 return Base_t::GetSemiAxisX(); 102 } 103 104 G4double G4UEllipticalCone::GetSemiAxisY() con 105 { 106 return Base_t::GetSemiAxisY(); 107 } 108 109 G4double G4UEllipticalCone::GetZMax() const 110 { 111 return Base_t::GetZMax(); 112 } 113 114 G4double G4UEllipticalCone::GetZTopCut() const 115 { 116 return Base_t::GetZTopCut(); 117 } 118 119 G4double G4UEllipticalCone::GetSemiAxisMax () 120 { 121 return std::max(GetSemiAxisX(),GetSemiAxisY( 122 } 123 124 G4double G4UEllipticalCone::GetSemiAxisMin () 125 { 126 return std::min(GetSemiAxisX(),GetSemiAxisY( 127 } 128 129 ////////////////////////////////////////////// 130 // 131 // Modifiers 132 133 void G4UEllipticalCone::SetSemiAxis(G4double x 134 { 135 Base_t::SetParameters(x, y, z, GetZTopCut()) 136 } 137 138 void G4UEllipticalCone::SetZCut(G4double newzT 139 { 140 Base_t::SetParameters(GetSemiAxisX(), GetSem 141 } 142 143 ////////////////////////////////////////////// 144 // 145 // Make a clone of the object 146 147 G4VSolid* G4UEllipticalCone::Clone() const 148 { 149 return new G4UEllipticalCone(*this); 150 } 151 152 ////////////////////////////////////////////// 153 // 154 // Get bounding box 155 156 void G4UEllipticalCone::BoundingLimits(G4Three 157 G4Three 158 { 159 G4double zcut = GetZTopCut(); 160 G4double height = GetZMax(); 161 G4double xmax = GetSemiAxisX()*(height+zcu 162 G4double ymax = GetSemiAxisY()*(height+zcu 163 pMin.set(-xmax,-ymax,-zcut); 164 pMax.set( xmax, ymax, zcut); 165 166 // Check correctness of the bounding box 167 // 168 if (pMin.x() >= pMax.x() || pMin.y() >= pMax 169 { 170 std::ostringstream message; 171 message << "Bad bounding box (min >= max) 172 << GetName() << " !" 173 << "\npMin = " << pMin 174 << "\npMax = " << pMax; 175 G4Exception("G4UEllipticalCone::BoundingLi 176 JustWarning, message); 177 StreamInfo(G4cout); 178 } 179 } 180 181 ////////////////////////////////////////////// 182 // 183 // Calculate extent under transform and specif 184 185 G4bool 186 G4UEllipticalCone::CalculateExtent(const EAxis 187 const G4Vox 188 const G4Aff 189 G4dou 190 { 191 G4ThreeVector bmin,bmax; 192 G4bool exist; 193 194 // Check bounding box (bbox) 195 // 196 BoundingLimits(bmin,bmax); 197 G4BoundingEnvelope bbox(bmin,bmax); 198 #ifdef G4BBOX_EXTENT 199 return bbox.CalculateExtent(pAxis,pVoxelLimi 200 #endif 201 if (bbox.BoundingBoxVsVoxelLimits(pAxis,pVox 202 { 203 return exist = pMin < pMax; 204 } 205 206 // Set bounding envelope (benv) and calculat 207 // 208 static const G4int NSTEPS = 48; // number of 209 static const G4double ang = twopi/NSTEPS; 210 static const G4double sinHalf = std::sin(0.5 211 static const G4double cosHalf = std::cos(0.5 212 static const G4double sinStep = 2.*sinHalf*c 213 static const G4double cosStep = 1. - 2.*sinH 214 G4double zcut = bmax.z(); 215 G4double height = GetZMax(); 216 G4double sxmin = GetSemiAxisX()*(height-zcu 217 G4double symin = GetSemiAxisY()*(height-zcu 218 G4double sxmax = bmax.x()/cosHalf; 219 G4double symax = bmax.y()/cosHalf; 220 221 G4double sinCur = sinHalf; 222 G4double cosCur = cosHalf; 223 G4ThreeVectorList baseA(NSTEPS),baseB(NSTEPS 224 for (G4int k=0; k<NSTEPS; ++k) 225 { 226 baseA[k].set(sxmax*cosCur,symax*sinCur,-zc 227 baseB[k].set(sxmin*cosCur,symin*sinCur, zc 228 229 G4double sinTmp = sinCur; 230 sinCur = sinCur*cosStep + cosCur*sinStep; 231 cosCur = cosCur*cosStep - sinTmp*sinStep; 232 } 233 234 std::vector<const G4ThreeVectorList *> polyg 235 polygons[0] = &baseA; 236 polygons[1] = &baseB; 237 G4BoundingEnvelope benv(bmin,bmax,polygons); 238 exist = benv.CalculateExtent(pAxis,pVoxelLim 239 return exist; 240 } 241 242 ////////////////////////////////////////////// 243 // 244 // CreatePolyhedron 245 // 246 G4Polyhedron* G4UEllipticalCone::CreatePolyhed 247 { 248 return new G4PolyhedronEllipticalCone(GetSem 249 GetZMa 250 } 251 252 #endif // G4GEOM_USE_USOLIDS 253