Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // G4VSolid implementation for solid base clas << 27 // 26 // 28 // 10.10.18 E.Tcherniaev, more robust Estimate << 27 // $Id: G4VSolid.cc,v 1.40 2010/10/19 15:19:37 gcosmo Exp $ 29 // 30.06.95 P.Kent, Created. << 28 // GEANT4 tag $Name: geant4-09-04 $ >> 29 // >> 30 // class G4VSolid >> 31 // >> 32 // Implementation for solid base class >> 33 // >> 34 // History: >> 35 // >> 36 // 06.12.02 V.Grichine, restored original conditions in ClipPolygon() >> 37 // 10.05.02 V.Grichine, ClipPolygon(): clip only other axis and limited voxels >> 38 // 15.04.02 V.Grichine, bug fixed in ClipPolygon(): clip only one axis >> 39 // 13.03.02 V.Grichine, cosmetics of voxel limit functions >> 40 // 15.11.00 D.Williams, V.Grichine, fix in CalculateClippedPolygonExtent() >> 41 // 10.07.95 P.Kent, Added == operator, solid Store entry >> 42 // 30.06.95 P.Kent, Created. 30 // ------------------------------------------- 43 // -------------------------------------------------------------------- 31 44 32 #include "G4VSolid.hh" 45 #include "G4VSolid.hh" 33 #include "G4SolidStore.hh" 46 #include "G4SolidStore.hh" 34 #include "globals.hh" 47 #include "globals.hh" 35 #include "G4QuickRand.hh" << 48 #include "Randomize.hh" 36 #include "G4GeometryTolerance.hh" 49 #include "G4GeometryTolerance.hh" 37 50 38 #include "G4VoxelLimits.hh" 51 #include "G4VoxelLimits.hh" 39 #include "G4AffineTransform.hh" 52 #include "G4AffineTransform.hh" 40 #include "G4VisExtent.hh" 53 #include "G4VisExtent.hh" 41 54 42 ////////////////////////////////////////////// 55 ////////////////////////////////////////////////////////////////////////// 43 // 56 // 44 // Streaming operator dumping solid contents << 45 << 46 std::ostream& operator<< ( std::ostream& os, c << 47 { << 48 return e.StreamInfo(os); << 49 } << 50 << 51 ////////////////////////////////////////////// << 52 // << 53 // Constructor 57 // Constructor 54 // - Copies name 58 // - Copies name 55 // - Add ourselves to solid Store 59 // - Add ourselves to solid Store 56 60 57 G4VSolid::G4VSolid(const G4String& name) 61 G4VSolid::G4VSolid(const G4String& name) 58 : fshapeName(name) 62 : fshapeName(name) 59 { 63 { 60 kCarTolerance = G4GeometryTolerance::GetIn 64 kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance(); 61 65 62 // Register to store 66 // Register to store 63 // 67 // 64 G4SolidStore::GetInstance()->Register(this 68 G4SolidStore::GetInstance()->Register(this); 65 } 69 } 66 70 67 ////////////////////////////////////////////// 71 ////////////////////////////////////////////////////////////////////////// 68 // 72 // 69 // Copy constructor 73 // Copy constructor 70 // 74 // 71 75 72 G4VSolid::G4VSolid(const G4VSolid& rhs) 76 G4VSolid::G4VSolid(const G4VSolid& rhs) 73 : kCarTolerance(rhs.kCarTolerance), fshapeNa 77 : kCarTolerance(rhs.kCarTolerance), fshapeName(rhs.fshapeName) 74 { 78 { 75 // Register to store 79 // Register to store 76 // 80 // 77 G4SolidStore::GetInstance()->Register(this 81 G4SolidStore::GetInstance()->Register(this); 78 } 82 } 79 83 80 ////////////////////////////////////////////// 84 ////////////////////////////////////////////////////////////////////////// 81 // 85 // 82 // Fake default constructor - sets only member 86 // Fake default constructor - sets only member data and allocates memory 83 // for usage restri 87 // for usage restricted to object persistency. 84 // 88 // 85 G4VSolid::G4VSolid( __void__& ) 89 G4VSolid::G4VSolid( __void__& ) 86 : fshapeName("") 90 : fshapeName("") 87 { 91 { 88 // Register to store 92 // Register to store 89 // 93 // 90 G4SolidStore::GetInstance()->Register(this 94 G4SolidStore::GetInstance()->Register(this); 91 } 95 } 92 96 93 ////////////////////////////////////////////// 97 ////////////////////////////////////////////////////////////////////////// 94 // 98 // 95 // Destructor (virtual) 99 // Destructor (virtual) 96 // - Remove ourselves from solid Store 100 // - Remove ourselves from solid Store 97 101 98 G4VSolid::~G4VSolid() 102 G4VSolid::~G4VSolid() 99 { 103 { 100 G4SolidStore::GetInstance()->DeRegister(th 104 G4SolidStore::GetInstance()->DeRegister(this); 101 } 105 } 102 106 103 ////////////////////////////////////////////// 107 ////////////////////////////////////////////////////////////////////////// 104 // 108 // 105 // Assignment operator 109 // Assignment operator 106 110 107 G4VSolid& G4VSolid::operator = (const G4VSolid << 111 G4VSolid& G4VSolid::operator = (const G4VSolid& rhs) 108 { 112 { 109 // Check assignment to self 113 // Check assignment to self 110 // 114 // 111 if (this == &rhs) { return *this; } 115 if (this == &rhs) { return *this; } 112 116 113 // Copy data 117 // Copy data 114 // 118 // 115 kCarTolerance = rhs.kCarTolerance; 119 kCarTolerance = rhs.kCarTolerance; 116 fshapeName = rhs.fshapeName; 120 fshapeName = rhs.fshapeName; 117 121 118 return *this; 122 return *this; 119 } << 123 } 120 << 121 << 122 124 123 ////////////////////////////////////////////// 125 ////////////////////////////////////////////////////////////////////////// 124 // 126 // 125 // Set solid name and notify store of the chan << 127 // Streaming operator dumping solid contents 126 128 127 void G4VSolid::SetName(const G4String& name) << 129 std::ostream& operator<< ( std::ostream& os, const G4VSolid& e ) 128 { 130 { 129 fshapeName = name; << 131 return e.StreamInfo(os); 130 G4SolidStore::GetInstance()->SetMapValid(fal << 131 } 132 } 132 133 133 ////////////////////////////////////////////// 134 ////////////////////////////////////////////////////////////////////////// 134 // 135 // 135 // Throw exception if ComputeDimensions called 136 // Throw exception if ComputeDimensions called for illegal derived class 136 137 137 void G4VSolid::ComputeDimensions(G4VPVParamete 138 void G4VSolid::ComputeDimensions(G4VPVParameterisation*, 138 const G4int, 139 const G4int, 139 const G4VPhys 140 const G4VPhysicalVolume*) 140 { 141 { 141 std::ostringstream message; << 142 G4cerr << "ERROR - Illegal call to G4VSolid::ComputeDimensions()" << G4endl 142 message << "Illegal call to G4VSolid::Comp << 143 << " Method not overloaded by derived class !" << G4endl; 143 << "Method not overloaded by deriv << 144 G4Exception("G4VSolid::ComputeDimensions()", "NotApplicable", 144 G4Exception("G4VSolid::ComputeDimensions() << 145 FatalException, "Illegal call to case class."); 145 FatalException, message); << 146 } 146 } 147 147 148 ////////////////////////////////////////////// 148 ////////////////////////////////////////////////////////////////////////// 149 // 149 // 150 // Throw exception (warning) for solids not im 150 // Throw exception (warning) for solids not implementing the method 151 151 152 G4ThreeVector G4VSolid::GetPointOnSurface() co 152 G4ThreeVector G4VSolid::GetPointOnSurface() const 153 { 153 { 154 std::ostringstream message; << 154 G4cerr << "WARNING - G4VSolid::GetPointOnSurface()" << G4endl 155 message << "Not implemented for solid: " << 155 << " Not implemented for solid: " 156 << GetEntityType() << " !" << G4en << 156 << this->GetEntityType() << " !" << G4endl; 157 << "Returning origin."; << 157 G4Exception("G4VSolid::GetPointOnSurface()", "NotImplemented", 158 G4Exception("G4VSolid::GetPointOnSurface() << 158 JustWarning, "Not implemented for this solid ! Returning origin."); 159 JustWarning, message); << 159 return G4ThreeVector(0,0,0); 160 return {0,0,0}; << 161 } 160 } 162 161 163 ////////////////////////////////////////////// 162 ////////////////////////////////////////////////////////////////////////// 164 // 163 // 165 // Returns total number of constituents that w << 166 // of the solid. For non-Boolean solids the re << 167 << 168 G4int G4VSolid::GetNumOfConstituents() const << 169 { return 1; } << 170 << 171 ////////////////////////////////////////////// << 172 // << 173 // Returns true if the solid has only planar f << 174 << 175 G4bool G4VSolid::IsFaceted() const << 176 { return false; } << 177 << 178 ////////////////////////////////////////////// << 179 // << 180 // Dummy implementations ... 164 // Dummy implementations ... 181 165 182 const G4VSolid* G4VSolid::GetConstituentSolid( 166 const G4VSolid* G4VSolid::GetConstituentSolid(G4int) const 183 { return nullptr; } << 167 { return 0; } 184 168 185 G4VSolid* G4VSolid::GetConstituentSolid(G4int) 169 G4VSolid* G4VSolid::GetConstituentSolid(G4int) 186 { return nullptr; } << 170 { return 0; } 187 171 188 const G4DisplacedSolid* G4VSolid::GetDisplaced 172 const G4DisplacedSolid* G4VSolid::GetDisplacedSolidPtr() const 189 { return nullptr; } << 173 { return 0; } 190 174 191 G4DisplacedSolid* G4VSolid::GetDisplacedSolidP << 175 G4DisplacedSolid* G4VSolid::GetDisplacedSolidPtr() 192 { return nullptr; } << 176 { return 0; } 193 177 194 ////////////////////////////////////////////// 178 //////////////////////////////////////////////////////////////// 195 // 179 // 196 // Returns an estimation of the solid volume i 180 // Returns an estimation of the solid volume in internal units. 197 // The number of statistics and error accuracy 181 // The number of statistics and error accuracy is fixed. 198 // This method may be overloaded by derived cl 182 // This method may be overloaded by derived classes to compute the 199 // exact geometrical quantity for solids where 183 // exact geometrical quantity for solids where this is possible. 200 // or anyway to cache the computed value. 184 // or anyway to cache the computed value. 201 // This implementation does NOT cache the comp 185 // This implementation does NOT cache the computed value. 202 186 203 G4double G4VSolid::GetCubicVolume() 187 G4double G4VSolid::GetCubicVolume() 204 { 188 { 205 G4int cubVolStatistics = 1000000; 189 G4int cubVolStatistics = 1000000; 206 G4double cubVolEpsilon = 0.001; 190 G4double cubVolEpsilon = 0.001; 207 return EstimateCubicVolume(cubVolStatistics, 191 return EstimateCubicVolume(cubVolStatistics, cubVolEpsilon); 208 } 192 } 209 193 210 ////////////////////////////////////////////// 194 //////////////////////////////////////////////////////////////// 211 // 195 // 212 // Calculate cubic volume based on Inside() me 196 // Calculate cubic volume based on Inside() method. 213 // Accuracy is limited by the second argument 197 // Accuracy is limited by the second argument or the statistics 214 // expressed by the first argument. 198 // expressed by the first argument. 215 // Implementation is courtesy of Vasiliki Desp 199 // Implementation is courtesy of Vasiliki Despoina Mitsou, 216 // University of Athens. 200 // University of Athens. 217 201 218 G4double G4VSolid::EstimateCubicVolume(G4int n 202 G4double G4VSolid::EstimateCubicVolume(G4int nStat, G4double epsilon) const 219 { 203 { 220 G4int iInside=0; 204 G4int iInside=0; 221 G4double px,py,pz,minX,maxX,minY,maxY,minZ,m << 205 G4double px,py,pz,minX,maxX,minY,maxY,minZ,maxZ,volume; >> 206 G4bool yesno; 222 G4ThreeVector p; 207 G4ThreeVector p; 223 EInside in; 208 EInside in; 224 209 225 // values needed for CalculateExtent signatu 210 // values needed for CalculateExtent signature 226 211 227 G4VoxelLimits limit; // Unlim 212 G4VoxelLimits limit; // Unlimited 228 G4AffineTransform origin; 213 G4AffineTransform origin; 229 214 230 // min max extents of pSolid along X,Y,Z 215 // min max extents of pSolid along X,Y,Z 231 216 232 CalculateExtent(kXAxis,limit,origin,minX,max << 217 yesno = this->CalculateExtent(kXAxis,limit,origin,minX,maxX); 233 CalculateExtent(kYAxis,limit,origin,minY,max << 218 yesno = this->CalculateExtent(kYAxis,limit,origin,minY,maxY); 234 CalculateExtent(kZAxis,limit,origin,minZ,max << 219 yesno = this->CalculateExtent(kZAxis,limit,origin,minZ,maxZ); 235 220 236 // limits 221 // limits 237 222 238 if(nStat < 100) nStat = 100; 223 if(nStat < 100) nStat = 100; 239 if(epsilon > 0.01) epsilon = 0.01; 224 if(epsilon > 0.01) epsilon = 0.01; 240 halfepsilon = 0.5*epsilon; << 241 225 242 for(auto i = 0; i < nStat; ++i ) << 226 for(G4int i = 0; i < nStat; i++ ) 243 { 227 { 244 px = minX-halfepsilon+(maxX-minX+epsilon)* << 228 px = minX+(maxX-minX)*G4UniformRand(); 245 py = minY-halfepsilon+(maxY-minY+epsilon)* << 229 py = minY+(maxY-minY)*G4UniformRand(); 246 pz = minZ-halfepsilon+(maxZ-minZ+epsilon)* << 230 pz = minZ+(maxZ-minZ)*G4UniformRand(); 247 p = G4ThreeVector(px,py,pz); 231 p = G4ThreeVector(px,py,pz); 248 in = Inside(p); << 232 in = this->Inside(p); 249 if(in != kOutside) ++iInside; << 233 if(in != kOutside) iInside++; 250 } 234 } 251 volume = (maxX-minX+epsilon)*(maxY-minY+epsi << 235 volume = (maxX-minX)*(maxY-minY)*(maxZ-minZ)*iInside/nStat; 252 * (maxZ-minZ+epsilon)*iInside/nStat; << 253 return volume; 236 return volume; 254 } 237 } 255 238 256 ////////////////////////////////////////////// 239 //////////////////////////////////////////////////////////////// 257 // 240 // 258 // Returns an estimation of the solid surface 241 // Returns an estimation of the solid surface area in internal units. 259 // The number of statistics and error accuracy 242 // The number of statistics and error accuracy is fixed. 260 // This method may be overloaded by derived cl 243 // This method may be overloaded by derived classes to compute the 261 // exact geometrical quantity for solids where 244 // exact geometrical quantity for solids where this is possible. 262 // or anyway to cache the computed value. 245 // or anyway to cache the computed value. 263 // This implementation does NOT cache the comp 246 // This implementation does NOT cache the computed value. 264 247 265 G4double G4VSolid::GetSurfaceArea() 248 G4double G4VSolid::GetSurfaceArea() 266 { 249 { 267 G4int stat = 1000000; 250 G4int stat = 1000000; 268 G4double ell = -1.; 251 G4double ell = -1.; 269 return EstimateSurfaceArea(stat,ell); 252 return EstimateSurfaceArea(stat,ell); 270 } 253 } 271 254 272 ////////////////////////////////////////////// << 255 //////////////////////////////////////////////////////////////// 273 // 256 // 274 // Calculate surface area by estimating volume << 257 // Estimate surface area based on Inside(), DistanceToIn(), and 275 // surrounding the surface using Monte-Carlo m << 258 // DistanceToOut() methods. Accuracy is limited by the statistics 276 // Input parameters: << 259 // defined by the first argument. Implemented by Mikhail Kosov. 277 // nstat - statistics (number of random poi << 260 278 // eps - shell thinkness << 261 G4double G4VSolid::EstimateSurfaceArea(G4int nStat, G4double ell) const 279 << 262 { 280 G4double G4VSolid::EstimateSurfaceArea(G4int n << 263 G4int inside=0; 281 { << 264 G4double px,py,pz,minX,maxX,minY,maxY,minZ,maxZ,surf; 282 static const G4double s2 = 1./std::sqrt(2.); << 265 G4bool yesno; 283 static const G4double s3 = 1./std::sqrt(3.); << 266 G4ThreeVector p; 284 static const G4ThreeVector directions[64] = << 267 EInside in; >> 268 >> 269 // values needed for CalculateExtent signature >> 270 >> 271 G4VoxelLimits limit; // Unlimited >> 272 G4AffineTransform origin; >> 273 >> 274 // min max extents of pSolid along X,Y,Z >> 275 >> 276 yesno = this->CalculateExtent(kXAxis,limit,origin,minX,maxX); >> 277 yesno = this->CalculateExtent(kYAxis,limit,origin,minY,maxY); >> 278 yesno = this->CalculateExtent(kZAxis,limit,origin,minZ,maxZ); >> 279 >> 280 // limits >> 281 >> 282 if(nStat < 100) { nStat = 100; } >> 283 >> 284 G4double dX=maxX-minX; >> 285 G4double dY=maxY-minY; >> 286 G4double dZ=maxZ-minZ; >> 287 if(ell<=0.) // Automatic definition of skin thickness 285 { 288 { 286 G4ThreeVector( 0, 0, 0), G4ThreeVector( << 289 G4double minval=dX; 287 G4ThreeVector( 1, 0, 0), G4ThreeVector( << 290 if(dY<dX) { minval=dY; } 288 G4ThreeVector( 0, -1, 0), G4ThreeVector( << 291 if(dZ<minval) { minval=dZ; } 289 G4ThreeVector( s2, -s2, 0), G4ThreeVector( << 292 ell=.01*minval; 290 << 293 } 291 G4ThreeVector( 0, 1, 0), G4ThreeVector( << 294 292 G4ThreeVector( s2, s2, 0), G4ThreeVector( << 295 G4double dd=2*ell; 293 G4ThreeVector( 0, -1, 0), G4ThreeVector( << 296 minX-=ell; minY-=ell; minZ-=ell; dX+=dd; dY+=dd; dZ+=dd; 294 G4ThreeVector( 1, 0, 0), G4ThreeVector( << 297 295 << 298 for(G4int i = 0; i < nStat; i++ ) 296 G4ThreeVector( 0, 0, -1), G4ThreeVector( << 297 G4ThreeVector( s2, 0,-s2), G4ThreeVector( << 298 G4ThreeVector( 0,-s2,-s2), G4ThreeVector( << 299 G4ThreeVector( s3,-s3,-s3), G4ThreeVector( << 300 << 301 G4ThreeVector( 0, s2,-s2), G4ThreeVector( << 302 G4ThreeVector( s3, s3,-s3), G4ThreeVector( << 303 G4ThreeVector( 0, 0, -1), G4ThreeVector( << 304 G4ThreeVector( s2, 0,-s2), G4ThreeVector( << 305 << 306 G4ThreeVector( 0, 0, 1), G4ThreeVector( << 307 G4ThreeVector( s2, 0, s2), G4ThreeVector( << 308 G4ThreeVector( 0,-s2, s2), G4ThreeVector( << 309 G4ThreeVector( s3,-s3, s3), G4ThreeVector( << 310 << 311 G4ThreeVector( 0, s2, s2), G4ThreeVector( << 312 G4ThreeVector( s3, s3, s3), G4ThreeVector( << 313 G4ThreeVector( 0, 0, 1), G4ThreeVector( << 314 G4ThreeVector( s2, 0, s2), G4ThreeVector( << 315 << 316 G4ThreeVector( 0, 0, -1), G4ThreeVector( << 317 G4ThreeVector( 1, 0, 0), G4ThreeVector( << 318 G4ThreeVector( 0, -1, 0), G4ThreeVector( << 319 G4ThreeVector( s2, -s2, 0), G4ThreeVector( << 320 << 321 G4ThreeVector( 0, 1, 0), G4ThreeVector( << 322 G4ThreeVector( s2, s2, 0), G4ThreeVector( << 323 G4ThreeVector( 0, -1, 0), G4ThreeVector( << 324 G4ThreeVector( 1, 0, 0), G4ThreeVector( << 325 }; << 326 << 327 G4ThreeVector bmin, bmax; << 328 BoundingLimits(bmin, bmax); << 329 << 330 G4double dX = bmax.x() - bmin.x(); << 331 G4double dY = bmax.y() - bmin.y(); << 332 G4double dZ = bmax.z() - bmin.z(); << 333 << 334 // Define statistics and shell thickness << 335 // << 336 G4int npoints = (nstat < 1000) ? 1000 : nsta << 337 G4double coeff = 0.5 / std::cbrt(G4double(np << 338 G4double eps = (ell > 0) ? ell : coeff * std << 339 G4double del = 1.8 * eps; // shold be more t << 340 << 341 G4double minX = bmin.x() - eps; << 342 G4double minY = bmin.y() - eps; << 343 G4double minZ = bmin.z() - eps; << 344 << 345 G4double dd = 2. * eps; << 346 dX += dd; << 347 dY += dd; << 348 dZ += dd; << 349 << 350 // Calculate surface area << 351 // << 352 G4int icount = 0; << 353 for(auto i = 0; i < npoints; ++i) << 354 { 299 { 355 G4double px = minX + dX*G4QuickRand(); << 300 px = minX+dX*G4UniformRand(); 356 G4double py = minY + dY*G4QuickRand(); << 301 py = minY+dY*G4UniformRand(); 357 G4double pz = minZ + dZ*G4QuickRand(); << 302 pz = minZ+dZ*G4UniformRand(); 358 G4ThreeVector p = G4ThreeVector(px, py, p << 303 p = G4ThreeVector(px,py,pz); 359 EInside in = Inside(p); << 304 in = this->Inside(p); 360 G4double dist = 0; << 305 if(in != kOutside) 361 if (in == kInside) << 362 { << 363 if (DistanceToOut(p) >= eps) continue; << 364 G4int icase = 0; << 365 if (Inside(G4ThreeVector(px-del, py, pz) << 366 if (Inside(G4ThreeVector(px+del, py, pz) << 367 if (Inside(G4ThreeVector(px, py-del, pz) << 368 if (Inside(G4ThreeVector(px, py+del, pz) << 369 if (Inside(G4ThreeVector(px, py, pz-del) << 370 if (Inside(G4ThreeVector(px, py, pz+del) << 371 if (icase == 0) continue; << 372 G4ThreeVector v = directions[icase]; << 373 dist = DistanceToOut(p, v); << 374 G4ThreeVector n = SurfaceNormal(p + v*di << 375 dist *= v.dot(n); << 376 } << 377 else if (in == kOutside) << 378 { 306 { 379 if (DistanceToIn(p) >= eps) continue; << 307 if (DistanceToOut(p)<ell) { inside++; } 380 G4int icase = 0; << 381 if (Inside(G4ThreeVector(px-del, py, pz) << 382 if (Inside(G4ThreeVector(px+del, py, pz) << 383 if (Inside(G4ThreeVector(px, py-del, pz) << 384 if (Inside(G4ThreeVector(px, py+del, pz) << 385 if (Inside(G4ThreeVector(px, py, pz-del) << 386 if (Inside(G4ThreeVector(px, py, pz+del) << 387 if (icase == 0) continue; << 388 G4ThreeVector v = directions[icase]; << 389 dist = DistanceToIn(p, v); << 390 if (dist == kInfinity) continue; << 391 G4ThreeVector n = SurfaceNormal(p + v*di << 392 dist *= -(v.dot(n)); << 393 } 308 } 394 if (dist < eps) ++icount; << 309 else if(DistanceToIn(p)<ell) { inside++; } 395 } 310 } 396 return dX*dY*dZ*icount/npoints/dd; << 311 // @@ The conformal correction can be upgraded >> 312 surf = dX*dY*dZ*inside/dd/nStat; >> 313 return surf; 397 } 314 } 398 315 399 ////////////////////////////////////////////// 316 /////////////////////////////////////////////////////////////////////////// 400 // << 317 // 401 // Returns a pointer of a dynamically allocate 318 // Returns a pointer of a dynamically allocated copy of the solid. 402 // Returns NULL pointer with warning in case t 319 // Returns NULL pointer with warning in case the concrete solid does not 403 // implement this method. The caller has respo 320 // implement this method. The caller has responsibility for ownership. 404 // 321 // 405 322 406 G4VSolid* G4VSolid::Clone() const 323 G4VSolid* G4VSolid::Clone() const 407 { 324 { 408 std::ostringstream message; << 325 G4String ErrMessage = "Clone() method not implemented for type: " 409 message << "Clone() method not implemented f << 326 + GetEntityType() + "! Returning NULL pointer!"; 410 << GetEntityType() << "!" << G4endl << 327 G4Exception("G4VSolid::Clone()", "NotImplemented", 411 << "Returning NULL pointer!"; << 328 JustWarning, ErrMessage); 412 G4Exception("G4VSolid::Clone()", "GeomMgt100 << 329 return 0; 413 return nullptr; << 414 } 330 } 415 331 416 ////////////////////////////////////////////// 332 /////////////////////////////////////////////////////////////////////////// 417 // << 333 // 418 // Calculate the maximum and minimum extents o 334 // Calculate the maximum and minimum extents of the polygon described 419 // by the vertices: pSectionIndex->pSectionInd 335 // by the vertices: pSectionIndex->pSectionIndex+1-> 420 // pSectionIndex+2->pSection 336 // pSectionIndex+2->pSectionIndex+3->pSectionIndex 421 // in the List pVertices 337 // in the List pVertices 422 // 338 // 423 // If the minimum is <pMin pMin is set to the 339 // If the minimum is <pMin pMin is set to the new minimum 424 // If the maximum is >pMax pMax is set to the 340 // If the maximum is >pMax pMax is set to the new maximum 425 // 341 // 426 // No modifications are made to pVertices 342 // No modifications are made to pVertices 427 // 343 // 428 344 429 void G4VSolid::ClipCrossSection( G4Three 345 void G4VSolid::ClipCrossSection( G4ThreeVectorList* pVertices, 430 const G4int p 346 const G4int pSectionIndex, 431 const G4Voxel 347 const G4VoxelLimits& pVoxelLimit, 432 const EAxis p << 348 const EAxis pAxis, 433 G4doubl 349 G4double& pMin, G4double& pMax) const 434 { 350 { 435 351 436 G4ThreeVectorList polygon; 352 G4ThreeVectorList polygon; 437 polygon.reserve(4); 353 polygon.reserve(4); 438 polygon.push_back((*pVertices)[pSectionIndex 354 polygon.push_back((*pVertices)[pSectionIndex]); 439 polygon.push_back((*pVertices)[pSectionIndex 355 polygon.push_back((*pVertices)[pSectionIndex+1]); 440 polygon.push_back((*pVertices)[pSectionIndex 356 polygon.push_back((*pVertices)[pSectionIndex+2]); 441 polygon.push_back((*pVertices)[pSectionIndex 357 polygon.push_back((*pVertices)[pSectionIndex+3]); >> 358 // G4cout<<"ClipCrossSection: 0-1-2-3"<<G4endl; 442 CalculateClippedPolygonExtent(polygon,pVoxel 359 CalculateClippedPolygonExtent(polygon,pVoxelLimit,pAxis,pMin,pMax); 443 return; 360 return; 444 } 361 } 445 362 446 ////////////////////////////////////////////// 363 ////////////////////////////////////////////////////////////////////////////////// 447 // 364 // 448 // Calculate the maximum and minimum extents o 365 // Calculate the maximum and minimum extents of the polygons 449 // joining the CrossSections at pSectionIndex- 366 // joining the CrossSections at pSectionIndex->pSectionIndex+3 and 450 // pSectionIndex+ 367 // pSectionIndex+4->pSectionIndex7 451 // 368 // 452 // in the List pVertices, within the boundarie 369 // in the List pVertices, within the boundaries of the voxel limits pVoxelLimit 453 // 370 // 454 // If the minimum is <pMin pMin is set to the 371 // If the minimum is <pMin pMin is set to the new minimum 455 // If the maximum is >pMax pMax is set to the 372 // If the maximum is >pMax pMax is set to the new maximum 456 // 373 // 457 // No modifications are made to pVertices 374 // No modifications are made to pVertices 458 375 459 void G4VSolid::ClipBetweenSections( G4Thr 376 void G4VSolid::ClipBetweenSections( G4ThreeVectorList* pVertices, 460 const G4int 377 const G4int pSectionIndex, 461 const G4Vox 378 const G4VoxelLimits& pVoxelLimit, 462 const EAxis << 379 const EAxis pAxis, 463 G4dou 380 G4double& pMin, G4double& pMax) const 464 { 381 { 465 G4ThreeVectorList polygon; 382 G4ThreeVectorList polygon; 466 polygon.reserve(4); 383 polygon.reserve(4); 467 polygon.push_back((*pVertices)[pSectionIndex 384 polygon.push_back((*pVertices)[pSectionIndex]); 468 polygon.push_back((*pVertices)[pSectionIndex 385 polygon.push_back((*pVertices)[pSectionIndex+4]); 469 polygon.push_back((*pVertices)[pSectionIndex 386 polygon.push_back((*pVertices)[pSectionIndex+5]); 470 polygon.push_back((*pVertices)[pSectionIndex 387 polygon.push_back((*pVertices)[pSectionIndex+1]); >> 388 // G4cout<<"ClipBetweenSections: 0-4-5-1"<<G4endl; 471 CalculateClippedPolygonExtent(polygon,pVoxel 389 CalculateClippedPolygonExtent(polygon,pVoxelLimit,pAxis,pMin,pMax); 472 polygon.clear(); 390 polygon.clear(); 473 391 474 polygon.push_back((*pVertices)[pSectionIndex 392 polygon.push_back((*pVertices)[pSectionIndex+1]); 475 polygon.push_back((*pVertices)[pSectionIndex 393 polygon.push_back((*pVertices)[pSectionIndex+5]); 476 polygon.push_back((*pVertices)[pSectionIndex 394 polygon.push_back((*pVertices)[pSectionIndex+6]); 477 polygon.push_back((*pVertices)[pSectionIndex 395 polygon.push_back((*pVertices)[pSectionIndex+2]); >> 396 // G4cout<<"ClipBetweenSections: 1-5-6-2"<<G4endl; 478 CalculateClippedPolygonExtent(polygon,pVoxel 397 CalculateClippedPolygonExtent(polygon,pVoxelLimit,pAxis,pMin,pMax); 479 polygon.clear(); 398 polygon.clear(); 480 399 481 polygon.push_back((*pVertices)[pSectionIndex 400 polygon.push_back((*pVertices)[pSectionIndex+2]); 482 polygon.push_back((*pVertices)[pSectionIndex 401 polygon.push_back((*pVertices)[pSectionIndex+6]); 483 polygon.push_back((*pVertices)[pSectionIndex 402 polygon.push_back((*pVertices)[pSectionIndex+7]); 484 polygon.push_back((*pVertices)[pSectionIndex 403 polygon.push_back((*pVertices)[pSectionIndex+3]); >> 404 // G4cout<<"ClipBetweenSections: 2-6-7-3"<<G4endl; 485 CalculateClippedPolygonExtent(polygon,pVoxel 405 CalculateClippedPolygonExtent(polygon,pVoxelLimit,pAxis,pMin,pMax); 486 polygon.clear(); 406 polygon.clear(); 487 407 488 polygon.push_back((*pVertices)[pSectionIndex 408 polygon.push_back((*pVertices)[pSectionIndex+3]); 489 polygon.push_back((*pVertices)[pSectionIndex 409 polygon.push_back((*pVertices)[pSectionIndex+7]); 490 polygon.push_back((*pVertices)[pSectionIndex 410 polygon.push_back((*pVertices)[pSectionIndex+4]); 491 polygon.push_back((*pVertices)[pSectionIndex 411 polygon.push_back((*pVertices)[pSectionIndex]); >> 412 // G4cout<<"ClipBetweenSections: 3-7-4-0"<<G4endl; 492 CalculateClippedPolygonExtent(polygon,pVoxel 413 CalculateClippedPolygonExtent(polygon,pVoxelLimit,pAxis,pMin,pMax); 493 return; 414 return; 494 } 415 } 495 416 496 417 497 ////////////////////////////////////////////// 418 /////////////////////////////////////////////////////////////////////////////// 498 // 419 // 499 // Calculate the maximum and minimum extents o 420 // Calculate the maximum and minimum extents of the convex polygon pPolygon 500 // along the axis pAxis, within the limits pVo 421 // along the axis pAxis, within the limits pVoxelLimit 501 // 422 // 502 423 503 void 424 void 504 G4VSolid::CalculateClippedPolygonExtent(G4Thre 425 G4VSolid::CalculateClippedPolygonExtent(G4ThreeVectorList& pPolygon, 505 const G4Voxe 426 const G4VoxelLimits& pVoxelLimit, 506 const EAxis << 427 const EAxis pAxis, 507 G4doub 428 G4double& pMin, 508 G4doub 429 G4double& pMax) const 509 { 430 { 510 G4int noLeft,i; 431 G4int noLeft,i; 511 G4double component; 432 G4double component; 512 << 433 /* >> 434 G4cout<<G4endl; >> 435 for(i = 0 ; i < pPolygon.size() ; i++ ) >> 436 { >> 437 G4cout << i << "\t" >> 438 << "p.x = " << pPolygon[i].operator()(pAxis) << "\t" >> 439 // << "p.y = " << pPolygon[i].y() << "\t" >> 440 // << "p.z = " << pPolygon[i].z() << "\t" >> 441 << G4endl; >> 442 } >> 443 G4cout<<G4endl; >> 444 */ 513 ClipPolygon(pPolygon,pVoxelLimit,pAxis); 445 ClipPolygon(pPolygon,pVoxelLimit,pAxis); 514 noLeft = (G4int)pPolygon.size(); << 446 noLeft = pPolygon.size(); 515 447 516 if ( noLeft != 0 ) << 448 if ( noLeft ) 517 { 449 { 518 for (i=0; i<noLeft; ++i) << 450 // G4cout<<G4endl; >> 451 for (i=0;i<noLeft;i++) 519 { 452 { 520 component = pPolygon[i].operator()(pAxis 453 component = pPolygon[i].operator()(pAxis); 521 << 454 // G4cout <<i<<"\t"<<component<<G4endl; 522 if (component < pMin) << 455 523 { << 456 if (component < pMin) 524 pMin = component; << 457 { >> 458 // G4cout <<i<<"\t"<<"Pmin = "<<component<<G4endl; >> 459 pMin = component; 525 } 460 } 526 if (component > pMax) 461 if (component > pMax) 527 { << 462 { 528 pMax = component; << 463 // G4cout <<i<<"\t"<<"PMax = "<<component<<G4endl; 529 } << 464 pMax = component; >> 465 } 530 } 466 } >> 467 // G4cout<<G4endl; 531 } 468 } >> 469 // G4cout<<"pMin = "<<pMin<<"\t"<<"pMax = "<<pMax<<G4endl; 532 } 470 } 533 471 534 ////////////////////////////////////////////// 472 ///////////////////////////////////////////////////////////////////////////// 535 // 473 // 536 // Clip the convex polygon described by the ve 474 // Clip the convex polygon described by the vertices at 537 // pSectionIndex ->pSectionIndex+3 within pVer 475 // pSectionIndex ->pSectionIndex+3 within pVertices to the limits pVoxelLimit 538 // 476 // 539 // Set pMin to the smallest 477 // Set pMin to the smallest 540 // 478 // 541 // Calculate the extent of the polygon along p 479 // Calculate the extent of the polygon along pAxis, when clipped to the 542 // limits pVoxelLimit. If the polygon exists a 480 // limits pVoxelLimit. If the polygon exists after clippin, set pMin to 543 // the polygon's minimum extent along the axis 481 // the polygon's minimum extent along the axis if <pMin, and set pMax to 544 // the polygon's maximum extent along the axis 482 // the polygon's maximum extent along the axis if >pMax. 545 // 483 // 546 // The polygon is described by a set of vector 484 // The polygon is described by a set of vectors, where each vector represents 547 // a vertex, so that the polygon is described 485 // a vertex, so that the polygon is described by the vertex sequence: 548 // 0th->1st 1st->2nd 2nd->... nth->0th 486 // 0th->1st 1st->2nd 2nd->... nth->0th 549 // 487 // 550 // Modifications to the polygon are made 488 // Modifications to the polygon are made 551 // 489 // 552 // NOTE: Execessive copying during clipping 490 // NOTE: Execessive copying during clipping 553 491 554 void G4VSolid::ClipPolygon( G4ThreeVector 492 void G4VSolid::ClipPolygon( G4ThreeVectorList& pPolygon, 555 const G4VoxelLimits 493 const G4VoxelLimits& pVoxelLimit, 556 const EAxis 494 const EAxis ) const 557 { 495 { 558 G4ThreeVectorList outputPolygon; 496 G4ThreeVectorList outputPolygon; 559 497 560 if ( pVoxelLimit.IsLimited() ) 498 if ( pVoxelLimit.IsLimited() ) 561 { 499 { 562 if (pVoxelLimit.IsXLimited() ) // && pAxis 500 if (pVoxelLimit.IsXLimited() ) // && pAxis != kXAxis) 563 { 501 { 564 G4VoxelLimits simpleLimit1; 502 G4VoxelLimits simpleLimit1; 565 simpleLimit1.AddLimit(kXAxis,pVoxelLimit 503 simpleLimit1.AddLimit(kXAxis,pVoxelLimit.GetMinXExtent(),kInfinity); >> 504 // G4cout<<"MinXExtent()"<<G4endl; 566 ClipPolygonToSimpleLimits(pPolygon,outpu 505 ClipPolygonToSimpleLimits(pPolygon,outputPolygon,simpleLimit1); 567 << 506 568 pPolygon.clear(); 507 pPolygon.clear(); 569 508 570 if ( outputPolygon.empty() ) return; << 509 if ( !outputPolygon.size() ) return; 571 510 572 G4VoxelLimits simpleLimit2; 511 G4VoxelLimits simpleLimit2; >> 512 // G4cout<<"MaxXExtent()"<<G4endl; 573 simpleLimit2.AddLimit(kXAxis,-kInfinity, 513 simpleLimit2.AddLimit(kXAxis,-kInfinity,pVoxelLimit.GetMaxXExtent()); 574 ClipPolygonToSimpleLimits(outputPolygon, 514 ClipPolygonToSimpleLimits(outputPolygon,pPolygon,simpleLimit2); 575 515 576 if ( pPolygon.empty() ) return; << 516 if ( !pPolygon.size() ) return; 577 else outputPoly 517 else outputPolygon.clear(); 578 } 518 } 579 if ( pVoxelLimit.IsYLimited() ) // && pAxi 519 if ( pVoxelLimit.IsYLimited() ) // && pAxis != kYAxis) 580 { 520 { 581 G4VoxelLimits simpleLimit1; 521 G4VoxelLimits simpleLimit1; 582 simpleLimit1.AddLimit(kYAxis,pVoxelLimit 522 simpleLimit1.AddLimit(kYAxis,pVoxelLimit.GetMinYExtent(),kInfinity); 583 ClipPolygonToSimpleLimits(pPolygon,outpu 523 ClipPolygonToSimpleLimits(pPolygon,outputPolygon,simpleLimit1); 584 524 585 // Must always clear pPolygon - for clip 525 // Must always clear pPolygon - for clip to simpleLimit2 and in case of 586 // early exit 526 // early exit 587 527 588 pPolygon.clear(); 528 pPolygon.clear(); 589 529 590 if ( outputPolygon.empty() ) return; << 530 if ( !outputPolygon.size() ) return; 591 531 592 G4VoxelLimits simpleLimit2; 532 G4VoxelLimits simpleLimit2; 593 simpleLimit2.AddLimit(kYAxis,-kInfinity, 533 simpleLimit2.AddLimit(kYAxis,-kInfinity,pVoxelLimit.GetMaxYExtent()); 594 ClipPolygonToSimpleLimits(outputPolygon, 534 ClipPolygonToSimpleLimits(outputPolygon,pPolygon,simpleLimit2); 595 535 596 if ( pPolygon.empty() ) return; << 536 if ( !pPolygon.size() ) return; 597 else outputPoly 537 else outputPolygon.clear(); 598 } 538 } 599 if ( pVoxelLimit.IsZLimited() ) // && pAxi 539 if ( pVoxelLimit.IsZLimited() ) // && pAxis != kZAxis) 600 { 540 { 601 G4VoxelLimits simpleLimit1; 541 G4VoxelLimits simpleLimit1; 602 simpleLimit1.AddLimit(kZAxis,pVoxelLimit 542 simpleLimit1.AddLimit(kZAxis,pVoxelLimit.GetMinZExtent(),kInfinity); 603 ClipPolygonToSimpleLimits(pPolygon,outpu 543 ClipPolygonToSimpleLimits(pPolygon,outputPolygon,simpleLimit1); 604 544 605 // Must always clear pPolygon - for clip 545 // Must always clear pPolygon - for clip to simpleLimit2 and in case of 606 // early exit 546 // early exit 607 547 608 pPolygon.clear(); 548 pPolygon.clear(); 609 549 610 if ( outputPolygon.empty() ) return; << 550 if ( !outputPolygon.size() ) return; 611 551 612 G4VoxelLimits simpleLimit2; 552 G4VoxelLimits simpleLimit2; 613 simpleLimit2.AddLimit(kZAxis,-kInfinity, 553 simpleLimit2.AddLimit(kZAxis,-kInfinity,pVoxelLimit.GetMaxZExtent()); 614 ClipPolygonToSimpleLimits(outputPolygon, 554 ClipPolygonToSimpleLimits(outputPolygon,pPolygon,simpleLimit2); 615 555 616 // Return after final clip - no cleanup 556 // Return after final clip - no cleanup 617 } 557 } 618 } 558 } 619 } 559 } 620 560 621 ////////////////////////////////////////////// 561 //////////////////////////////////////////////////////////////////////////// 622 // 562 // 623 // pVoxelLimits must be only limited along one 563 // pVoxelLimits must be only limited along one axis, and either the maximum 624 // along the axis must be +kInfinity, or the m 564 // along the axis must be +kInfinity, or the minimum -kInfinity 625 565 626 void 566 void 627 G4VSolid::ClipPolygonToSimpleLimits( G4ThreeVe 567 G4VSolid::ClipPolygonToSimpleLimits( G4ThreeVectorList& pPolygon, 628 G4ThreeVe 568 G4ThreeVectorList& outputPolygon, 629 const G4VoxelLi 569 const G4VoxelLimits& pVoxelLimit ) const 630 { 570 { 631 G4int i; 571 G4int i; 632 auto noVertices = (G4int)pPolygon.size(); << 572 G4int noVertices=pPolygon.size(); 633 G4ThreeVector vEnd,vStart; 573 G4ThreeVector vEnd,vStart; 634 574 635 for (i = 0 ; i < noVertices ; ++i ) << 575 for (i = 0 ; i < noVertices ; i++ ) 636 { 576 { 637 vStart = pPolygon[i]; 577 vStart = pPolygon[i]; >> 578 // G4cout << "i = " << i << G4endl; 638 if ( i == noVertices-1 ) vEnd = pPolygo 579 if ( i == noVertices-1 ) vEnd = pPolygon[0]; 639 else vEnd = pPolygo 580 else vEnd = pPolygon[i+1]; 640 581 641 if ( pVoxelLimit.Inside(vStart) ) 582 if ( pVoxelLimit.Inside(vStart) ) 642 { 583 { 643 if (pVoxelLimit.Inside(vEnd)) 584 if (pVoxelLimit.Inside(vEnd)) 644 { 585 { 645 // vStart and vEnd inside -> output en 586 // vStart and vEnd inside -> output end point 646 // 587 // 647 outputPolygon.push_back(vEnd); 588 outputPolygon.push_back(vEnd); 648 } 589 } 649 else 590 else 650 { 591 { 651 // vStart inside, vEnd outside -> outp 592 // vStart inside, vEnd outside -> output crossing point 652 // 593 // >> 594 // G4cout << "vStart inside, vEnd outside" << G4endl; 653 pVoxelLimit.ClipToLimits(vStart,vEnd); 595 pVoxelLimit.ClipToLimits(vStart,vEnd); 654 outputPolygon.push_back(vEnd); 596 outputPolygon.push_back(vEnd); 655 } << 597 } 656 } 598 } 657 else 599 else 658 { 600 { 659 if (pVoxelLimit.Inside(vEnd)) 601 if (pVoxelLimit.Inside(vEnd)) 660 { 602 { 661 // vStart outside, vEnd inside -> outp 603 // vStart outside, vEnd inside -> output inside section 662 // 604 // >> 605 // G4cout << "vStart outside, vEnd inside" << G4endl; 663 pVoxelLimit.ClipToLimits(vStart,vEnd); 606 pVoxelLimit.ClipToLimits(vStart,vEnd); 664 outputPolygon.push_back(vStart); 607 outputPolygon.push_back(vStart); 665 outputPolygon.push_back(vEnd); << 608 outputPolygon.push_back(vEnd); 666 } 609 } 667 else // Both point outside -> no output 610 else // Both point outside -> no output 668 { 611 { 669 // outputPolygon.push_back(vStart); 612 // outputPolygon.push_back(vStart); 670 // outputPolygon.push_back(vEnd); << 613 // outputPolygon.push_back(vEnd); 671 } 614 } 672 } 615 } 673 } 616 } 674 } 617 } 675 618 676 ////////////////////////////////////////////// << 619 G4VisExtent G4VSolid::GetExtent () const 677 // << 678 // Throw exception (warning) for solids not im << 679 << 680 void G4VSolid::BoundingLimits(G4ThreeVector& p << 681 { << 682 std::ostringstream message; << 683 message << "Not implemented for solid: " << 684 << GetEntityType() << " !" << 685 << "\nReturning infinite boundinx bo << 686 G4Exception("G4VSolid::BoundingLimits()", "G << 687 JustWarning, message); << 688 << 689 pMin.set(-kInfinity,-kInfinity,-kInfinity); << 690 pMax.set( kInfinity, kInfinity, kInfinity); << 691 } << 692 << 693 ////////////////////////////////////////////// << 694 // << 695 // Get G4VisExtent - bounding box for graphics << 696 << 697 G4VisExtent G4VSolid::GetExtent () const << 698 { 620 { 699 G4VisExtent extent; 621 G4VisExtent extent; 700 G4VoxelLimits voxelLimits; // Defaults to " 622 G4VoxelLimits voxelLimits; // Defaults to "infinite" limits. 701 G4AffineTransform affineTransform; 623 G4AffineTransform affineTransform; 702 G4double vmin, vmax; 624 G4double vmin, vmax; 703 CalculateExtent(kXAxis,voxelLimits,affineTra 625 CalculateExtent(kXAxis,voxelLimits,affineTransform,vmin,vmax); 704 extent.SetXmin (vmin); 626 extent.SetXmin (vmin); 705 extent.SetXmax (vmax); 627 extent.SetXmax (vmax); 706 CalculateExtent(kYAxis,voxelLimits,affineTra 628 CalculateExtent(kYAxis,voxelLimits,affineTransform,vmin,vmax); 707 extent.SetYmin (vmin); 629 extent.SetYmin (vmin); 708 extent.SetYmax (vmax); 630 extent.SetYmax (vmax); 709 CalculateExtent(kZAxis,voxelLimits,affineTra 631 CalculateExtent(kZAxis,voxelLimits,affineTransform,vmin,vmax); 710 extent.SetZmin (vmin); 632 extent.SetZmin (vmin); 711 extent.SetZmax (vmax); 633 extent.SetZmax (vmax); 712 return extent; 634 return extent; 713 } 635 } 714 636 715 G4Polyhedron* G4VSolid::CreatePolyhedron () co 637 G4Polyhedron* G4VSolid::CreatePolyhedron () const 716 { 638 { 717 return nullptr; << 639 return 0; >> 640 } >> 641 >> 642 G4NURBS* G4VSolid::CreateNURBS () const >> 643 { >> 644 return 0; 718 } 645 } 719 646 720 G4Polyhedron* G4VSolid::GetPolyhedron () const 647 G4Polyhedron* G4VSolid::GetPolyhedron () const 721 { 648 { 722 return nullptr; << 649 return 0; 723 } 650 } 724 651