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 // G4PolyPhiFace 27 // 28 // Class description: 29 // 30 // Definition of a face that bounds a polyco 31 // it has a phi opening: 32 // 33 // G4PolyPhiFace( const G4ReduciblePolygon* 34 // G4double phi, 35 // G4double deltaPhi, 36 // G4double phiOther ) 37 // 38 // Specifically: a face that lies on a plane 39 // the z axis. It has boundaries that are st 40 // length and direction, but with corners aw 41 // the z axis. 42 43 // Author: David C. Williams (davidw@scipp.ucs 44 // ------------------------------------------- 45 #ifndef G4POLYPHIFACE_HH 46 #define G4POLYPHIFACE_HH 1 47 48 #include "G4VCSGface.hh" 49 #include "G4TwoVector.hh" 50 51 class G4ReduciblePolygon; 52 53 struct G4PolyPhiFaceVertex 54 { 55 G4double x, y, r, z; // position 56 G4double rNorm, 57 zNorm; // r/z normal 58 G4ThreeVector norm3D; // 3D normal 59 60 // Needed for Triangulation Algorithm 61 // 62 G4bool ear; 63 G4PolyPhiFaceVertex *next,*prev; 64 }; 65 66 struct G4PolyPhiFaceEdge 67 { 68 G4PolyPhiFaceEdge() = default; 69 G4PolyPhiFaceVertex *v0{nullptr}, *v1{nullp 70 G4double tr{.0}, tz{0.}, // Unit vect 71 length{0.}; // Length of 72 G4ThreeVector norm3D; // 3D edge n 73 }; 74 75 class G4PolyPhiFace : public G4VCSGface 76 { 77 78 public: 79 80 G4PolyPhiFace( const G4ReduciblePolygon* r 81 G4double phi, G4doubl 82 // Constructor. 83 // Points r,z should be supplied in cloc 84 // For example: 85 // [1]---------[2] 86 // | | 87 // | | 88 // [0]---------[3] 89 90 ~G4PolyPhiFace() override; 91 // Destructor. Removes edges and corners 92 93 G4PolyPhiFace( const G4PolyPhiFace &source 94 G4PolyPhiFace& operator=( const G4PolyPhiF 95 // Copy constructor and assgnment operat 96 97 G4bool Intersect( const G4ThreeVector& p, 98 G4bool outgoing, G 99 G4double& distance 100 G4ThreeVector& nor 101 102 G4double Distance( const G4ThreeVector& p, 103 104 EInside Inside( const G4ThreeVector& p, G4 105 G4double* bestDistan 106 107 G4ThreeVector Normal( const G4ThreeVector& 108 G4double* best 109 110 G4double Extent( const G4ThreeVector axis 111 112 void CalculateExtent( const EAxis axis, 113 const G4VoxelLimits 114 const G4AffineTransf 115 G4SolidExtentL 116 117 inline G4VCSGface* Clone() override; 118 // Allocates on the heap a clone of this 119 120 G4double SurfaceArea() override; 121 G4double SurfaceTriangle( const G4ThreeVec 122 const G4ThreeVec 123 G4ThreeVector GetPointOnFace() override; 124 // Auxiliary methods for determination o 125 126 G4PolyPhiFace(__void__&); 127 // Fake default constructor for usage re 128 // persistency for clients requiring pre 129 // persistifiable objects. 130 131 void Diagnose( G4VSolid* solid ); 132 // Throw an exception if something is fo 133 // the solid. For debugging purposes onl 134 135 protected: 136 137 G4bool InsideEdgesExact( G4double r, G4dou 138 const G4ThreeVect 139 // Decide if the point in r,z is inside 140 // **but** do so consistently with other 141 142 G4bool InsideEdges( G4double r, G4double z 143 G4bool InsideEdges( G4double r, G4double z 144 G4PolyPhiFaceVertex** 145 G4ThreeVector** head3D 146 // Decide if the point in r,z is inside 147 148 inline G4double ExactZOrder( G4double z, 149 G4double qx, 150 const G4ThreeVector 151 G4double norm 152 const G4PolyPhiFace 153 // Decide precisely whether a trajectory 154 // or exactly passes through the z posit 155 156 void CopyStuff( const G4PolyPhiFace& sourc 157 158 // Functions used for Triangulation in Cas 159 // The triangulation is used for GetPointO 160 161 G4double Area2( const G4TwoVector& a, cons 162 // Calculation of 2*Area of Triangle wit 163 164 G4bool Left( const G4TwoVector& a, const G 165 G4bool LeftOn( const G4TwoVector& a, const 166 G4bool Collinear( const G4TwoVector& a, co 167 // Boolean functions for sign of Surface 168 169 G4bool IntersectProp( const G4TwoVector& a 170 const G4TwoVector& c 171 // Boolean function for finding proper i 172 // line segments (a,b) and (c,d). 173 174 G4bool Between( const G4TwoVector& a, cons 175 // Boolean function for determining if p 176 // where the three points (a,b,c) are on 177 178 G4bool Intersect( const G4TwoVector& a, co 179 const G4TwoVector& c, co 180 // Boolean function for finding proper i 181 // of two line segments (a,b) and (c,d). 182 183 G4bool Diagonalie( G4PolyPhiFaceVertex* a, 184 // Boolean Diagonalie help to determine 185 // of segment (a,b) is convex or reflex. 186 187 G4bool InCone( G4PolyPhiFaceVertex *a, G4P 188 // Boolean function for determining if b 189 // where a is the center of the cone. 190 191 G4bool Diagonal( G4PolyPhiFaceVertex* a, G 192 // Boolean function for determining if D 193 // inside Polycone or PolyHedra. 194 195 void EarInit(); 196 // Initialisation for Triangulisation by 197 // For details see "Computational Geomet 198 199 void Triangulate(); 200 // Triangularisation by ear tips for Pol 201 // For details see "Computational Geomet 202 // NOTE: a copy of the shape is made and 203 // order to have a list of triangl 204 // method GetPointOnFace(). 205 206 protected: 207 208 G4int numEdges = 0; // Number of edges 209 G4PolyPhiFaceEdge* edges = nullptr; 210 G4PolyPhiFaceVertex* corners = nullptr; 211 G4ThreeVector normal; // Normal uni 212 G4ThreeVector radial; // Unit vecto 213 G4ThreeVector surface; // Point on s 214 G4ThreeVector surface_point; // Auxiliary 215 // method Get 216 G4double rMin, rMax, // Extent in r 217 zMin, zMax; // Extent in z 218 G4bool allBehind = false; // True if the p 219 // is behind the 220 G4double kCarTolerance; // Surface th 221 G4double fSurfaceArea = 0.0; // Surface Ar 222 G4PolyPhiFaceVertex* triangles = nullptr; 223 // Auxiliary pointer to 'corners' used f 224 // Copy structure, changing the structur 225 }; 226 227 #include "G4PolyPhiFace.icc" 228 229 #endif 230