Geant4 Cross Reference |
>> 1 // This code implementation is the intellectual property of >> 2 // the GEANT4 collaboration. >> 3 // >> 4 // By copying, distributing or modifying the Program (or any work >> 5 // based on the Program) you indicate your acceptance of this statement, >> 6 // and all its terms. >> 7 // >> 8 // $Id: G4PolyPhiFace.hh,v 1.3 2000/11/02 16:54:48 gcosmo Exp $ >> 9 // GEANT4 tag $Name: geant4-03-00 $ >> 10 // >> 11 // >> 12 // -------------------------------------------------------------------- >> 13 // GEANT 4 class header file 1 // 14 // 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 // 15 // 26 // G4PolyPhiFace 16 // G4PolyPhiFace 27 // 17 // 28 // Class description: 18 // Class description: 29 // 19 // 30 // Definition of a face that bounds a polyco 20 // Definition of a face that bounds a polycone or polyhedra when 31 // it has a phi opening: 21 // it has a phi opening: 32 // 22 // 33 // G4PolyPhiFace( const G4ReduciblePolygon* << 23 // G4PolyPhiFace( const G4ReduciblePolygon *rz, 34 // G4double phi, 24 // G4double phi, 35 // G4double deltaPhi, 25 // G4double deltaPhi, 36 // G4double phiOther ) 26 // G4double phiOther ) 37 // 27 // 38 // Specifically: a face that lies on a plane 28 // Specifically: a face that lies on a plane that passes through 39 // the z axis. It has boundaries that are st 29 // the z axis. It has boundaries that are straight lines of arbitrary 40 // length and direction, but with corners aw 30 // length and direction, but with corners aways on the same side of 41 // the z axis. 31 // the z axis. 42 32 43 // Author: David C. Williams (davidw@scipp.ucs << 33 // Author: >> 34 // David C. Williams (davidw@scipp.ucsc.edu) 44 // ------------------------------------------- 35 // -------------------------------------------------------------------- 45 #ifndef G4POLYPHIFACE_HH << 36 46 #define G4POLYPHIFACE_HH 1 << 37 #ifndef G4PolyPhiFace_hh >> 38 #define G4PolyPhiFace_hh 47 39 48 #include "G4VCSGface.hh" 40 #include "G4VCSGface.hh" 49 #include "G4TwoVector.hh" << 50 41 51 class G4ReduciblePolygon; 42 class G4ReduciblePolygon; 52 43 53 struct G4PolyPhiFaceVertex << 44 typedef struct { 54 { << 45 G4double x, y, r, z; // position 55 G4double x, y, r, z; // position << 46 G4double rNorm, 56 G4double rNorm, << 47 zNorm; // r/z normal 57 zNorm; // r/z normal << 48 G4ThreeVector norm3D; // 3D normal 58 G4ThreeVector norm3D; // 3D normal << 49 } G4PolyPhiFaceVertex; 59 << 50 60 // Needed for Triangulation Algorithm << 51 typedef struct { 61 // << 52 G4PolyPhiFaceVertex *v0, *v1; // Corners 62 G4bool ear; << 53 G4double tr, tz, // Unit vector along edge 63 G4PolyPhiFaceVertex *next,*prev; << 54 length; // Length of edge 64 }; << 55 G4ThreeVector norm3D; // 3D edge normal vector 65 << 56 } G4PolyPhiFaceEdge; 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 57 75 class G4PolyPhiFace : public G4VCSGface 58 class G4PolyPhiFace : public G4VCSGface 76 { 59 { 77 60 78 public: << 61 public: // with description 79 62 80 G4PolyPhiFace( const G4ReduciblePolygon* r << 63 G4PolyPhiFace( const G4ReduciblePolygon *rz, 81 G4double phi, G4doubl << 64 G4double phi, G4double deltaPhi, G4double phiOther ); 82 // Constructor. << 65 // Constructor. 83 // Points r,z should be supplied in cloc << 66 // Points r,z should be supplied in clockwise order in r,z. 84 // For example: << 67 // For example: 85 // [1]---------[2] << 68 // [1]---------[2] ^ R 86 // | | << 69 // | | | 87 // | | << 70 // | | +--> z 88 // [0]---------[3] << 71 // [0]---------[3] 89 << 72 90 ~G4PolyPhiFace() override; << 73 virtual ~G4PolyPhiFace(); 91 // Destructor. Removes edges and corners << 74 // Destructor. Removes edges and corners. 92 << 75 93 G4PolyPhiFace( const G4PolyPhiFace &source << 76 G4PolyPhiFace( const G4PolyPhiFace &source ); 94 G4PolyPhiFace& operator=( const G4PolyPhiF << 77 G4PolyPhiFace& operator=( const G4PolyPhiFace &source ); 95 // Copy constructor and assgnment operat << 78 // Copy constructor and assgnment operator. 96 << 79 97 G4bool Intersect( const G4ThreeVector& p, << 80 G4bool Intersect( const G4ThreeVector &p, const G4ThreeVector &v, 98 G4bool outgoing, G << 81 G4bool outgoing, G4double surfTolerance, 99 G4double& distance << 82 G4double &distance, G4double &distFromSurface, 100 G4ThreeVector& nor << 83 G4ThreeVector &normal, G4bool &allBehind ); 101 << 84 102 G4double Distance( const G4ThreeVector& p, << 85 G4double Distance( const G4ThreeVector &p, G4bool outgoing ); 103 << 86 104 EInside Inside( const G4ThreeVector& p, G4 << 87 EInside Inside( const G4ThreeVector &p, G4double tolerance, 105 G4double* bestDistan << 88 G4double *bestDistance ); 106 << 89 107 G4ThreeVector Normal( const G4ThreeVector& << 90 G4ThreeVector Normal( const G4ThreeVector &p, G4double *bestDistance ); 108 G4double* best << 91 109 << 92 G4double Extent( const G4ThreeVector axis ); 110 G4double Extent( const G4ThreeVector axis << 93 111 << 94 void CalculateExtent( const EAxis axis, 112 void CalculateExtent( const EAxis axis, << 95 const G4VoxelLimits &voxelLimit, 113 const G4VoxelLimits << 96 const G4AffineTransform &tranform, 114 const G4AffineTransf << 97 G4SolidExtentList &extentList ); 115 G4SolidExtentL << 98 116 << 99 inline G4VCSGface *Clone(); 117 inline G4VCSGface* Clone() override; << 100 // Allocates on the heap a clone of this face. 118 // Allocates on the heap a clone of this << 101 119 << 102 public: // without description 120 G4double SurfaceArea() override; << 103 121 G4double SurfaceTriangle( const G4ThreeVec << 104 void Diagnose( G4VSolid *solid ); 122 const G4ThreeVec << 105 // Throw an exception if something is found inconsistent with 123 G4ThreeVector GetPointOnFace() override; << 106 // the solid. For debugging purposes only 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 107 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 108 206 protected: 109 protected: 207 110 208 G4int numEdges = 0; // Number of edges << 111 G4PolyPhiFaceEdge *edges; // The edges of the face 209 G4PolyPhiFaceEdge* edges = nullptr; << 112 G4PolyPhiFaceVertex *corners; // And the corners 210 G4PolyPhiFaceVertex* corners = nullptr; << 113 G4int numEdges; // Number of edges 211 G4ThreeVector normal; // Normal uni << 114 G4ThreeVector normal; // Normal unit vector 212 G4ThreeVector radial; // Unit vecto << 115 G4ThreeVector radial; // Unit vector along radial direction 213 G4ThreeVector surface; // Point on s << 116 G4ThreeVector surface; // Point on surface 214 G4ThreeVector surface_point; // Auxiliary << 117 G4double rMin, rMax, // Extent in r 215 // method Get << 118 zMin, zMax; // Extent in z 216 G4double rMin, rMax, // Extent in r << 119 G4bool allBehind; // True if the polycone/polyhedra 217 zMin, zMax; // Extent in z << 120 // is behind the place of this face 218 G4bool allBehind = false; // True if the p << 121 219 // is behind the << 122 G4bool InsideEdgesExact( G4double r, G4double z, G4double normSign, 220 G4double kCarTolerance; // Surface th << 123 const G4ThreeVector &p, const G4ThreeVector &v ); 221 G4double fSurfaceArea = 0.0; // Surface Ar << 124 // Decide if the point in r,z is inside the edges of our face, 222 G4PolyPhiFaceVertex* triangles = nullptr; << 125 // **but** do so consistently with other faces. 223 // Auxiliary pointer to 'corners' used f << 126 224 // Copy structure, changing the structur << 127 G4bool InsideEdges( G4double r, G4double z ); >> 128 G4bool InsideEdges( G4double r, G4double z, G4double *distRZ2, >> 129 G4PolyPhiFaceVertex **base3Dnorm=0, >> 130 G4ThreeVector **head3Dnorm=0 ); >> 131 // Decide if the point in r,z is inside the edges of our face. >> 132 >> 133 inline G4double ExactZOrder( G4double z, >> 134 G4double qx, G4double qy, G4double qz, >> 135 const G4ThreeVector &v, >> 136 G4double normSign, >> 137 const G4PolyPhiFaceVertex *vert ) const; >> 138 // Decide precisely whether a trajectory passes to the left, right, >> 139 // or exactly passes through the z position of a vertex point in face. >> 140 >> 141 void CopyStuff( const G4PolyPhiFace &source ); 225 }; 142 }; 226 143 227 #include "G4PolyPhiFace.icc" 144 #include "G4PolyPhiFace.icc" 228 145 229 #endif 146 #endif 230 147