Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // class G4AuxiliaryNavServices Inline implementation 27 // 28 // -------------------------------------------------------------------- 29 30 inline G4bool 31 G4AuxiliaryNavServices:: 32 CheckPointOnSurface( const G4VSolid* sampleSolid, 33 const G4ThreeVector& localPoint, 34 const G4ThreeVector* globalDirection, 35 const G4AffineTransform& sampleTransform, 36 const G4bool locatedOnEdge) 37 { 38 G4ThreeVector localDirection, sampleNormal; 39 G4bool enter = false; 40 41 EInside insideSolid = sampleSolid->Inside(localPoint); 42 if ( insideSolid!=kOutside ) 43 { 44 G4bool checkDirection = locatedOnEdge && (globalDirection!=nullptr); 45 if( (insideSolid==kSurface) && checkDirection) 46 { 47 // We are probably located on an edge. 48 // 49 localDirection = sampleTransform.TransformAxis(*globalDirection); 50 51 // Check whether we enter the volume 52 // 53 sampleNormal = sampleSolid->SurfaceNormal(localPoint); 54 55 G4double dotProd = sampleNormal.dot(localDirection); 56 57 #ifdef G4DEBUG_AUX_NAVIGATION 58 G4cout << " dir.norm= " << dotProd // sampleNormal.dot(localDirection) 59 << " localDirection= " << localDirection 60 << " sampleNormal= " << sampleNormal; 61 if( dotProd == 0.0 ) 62 { 63 G4cout << " distanceToIn = " 64 << sampleSolid->DistanceToIn( localPoint, localDirection ); 65 } 66 #endif 67 68 if ( dotProd <= 0.0 ) 69 { 70 if( dotProd == 0.0 ) 71 { 72 // We can't decide yet, let's make sure we're entering the solid. 73 // If by a confusion we entered the next solid we find out now 74 // whether to leave or to enter. 75 // This happens when we're on the surface or edge shared by two 76 // solids 77 // 78 G4double distanceToIn = 79 sampleSolid->DistanceToIn( localPoint, localDirection ); 80 if( distanceToIn != kInfinity ) 81 { 82 enter = true; 83 } 84 } 85 else 86 { 87 enter = true; 88 } 89 } 90 } 91 else 92 { 93 enter = true; 94 } 95 } 96 #ifdef G4DEBUG_AUX_NAVIGATION 97 G4cout << " enter = " << (enter ? "true" : "false" ) << G4endl; 98 #endif 99 100 return enter; 101 } 102 103 // -------------------------------------------------------------------- 104 105 inline G4bool 106 G4AuxiliaryNavServices:: 107 CheckPointExiting( const G4VSolid* sampleSolid, 108 const G4ThreeVector& localPoint, 109 const G4ThreeVector* globalDirection, 110 const G4AffineTransform& sampleTransform ) 111 { 112 if( globalDirection == nullptr ) { return false; } 113 114 G4ThreeVector localDirection, sampleNormal; 115 G4bool exiting = false; 116 117 EInside insideSolid = sampleSolid->Inside(localPoint); 118 if( insideSolid==kSurface ) 119 { 120 localDirection = sampleTransform.TransformAxis(*globalDirection); 121 122 // Check whether we are exiting the volume 123 // 124 sampleNormal = sampleSolid->SurfaceNormal(localPoint); 125 if ( sampleNormal.dot(localDirection) >= 0 ) 126 { 127 if( sampleNormal.dot(localDirection) == 0 ) 128 { 129 // We can't decide yet, let's make sure we're entering the solid. 130 // If by a confusion we entered the next solid we find out now 131 // whether to leave or to exiting. 132 // This happens when we're on the surface or edge shared by two 133 // solids 134 // 135 G4double distanceToIn = 136 sampleSolid->DistanceToIn( localPoint, localDirection ); 137 if( distanceToIn != kInfinity ) 138 { 139 exiting = true; 140 } 141 } 142 else 143 { 144 exiting = true; 145 } 146 } 147 } 148 return exiting; 149 } 150