Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4SubtractionSolid Class Reference

#include <G4SubtractionSolid.hh>

+ Inheritance diagram for G4SubtractionSolid:

Public Member Functions

 G4SubtractionSolid (const G4String &pName, G4VSolid *pSolidA, G4VSolid *pSolidB)
 
 G4SubtractionSolid (const G4String &pName, G4VSolid *pSolidA, G4VSolid *pSolidB, G4RotationMatrix *rotMatrix, const G4ThreeVector &transVector)
 
 G4SubtractionSolid (const G4String &pName, G4VSolid *pSolidA, G4VSolid *pSolidB, const G4Transform3D &transform)
 
 ~G4SubtractionSolid () override
 
G4GeometryType GetEntityType () const override
 
G4VSolidClone () const override
 
 G4SubtractionSolid (__void__ &)
 
 G4SubtractionSolid (const G4SubtractionSolid &rhs)
 
G4SubtractionSolidoperator= (const G4SubtractionSolid &rhs)
 
void BoundingLimits (G4ThreeVector &pMin, G4ThreeVector &pMax) const override
 
G4bool CalculateExtent (const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pMin, G4double &pMax) const override
 
EInside Inside (const G4ThreeVector &p) const override
 
G4ThreeVector SurfaceNormal (const G4ThreeVector &p) const override
 
G4double DistanceToIn (const G4ThreeVector &p, const G4ThreeVector &v) const override
 
G4double DistanceToIn (const G4ThreeVector &p) const override
 
G4double DistanceToOut (const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=false, G4bool *validNorm=nullptr, G4ThreeVector *n=nullptr) const override
 
G4double DistanceToOut (const G4ThreeVector &p) const override
 
void ComputeDimensions (G4VPVParameterisation *p, const G4int n, const G4VPhysicalVolume *pRep) override
 
void DescribeYourselfTo (G4VGraphicsScene &scene) const override
 
G4PolyhedronCreatePolyhedron () const override
 
G4double GetCubicVolume () final
 
- Public Member Functions inherited from G4BooleanSolid
 G4BooleanSolid (const G4String &pName, G4VSolid *pSolidA, G4VSolid *pSolidB)
 
 G4BooleanSolid (const G4String &pName, G4VSolid *pSolidA, G4VSolid *pSolidB, G4RotationMatrix *rotMatrix, const G4ThreeVector &transVector)
 
 G4BooleanSolid (const G4String &pName, G4VSolid *pSolidA, G4VSolid *pSolidB, const G4Transform3D &transform)
 
 ~G4BooleanSolid () override
 
const G4VSolidGetConstituentSolid (G4int no) const override
 
G4VSolidGetConstituentSolid (G4int no) override
 
G4double GetSurfaceArea () override
 
G4PolyhedronGetPolyhedron () const override
 
std::ostream & StreamInfo (std::ostream &os) const override
 
G4int GetCubVolStatistics () const
 
G4double GetCubVolEpsilon () const
 
void SetCubVolStatistics (G4int st)
 
void SetCubVolEpsilon (G4double ep)
 
G4int GetAreaStatistics () const
 
G4double GetAreaAccuracy () const
 
void SetAreaStatistics (G4int st)
 
void SetAreaAccuracy (G4double ep)
 
G4ThreeVector GetPointOnSurface () const override
 
 G4BooleanSolid (__void__ &)
 
 G4BooleanSolid (const G4BooleanSolid &rhs)
 
G4BooleanSolidoperator= (const G4BooleanSolid &rhs)
 
- Public Member Functions inherited from G4VSolid
 G4VSolid (const G4String &name)
 
virtual ~G4VSolid ()
 
G4bool operator== (const G4VSolid &s) const
 
G4String GetName () const
 
void SetName (const G4String &name)
 
G4double GetTolerance () const
 
void DumpInfo () const
 
virtual G4VisExtent GetExtent () const
 
virtual const G4DisplacedSolidGetDisplacedSolidPtr () const
 
virtual G4DisplacedSolidGetDisplacedSolidPtr ()
 
 G4VSolid (__void__ &)
 
 G4VSolid (const G4VSolid &rhs)
 
G4VSolidoperator= (const G4VSolid &rhs)
 
G4double EstimateCubicVolume (G4int nStat, G4double epsilon) const
 
G4double EstimateSurfaceArea (G4int nStat, G4double ell) const
 

Additional Inherited Members

- Static Public Member Functions inherited from G4BooleanSolid
static void SetExternalBooleanProcessor (G4VBooleanProcessor *extProcessor)
 
static G4VBooleanProcessorGetExternalBooleanProcessor ()
 
- Protected Member Functions inherited from G4BooleanSolid
void GetListOfPrimitives (std::vector< std::pair< G4VSolid *, G4Transform3D > > &, const G4Transform3D &) const
 
G4PolyhedronStackPolyhedron (HepPolyhedronProcessor &, const G4VSolid *) const
 
- Protected Member Functions inherited from G4VSolid
void CalculateClippedPolygonExtent (G4ThreeVectorList &pPolygon, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
 
void ClipCrossSection (G4ThreeVectorList *pVertices, const G4int pSectionIndex, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
 
void ClipBetweenSections (G4ThreeVectorList *pVertices, const G4int pSectionIndex, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
 
void ClipPolygon (G4ThreeVectorList &pPolygon, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis) const
 
- Protected Attributes inherited from G4BooleanSolid
G4VSolidfPtrSolidA = nullptr
 
G4VSolidfPtrSolidB = nullptr
 
G4double fCubicVolume = -1.0
 
G4double fSurfaceArea = -1.0
 
- Protected Attributes inherited from G4VSolid
G4double kCarTolerance
 
- Static Protected Attributes inherited from G4BooleanSolid
static G4VBooleanProcessorfExternalBoolProcessor = nullptr
 

Detailed Description

Definition at line 46 of file G4SubtractionSolid.hh.

Constructor & Destructor Documentation

◆ G4SubtractionSolid() [1/5]

G4SubtractionSolid::G4SubtractionSolid ( const G4String & pName,
G4VSolid * pSolidA,
G4VSolid * pSolidB )

Definition at line 54 of file G4SubtractionSolid.cc.

57 : G4BooleanSolid(pName,pSolidA,pSolidB)
58{
59}
G4BooleanSolid(const G4String &pName, G4VSolid *pSolidA, G4VSolid *pSolidB)

Referenced by Clone().

◆ G4SubtractionSolid() [2/5]

G4SubtractionSolid::G4SubtractionSolid ( const G4String & pName,
G4VSolid * pSolidA,
G4VSolid * pSolidB,
G4RotationMatrix * rotMatrix,
const G4ThreeVector & transVector )

Definition at line 65 of file G4SubtractionSolid.cc.

70 : G4BooleanSolid(pName,pSolidA,pSolidB,rotMatrix,transVector)
71{
72}

◆ G4SubtractionSolid() [3/5]

G4SubtractionSolid::G4SubtractionSolid ( const G4String & pName,
G4VSolid * pSolidA,
G4VSolid * pSolidB,
const G4Transform3D & transform )

Definition at line 78 of file G4SubtractionSolid.cc.

82 : G4BooleanSolid(pName,pSolidA,pSolidB,transform)
83{
84}

◆ ~G4SubtractionSolid()

G4SubtractionSolid::~G4SubtractionSolid ( )
overridedefault

◆ G4SubtractionSolid() [4/5]

G4SubtractionSolid::G4SubtractionSolid ( __void__ & a)

Definition at line 91 of file G4SubtractionSolid.cc.

93{
94}

◆ G4SubtractionSolid() [5/5]

G4SubtractionSolid::G4SubtractionSolid ( const G4SubtractionSolid & rhs)
default

Member Function Documentation

◆ BoundingLimits()

void G4SubtractionSolid::BoundingLimits ( G4ThreeVector & pMin,
G4ThreeVector & pMax ) const
overridevirtual

Reimplemented from G4VSolid.

Definition at line 131 of file G4SubtractionSolid.cc.

133{
134 // Since it is unclear how the shape of the first solid will be changed
135 // after subtraction, just return its original bounding box.
136 //
137 fPtrSolidA->BoundingLimits(pMin,pMax);
138
139 // Check correctness of the bounding box
140 //
141 if (pMin.x() >= pMax.x() || pMin.y() >= pMax.y() || pMin.z() >= pMax.z())
142 {
143 std::ostringstream message;
144 message << "Bad bounding box (min >= max) for solid: "
145 << GetName() << " !"
146 << "\npMin = " << pMin
147 << "\npMax = " << pMax;
148 G4Exception("G4SubtractionSolid::BoundingLimits()", "GeomMgt0001",
149 JustWarning, message);
150 DumpInfo();
151 }
152}
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
double z() const
double x() const
double y() const
G4VSolid * fPtrSolidA
G4String GetName() const
void DumpInfo() const
virtual void BoundingLimits(G4ThreeVector &pMin, G4ThreeVector &pMax) const
Definition G4VSolid.cc:665

◆ CalculateExtent()

G4bool G4SubtractionSolid::CalculateExtent ( const EAxis pAxis,
const G4VoxelLimits & pVoxelLimit,
const G4AffineTransform & pTransform,
G4double & pMin,
G4double & pMax ) const
overridevirtual

Implements G4VSolid.

Definition at line 159 of file G4SubtractionSolid.cc.

164{
165 // Since we cannot be sure how much the second solid subtracts
166 // from the first, we must use the first solid's extent!
167
168 return fPtrSolidA->CalculateExtent( pAxis, pVoxelLimit,
169 pTransform, pMin, pMax );
170}
virtual G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pMin, G4double &pMax) const =0

◆ Clone()

G4VSolid * G4SubtractionSolid::Clone ( ) const
overridevirtual

Reimplemented from G4VSolid.

Definition at line 531 of file G4SubtractionSolid.cc.

532{
533 return new G4SubtractionSolid(*this);
534}
G4SubtractionSolid(const G4String &pName, G4VSolid *pSolidA, G4VSolid *pSolidB)

◆ ComputeDimensions()

void G4SubtractionSolid::ComputeDimensions ( G4VPVParameterisation * p,
const G4int n,
const G4VPhysicalVolume * pRep )
overridevirtual

Reimplemented from G4VSolid.

Definition at line 541 of file G4SubtractionSolid.cc.

544{
545}

◆ CreatePolyhedron()

G4Polyhedron * G4SubtractionSolid::CreatePolyhedron ( ) const
overridevirtual

Reimplemented from G4VSolid.

Definition at line 561 of file G4SubtractionSolid.cc.

562{
563 if (fExternalBoolProcessor == nullptr)
564 {
565 HepPolyhedronProcessor processor;
566 // Stack components and components of components recursively
567 // See G4BooleanSolid::StackPolyhedron
568 G4Polyhedron* top = StackPolyhedron(processor, this);
569 auto result = new G4Polyhedron(*top);
570 if (processor.execute(*result))
571 {
572 return result;
573 }
574 else
575 {
576 return nullptr;
577 }
578 }
579 else
580 {
584 }
585}
G4Polyhedron * GetPolyhedron() const override
const G4VSolid * GetConstituentSolid(G4int no) const override
static G4VBooleanProcessor * fExternalBoolProcessor
G4Polyhedron * StackPolyhedron(HepPolyhedronProcessor &, const G4VSolid *) const
virtual G4PolyhedronArbitrary * Subtraction(G4Polyhedron *, G4Polyhedron *)
bool execute(HepPolyhedron &)

◆ DescribeYourselfTo()

void G4SubtractionSolid::DescribeYourselfTo ( G4VGraphicsScene & scene) const
overridevirtual

Implements G4VSolid.

Definition at line 552 of file G4SubtractionSolid.cc.

553{
554 scene.AddSolid (*this);
555}
virtual void AddSolid(const G4Box &)=0

◆ DistanceToIn() [1/2]

G4double G4SubtractionSolid::DistanceToIn ( const G4ThreeVector & p) const
overridevirtual

Implements G4VSolid.

Definition at line 403 of file G4SubtractionSolid.cc.

404{
405 G4double dist = 0.0;
406
407#ifdef G4BOOLDEBUG
408 if( Inside(p) == kInside )
409 {
410 G4cout << "WARNING - Invalid call in "
411 << "G4SubtractionSolid::DistanceToIn(p)" << G4endl
412 << " Point p is inside !" << G4endl;
413 G4cout << " p = " << p << G4endl;
414 G4cerr << "WARNING - Invalid call in "
415 << "G4SubtractionSolid::DistanceToIn(p)" << G4endl
416 << " Point p is inside !" << G4endl;
417 G4cerr << " p = " << p << G4endl;
418 }
419#endif
420
421 if( ( fPtrSolidA->Inside(p) != kOutside) && // case 1
422 ( fPtrSolidB->Inside(p) != kOutside) )
423 {
424 dist = fPtrSolidB->DistanceToOut(p);
425 }
426 else
427 {
428 dist = fPtrSolidA->DistanceToIn(p);
429 }
430
431 return dist;
432}
double G4double
Definition G4Types.hh:83
G4GLOB_DLL std::ostream G4cerr
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
G4VSolid * fPtrSolidB
EInside Inside(const G4ThreeVector &p) const override
virtual EInside Inside(const G4ThreeVector &p) const =0
virtual G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=false, G4bool *validNorm=nullptr, G4ThreeVector *n=nullptr) const =0
virtual G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const =0
@ kInside
Definition geomdefs.hh:70
@ kOutside
Definition geomdefs.hh:68

◆ DistanceToIn() [2/2]

G4double G4SubtractionSolid::DistanceToIn ( const G4ThreeVector & p,
const G4ThreeVector & v ) const
overridevirtual

Implements G4VSolid.

Definition at line 263 of file G4SubtractionSolid.cc.

265{
266 G4double dist = 0.0, dist2 = 0.0, disTmp = 0.0;
267
268#ifdef G4BOOLDEBUG
269 if( Inside(p) == kInside )
270 {
271 G4cout << "WARNING - Invalid call in "
272 << "G4SubtractionSolid::DistanceToIn(p,v)" << G4endl
273 << " Point p is inside !" << G4endl;
274 G4cout << " p = " << p << G4endl;
275 G4cout << " v = " << v << G4endl;
276 G4cerr << "WARNING - Invalid call in "
277 << "G4SubtractionSolid::DistanceToIn(p,v)" << G4endl
278 << " Point p is inside !" << G4endl;
279 G4cerr << " p = " << p << G4endl;
280 G4cerr << " v = " << v << G4endl;
281 }
282#endif
283
284 // if( // ( fPtrSolidA->Inside(p) != kOutside) && // case1:p in both A&B
285 if ( fPtrSolidB->Inside(p) != kOutside ) // start: out of B
286 {
287 dist = fPtrSolidB->DistanceToOut(p,v) ; // ,calcNorm,validNorm,n) ;
288
289 if( fPtrSolidA->Inside(p+dist*v) != kInside )
290 {
291 G4int count1=0;
292 do // Loop checking, 13.08.2015, G.Cosmo
293 {
294 disTmp = fPtrSolidA->DistanceToIn(p+dist*v,v) ;
295
296 if(disTmp == kInfinity)
297 {
298 return kInfinity ;
299 }
300 dist += disTmp ;
301
302 if( Inside(p+dist*v) == kOutside )
303 {
304 disTmp = fPtrSolidB->DistanceToOut(p+dist*v,v) ;
305 dist2 = dist+disTmp;
306 if (dist == dist2) { return dist; } // no progress
307 dist = dist2 ;
308 ++count1;
309 if( count1 > 1000 ) // Infinite loop detected
310 {
311 G4String nameB = fPtrSolidB->GetName();
312 if(fPtrSolidB->GetEntityType()=="G4DisplacedSolid")
313 {
314 nameB = (dynamic_cast<G4DisplacedSolid*>(fPtrSolidB))
315 ->GetConstituentMovedSolid()->GetName();
316 }
317 std::ostringstream message;
318 message << "Illegal condition caused by solids: "
319 << fPtrSolidA->GetName() << " and " << nameB << G4endl;
320 message.precision(16);
321 message << "Looping detected in point " << p+dist*v
322 << ", from original point " << p
323 << " and direction " << v << G4endl
324 << "Computed candidate distance: " << dist << "*mm. ";
325 message.precision(6);
326 DumpInfo();
327 G4Exception("G4SubtractionSolid::DistanceToIn(p,v)",
328 "GeomSolids1001", JustWarning, message,
329 "Returning candidate distance.");
330 return dist;
331 }
332 }
333 }
334 while( Inside(p+dist*v) == kOutside ) ;
335 }
336 }
337 else // p outside A, start in A
338 {
339 dist = fPtrSolidA->DistanceToIn(p,v) ;
340
341 if( dist == kInfinity ) // past A, hence past A\B
342 {
343 return kInfinity ;
344 }
345 else
346 {
347 G4int count2=0;
348 while( Inside(p+dist*v) == kOutside ) // pushing loop
349 {
350 disTmp = fPtrSolidB->DistanceToOut(p+dist*v,v) ;
351 dist += disTmp ;
352
353 if( Inside(p+dist*v) == kOutside )
354 {
355 disTmp = fPtrSolidA->DistanceToIn(p+dist*v,v) ;
356
357 if(disTmp == kInfinity) // past A, hence past A\B
358 {
359 return kInfinity ;
360 }
361 dist2 = dist+disTmp;
362 if (dist == dist2) { return dist; } // no progress
363 dist = dist2 ;
364 ++count2;
365 if( count2 > 1000 ) // Infinite loop detected
366 {
367 G4String nameB = fPtrSolidB->GetName();
368 if(fPtrSolidB->GetEntityType()=="G4DisplacedSolid")
369 {
370 nameB = (dynamic_cast<G4DisplacedSolid*>(fPtrSolidB))
371 ->GetConstituentMovedSolid()->GetName();
372 }
373 std::ostringstream message;
374 message << "Illegal condition caused by solids: "
375 << fPtrSolidA->GetName() << " and " << nameB << G4endl;
376 message.precision(16);
377 message << "Looping detected in point " << p+dist*v
378 << ", from original point " << p
379 << " and direction " << v << G4endl
380 << "Computed candidate distance: " << dist << "*mm. ";
381 message.precision(6);
382 DumpInfo();
383 G4Exception("G4SubtractionSolid::DistanceToIn(p,v)",
384 "GeomSolids1001", JustWarning, message,
385 "Returning candidate distance.");
386 return dist;
387 }
388 }
389 } // Loop checking, 13.08.2015, G.Cosmo
390 }
391 }
392
393 return dist ;
394}
int G4int
Definition G4Types.hh:85
virtual G4GeometryType GetEntityType() const =0

◆ DistanceToOut() [1/2]

G4double G4SubtractionSolid::DistanceToOut ( const G4ThreeVector & p) const
overridevirtual

Implements G4VSolid.

Definition at line 493 of file G4SubtractionSolid.cc.

494{
495 G4double dist=0.0;
496
497 if( Inside(p) == kOutside )
498 {
499#ifdef G4BOOLDEBUG
500 G4cout << "WARNING - Invalid call in "
501 << "G4SubtractionSolid::DistanceToOut(p)" << G4endl
502 << " Point p is outside" << G4endl;
503 G4cout << " p = " << p << G4endl;
504 G4cerr << "WARNING - Invalid call in "
505 << "G4SubtractionSolid::DistanceToOut(p)" << G4endl
506 << " Point p is outside" << G4endl;
507 G4cerr << " p = " << p << G4endl;
508#endif
509 }
510 else
511 {
512 dist= std::min(fPtrSolidA->DistanceToOut(p),
513 fPtrSolidB->DistanceToIn(p) ) ;
514 }
515 return dist;
516}

◆ DistanceToOut() [2/2]

G4double G4SubtractionSolid::DistanceToOut ( const G4ThreeVector & p,
const G4ThreeVector & v,
const G4bool calcNorm = false,
G4bool * validNorm = nullptr,
G4ThreeVector * n = nullptr ) const
overridevirtual

Implements G4VSolid.

Definition at line 439 of file G4SubtractionSolid.cc.

444{
445#ifdef G4BOOLDEBUG
446 if( Inside(p) == kOutside )
447 {
448 G4cout << "Position:" << G4endl << G4endl;
449 G4cout << "p.x() = " << p.x()/mm << " mm" << G4endl;
450 G4cout << "p.y() = " << p.y()/mm << " mm" << G4endl;
451 G4cout << "p.z() = " << p.z()/mm << " mm" << G4endl << G4endl;
452 G4cout << "Direction:" << G4endl << G4endl;
453 G4cout << "v.x() = " << v.x() << G4endl;
454 G4cout << "v.y() = " << v.y() << G4endl;
455 G4cout << "v.z() = " << v.z() << G4endl << G4endl;
456 G4cout << "WARNING - Invalid call in "
457 << "G4SubtractionSolid::DistanceToOut(p,v)" << G4endl
458 << " Point p is outside !" << G4endl;
459 G4cout << " p = " << p << G4endl;
460 G4cout << " v = " << v << G4endl;
461 G4cerr << "WARNING - Invalid call in "
462 << "G4SubtractionSolid::DistanceToOut(p,v)" << G4endl
463 << " Point p is outside !" << G4endl;
464 G4cerr << " p = " << p << G4endl;
465 G4cerr << " v = " << v << G4endl;
466 }
467#endif
468
469 G4double distout;
470 G4double distA = fPtrSolidA->DistanceToOut(p,v,calcNorm,validNorm,n) ;
471 G4double distB = fPtrSolidB->DistanceToIn(p,v) ;
472 if(distB < distA)
473 {
474 if(calcNorm)
475 {
476 *n = -(fPtrSolidB->SurfaceNormal(p+distB*v)) ;
477 *validNorm = false ;
478 }
479 distout= distB ;
480 }
481 else
482 {
483 distout= distA ;
484 }
485 return distout;
486}
virtual G4ThreeVector SurfaceNormal(const G4ThreeVector &p) const =0

◆ GetCubicVolume()

G4double G4SubtractionSolid::GetCubicVolume ( )
finalvirtual

Reimplemented from G4BooleanSolid.

Definition at line 592 of file G4SubtractionSolid.cc.

593{
594 if( fCubicVolume != -1.0 )
595 {
596 return fCubicVolume;
597 }
598
599 G4double cubVolumeA = fPtrSolidA->GetCubicVolume();
600
601 G4ThreeVector bminA, bmaxA, bminB, bmaxB;
602 fPtrSolidA->BoundingLimits(bminA, bmaxA);
603 fPtrSolidB->BoundingLimits(bminB, bmaxB);
604 G4double intersection = 0.;
605 G4bool canIntersect =
606 bminA.x() < bmaxB.x() && bminA.y() < bmaxB.y() && bminA.z() < bmaxB.z() &&
607 bminB.x() < bmaxA.x() && bminB.y() < bmaxA.y() && bminB.z() < bmaxA.z();
608 if ( canIntersect )
609 {
610 G4IntersectionSolid intersectVol( "Temporary-Intersection-for-Subtraction",
612 intersectVol.SetCubVolStatistics(100000);
613 intersection = intersectVol.GetCubicVolume();
614 }
615
616 fCubicVolume = cubVolumeA - intersection;
617 if (fCubicVolume < 0.01*cubVolumeA) fCubicVolume = G4VSolid::GetCubicVolume();
618
619 return fCubicVolume;
620}
bool G4bool
Definition G4Types.hh:86
virtual G4double GetCubicVolume()
Definition G4VSolid.cc:188

◆ GetEntityType()

G4GeometryType G4SubtractionSolid::GetEntityType ( ) const
overridevirtual

Reimplemented from G4BooleanSolid.

Definition at line 522 of file G4SubtractionSolid.cc.

523{
524 return {"G4SubtractionSolid"};
525}

◆ Inside()

EInside G4SubtractionSolid::Inside ( const G4ThreeVector & p) const
overridevirtual

Implements G4VSolid.

Definition at line 176 of file G4SubtractionSolid.cc.

177{
178 EInside positionA = fPtrSolidA->Inside(p);
179 if (positionA == kOutside) return positionA; // outside A
180
181 EInside positionB = fPtrSolidB->Inside(p);
182 if (positionB == kOutside) return positionA;
183
184 if (positionB == kInside) return kOutside;
185 if (positionA == kInside) return kSurface; // surface B
186
187 // Point is on both surfaces
188 //
189 static const G4double rtol = 1000*kCarTolerance;
190
191 return ((fPtrSolidA->SurfaceNormal(p) -
192 fPtrSolidB->SurfaceNormal(p)).mag2() > rtol) ? kSurface : kOutside;
193}
G4double kCarTolerance
Definition G4VSolid.hh:299
EInside
Definition geomdefs.hh:67
@ kSurface
Definition geomdefs.hh:69

Referenced by DistanceToIn(), DistanceToIn(), DistanceToOut(), DistanceToOut(), and SurfaceNormal().

◆ operator=()

G4SubtractionSolid & G4SubtractionSolid::operator= ( const G4SubtractionSolid & rhs)

Definition at line 113 of file G4SubtractionSolid.cc.

114{
115 // Check assignment to self
116 //
117 if (this == &rhs) { return *this; }
118
119 // Copy base class data
120 //
122
123 return *this;
124}
G4BooleanSolid & operator=(const G4BooleanSolid &rhs)

◆ SurfaceNormal()

G4ThreeVector G4SubtractionSolid::SurfaceNormal ( const G4ThreeVector & p) const
overridevirtual

Implements G4VSolid.

Definition at line 200 of file G4SubtractionSolid.cc.

201{
202 G4ThreeVector normal;
203
204 EInside InsideA = fPtrSolidA->Inside(p);
205 EInside InsideB = fPtrSolidB->Inside(p);
206
207 if( InsideA == kOutside )
208 {
209#ifdef G4BOOLDEBUG
210 G4cout << "WARNING - Invalid call [1] in "
211 << "G4SubtractionSolid::SurfaceNormal(p)" << G4endl
212 << " Point p is outside !" << G4endl;
213 G4cout << " p = " << p << G4endl;
214 G4cerr << "WARNING - Invalid call [1] in "
215 << "G4SubtractionSolid::SurfaceNormal(p)" << G4endl
216 << " Point p is outside !" << G4endl;
217 G4cerr << " p = " << p << G4endl;
218#endif
219 normal = fPtrSolidA->SurfaceNormal(p) ;
220 }
221 else if( InsideA == kSurface &&
222 InsideB != kInside )
223 {
224 normal = fPtrSolidA->SurfaceNormal(p) ;
225 }
226 else if( InsideA == kInside &&
227 InsideB != kOutside )
228 {
229 normal = -fPtrSolidB->SurfaceNormal(p) ;
230 }
231 else
232 {
234 {
235 normal = fPtrSolidA->SurfaceNormal(p) ;
236 }
237 else
238 {
239 normal = -fPtrSolidB->SurfaceNormal(p) ;
240 }
241#ifdef G4BOOLDEBUG
242 if(Inside(p) == kInside)
243 {
244 G4cout << "WARNING - Invalid call [2] in "
245 << "G4SubtractionSolid::SurfaceNormal(p)" << G4endl
246 << " Point p is inside !" << G4endl;
247 G4cout << " p = " << p << G4endl;
248 G4cerr << "WARNING - Invalid call [2] in "
249 << "G4SubtractionSolid::SurfaceNormal(p)" << G4endl
250 << " Point p is inside !" << G4endl;
251 G4cerr << " p = " << p << G4endl;
252 }
253#endif
254 }
255 return normal;
256}

The documentation for this class was generated from the following files: