Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer << 3 // * DISCLAIMER * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th << 5 // * The following disclaimer summarizes all the specific disclaimers * 6 // * the Geant4 Collaboration. It is provided << 6 // * of contributors to this software. The specific disclaimers,which * 7 // * conditions of the Geant4 Software License << 7 // * govern, are listed with their locations in: * 8 // * LICENSE and available at http://cern.ch/ << 8 // * http://cern.ch/geant4/license * 9 // * include a list of copyright holders. << 10 // * 9 // * * 11 // * Neither the authors of this software syst 10 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 11 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 12 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 13 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file << 14 // * use. * 16 // * for the full disclaimer and the limitatio << 17 // * 15 // * * 18 // * This code implementation is the result << 16 // * This code implementation is the intellectual property of the * 19 // * technical work of the GEANT4 collaboratio << 17 // * GEANT4 collaboration. * 20 // * By using, copying, modifying or distri << 18 // * By copying, distributing or modifying the Program (or any work * 21 // * any work based on the software) you ag << 19 // * based on the Program) you indicate your acceptance of this * 22 // * use in resulting scientific publicati << 20 // * statement, and all its terms. * 23 // * acceptance of all terms of the Geant4 Sof << 24 // ******************************************* 21 // ******************************************************************** 25 // 22 // >> 23 // >> 24 // $Id: G4PolyPhiFace.hh,v 1.8 2005/11/30 10:33:42 gcosmo Exp $ >> 25 // GEANT4 tag $Name: geant4-08-00 $ >> 26 // >> 27 // >> 28 // -------------------------------------------------------------------- >> 29 // GEANT 4 class header file >> 30 // >> 31 // 26 // G4PolyPhiFace 32 // G4PolyPhiFace 27 // 33 // 28 // Class description: 34 // Class description: 29 // 35 // 30 // Definition of a face that bounds a polyco 36 // Definition of a face that bounds a polycone or polyhedra when 31 // it has a phi opening: 37 // it has a phi opening: 32 // 38 // 33 // G4PolyPhiFace( const G4ReduciblePolygon* << 39 // G4PolyPhiFace( const G4ReduciblePolygon *rz, 34 // G4double phi, 40 // G4double phi, 35 // G4double deltaPhi, 41 // G4double deltaPhi, 36 // G4double phiOther ) 42 // G4double phiOther ) 37 // 43 // 38 // Specifically: a face that lies on a plane 44 // Specifically: a face that lies on a plane that passes through 39 // the z axis. It has boundaries that are st 45 // the z axis. It has boundaries that are straight lines of arbitrary 40 // length and direction, but with corners aw 46 // length and direction, but with corners aways on the same side of 41 // the z axis. 47 // the z axis. 42 48 43 // Author: David C. Williams (davidw@scipp.ucs << 49 // Author: >> 50 // David C. Williams (davidw@scipp.ucsc.edu) 44 // ------------------------------------------- 51 // -------------------------------------------------------------------- 45 #ifndef G4POLYPHIFACE_HH << 52 46 #define G4POLYPHIFACE_HH 1 << 53 #ifndef G4PolyPhiFace_hh >> 54 #define G4PolyPhiFace_hh 47 55 48 #include "G4VCSGface.hh" 56 #include "G4VCSGface.hh" 49 #include "G4TwoVector.hh" << 50 57 51 class G4ReduciblePolygon; 58 class G4ReduciblePolygon; 52 59 53 struct G4PolyPhiFaceVertex 60 struct G4PolyPhiFaceVertex 54 { 61 { 55 G4double x, y, r, z; // position 62 G4double x, y, r, z; // position 56 G4double rNorm, 63 G4double rNorm, 57 zNorm; // r/z normal 64 zNorm; // r/z normal 58 G4ThreeVector norm3D; // 3D normal 65 G4ThreeVector norm3D; // 3D normal 59 << 60 // Needed for Triangulation Algorithm << 61 // << 62 G4bool ear; << 63 G4PolyPhiFaceVertex *next,*prev; << 64 }; 66 }; 65 67 66 struct G4PolyPhiFaceEdge 68 struct G4PolyPhiFaceEdge 67 { 69 { 68 G4PolyPhiFaceEdge() = default; << 70 G4PolyPhiFaceEdge(): v0(0), v1(0) {} 69 G4PolyPhiFaceVertex *v0{nullptr}, *v1{nullp << 71 G4PolyPhiFaceVertex *v0, *v1; // Corners 70 G4double tr{.0}, tz{0.}, // Unit vect << 72 G4double tr, tz, // Unit vector along edge 71 length{0.}; // Length of << 73 length; // Length of edge 72 G4ThreeVector norm3D; // 3D edge n 74 G4ThreeVector norm3D; // 3D edge normal vector 73 }; 75 }; 74 76 75 class G4PolyPhiFace : public G4VCSGface 77 class G4PolyPhiFace : public G4VCSGface 76 { 78 { 77 79 78 public: << 80 public: // with description 79 81 80 G4PolyPhiFace( const G4ReduciblePolygon* r << 82 G4PolyPhiFace( const G4ReduciblePolygon *rz, 81 G4double phi, G4doubl 83 G4double phi, G4double deltaPhi, G4double phiOther ); 82 // Constructor. 84 // Constructor. 83 // Points r,z should be supplied in cloc 85 // Points r,z should be supplied in clockwise order in r,z. 84 // For example: 86 // For example: 85 // [1]---------[2] 87 // [1]---------[2] ^ R 86 // | | 88 // | | | 87 // | | 89 // | | +--> z 88 // [0]---------[3] 90 // [0]---------[3] 89 91 90 ~G4PolyPhiFace() override; << 92 virtual ~G4PolyPhiFace(); 91 // Destructor. Removes edges and corners 93 // Destructor. Removes edges and corners. 92 94 93 G4PolyPhiFace( const G4PolyPhiFace &source 95 G4PolyPhiFace( const G4PolyPhiFace &source ); 94 G4PolyPhiFace& operator=( const G4PolyPhiF 96 G4PolyPhiFace& operator=( const G4PolyPhiFace &source ); 95 // Copy constructor and assgnment operat 97 // Copy constructor and assgnment operator. 96 98 97 G4bool Intersect( const G4ThreeVector& p, << 99 G4bool Intersect( const G4ThreeVector &p, const G4ThreeVector &v, 98 G4bool outgoing, G 100 G4bool outgoing, G4double surfTolerance, 99 G4double& distance << 101 G4double &distance, G4double &distFromSurface, 100 G4ThreeVector& nor << 102 G4ThreeVector &normal, G4bool &allBehind ); 101 103 102 G4double Distance( const G4ThreeVector& p, << 104 G4double Distance( const G4ThreeVector &p, G4bool outgoing ); 103 105 104 EInside Inside( const G4ThreeVector& p, G4 << 106 EInside Inside( const G4ThreeVector &p, G4double tolerance, 105 G4double* bestDistan << 107 G4double *bestDistance ); 106 108 107 G4ThreeVector Normal( const G4ThreeVector& << 109 G4ThreeVector Normal( const G4ThreeVector &p, G4double *bestDistance ); 108 G4double* best << 109 110 110 G4double Extent( const G4ThreeVector axis << 111 G4double Extent( const G4ThreeVector axis ); 111 112 112 void CalculateExtent( const EAxis axis, 113 void CalculateExtent( const EAxis axis, 113 const G4VoxelLimits 114 const G4VoxelLimits &voxelLimit, 114 const G4AffineTransf << 115 const G4AffineTransform &tranform, 115 G4SolidExtentL << 116 G4SolidExtentList &extentList ); 116 117 117 inline G4VCSGface* Clone() override; << 118 inline G4VCSGface *Clone(); 118 // Allocates on the heap a clone of this 119 // Allocates on the heap a clone of this face. 119 120 120 G4double SurfaceArea() override; << 121 public: // without description 121 G4double SurfaceTriangle( const G4ThreeVec << 122 const G4ThreeVec << 123 G4ThreeVector GetPointOnFace() override; << 124 // Auxiliary methods for determination o << 125 122 126 G4PolyPhiFace(__void__&); 123 G4PolyPhiFace(__void__&); 127 // Fake default constructor for usage re 124 // Fake default constructor for usage restricted to direct object 128 // persistency for clients requiring pre 125 // persistency for clients requiring preallocation of memory for 129 // persistifiable objects. 126 // persistifiable objects. 130 127 131 void Diagnose( G4VSolid* solid ); << 128 void Diagnose( G4VSolid *solid ); 132 // Throw an exception if something is fo 129 // Throw an exception if something is found inconsistent with 133 // the solid. For debugging purposes onl 130 // the solid. For debugging purposes only 134 131 135 protected: 132 protected: 136 133 137 G4bool InsideEdgesExact( G4double r, G4dou 134 G4bool InsideEdgesExact( G4double r, G4double z, G4double normSign, 138 const G4ThreeVect << 135 const G4ThreeVector &p, const G4ThreeVector &v ); 139 // Decide if the point in r,z is inside 136 // Decide if the point in r,z is inside the edges of our face, 140 // **but** do so consistently with other 137 // **but** do so consistently with other faces. 141 138 142 G4bool InsideEdges( G4double r, G4double z 139 G4bool InsideEdges( G4double r, G4double z ); 143 G4bool InsideEdges( G4double r, G4double z << 140 G4bool InsideEdges( G4double r, G4double z, G4double *distRZ2, 144 G4PolyPhiFaceVertex** << 141 G4PolyPhiFaceVertex **base3Dnorm=0, 145 G4ThreeVector** head3D << 142 G4ThreeVector **head3Dnorm=0 ); 146 // Decide if the point in r,z is inside 143 // Decide if the point in r,z is inside the edges of our face. 147 144 148 inline G4double ExactZOrder( G4double z, 145 inline G4double ExactZOrder( G4double z, 149 G4double qx, 146 G4double qx, G4double qy, G4double qz, 150 const G4ThreeVector << 147 const G4ThreeVector &v, 151 G4double norm 148 G4double normSign, 152 const G4PolyPhiFace << 149 const G4PolyPhiFaceVertex *vert ) const; 153 // Decide precisely whether a trajectory 150 // Decide precisely whether a trajectory passes to the left, right, 154 // or exactly passes through the z posit 151 // or exactly passes through the z position of a vertex point in face. 155 152 156 void CopyStuff( const G4PolyPhiFace& sourc << 153 void CopyStuff( const G4PolyPhiFace &source ); 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 154 206 protected: 155 protected: 207 156 208 G4int numEdges = 0; // Number of edges << 157 G4int numEdges; // Number of edges 209 G4PolyPhiFaceEdge* edges = nullptr; << 158 G4PolyPhiFaceEdge *edges; // The edges of the face 210 G4PolyPhiFaceVertex* corners = nullptr; << 159 G4PolyPhiFaceVertex *corners; // And the corners 211 G4ThreeVector normal; // Normal uni << 160 G4ThreeVector normal; // Normal unit vector 212 G4ThreeVector radial; // Unit vecto << 161 G4ThreeVector radial; // Unit vector along radial direction 213 G4ThreeVector surface; // Point on s << 162 G4ThreeVector surface; // Point on surface 214 G4ThreeVector surface_point; // Auxiliary << 163 G4double rMin, rMax, // Extent in r 215 // method Get << 164 zMin, zMax; // Extent in z 216 G4double rMin, rMax, // Extent in r << 165 G4bool allBehind; // True if the polycone/polyhedra 217 zMin, zMax; // Extent in z << 166 // is behind the place of this face 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 }; 167 }; 226 168 227 #include "G4PolyPhiFace.icc" 169 #include "G4PolyPhiFace.icc" 228 170 229 #endif 171 #endif 230 172