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