Geant4  10.03
G4VSolid.hh
Go to the documentation of this file.
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 //
27 // $Id: G4VSolid.hh 100906 2016-11-03 09:59:32Z gcosmo $
28 //
29 //
30 // class G4VSolid
31 //
32 // Class description:
33 //
34 // Abstract base class for solids, physical shapes that can be tracked through.
35 // Each solid has a name, and the constructors and destructors automatically
36 // add and subtract them from the G4SolidStore, a singleton `master' List
37 // of available solids.
38 //
39 // This class defines, but does not implement, functions to compute
40 // distances to/from the shape. Functions are also defined
41 // to check whether a point is inside the shape, to return the
42 // surface normal of the shape at a given point, and to compute
43 // the extent of the shape. [see descriptions below]
44 //
45 // Some protected/private utility functions are implemented for the
46 // clipping of regions for the computation of a solid's extent. Note that
47 // the clipping mechanism is presently inefficient.
48 //
49 // Some visualization/graphics functions are also defined.
50 //
51 // Member Data:
52 //
53 // G4String fshapeName
54 // - Name for this solid.
55 
56 // History:
57 // 12.04.00 J.Allison Implemented GetExtent() in terms of CalculateExtent()
58 // 17.06.98 J.Apostolakis Added pure virtual function GetEntityType()
59 // 26.07.96 P.Kent Added ComputeDimensions for replication mechanism
60 // 27.03.96 J.Allison Methods for visualisation
61 // 30.06.95 P.Kent Initial version, no scoping or visualisation functions
62 // --------------------------------------------------------------------
63 #ifndef G4VSOLID_HH
64 #define G4VSOLID_HH
65 
66 #include "G4Types.hh"
67 #include "G4String.hh"
68 #include "geomdefs.hh"
69 
70 class G4AffineTransform;
71 class G4VoxelLimits;
72 
74 class G4VPhysicalVolume;
75 
76 class G4VGraphicsScene;
77 class G4Polyhedron;
78 class G4VisExtent;
80 
81 #include "G4ThreeVector.hh"
82 #include <vector>
83 
84 typedef std::vector<G4ThreeVector> G4ThreeVectorList;
86 
87 class G4VSolid
88 {
89  public: // with description
90 
91  G4VSolid(const G4String& name);
92  // Creates a new shape, with the supplied name. No provision is made
93  // for sharing a common name amongst multiple classes.
94  virtual ~G4VSolid();
95  // Default destructor.
96 
97  inline G4bool operator==( const G4VSolid& s ) const;
98  // Return true only if addresses are the same.
99 
100  friend std::ostream& operator<< ( std::ostream& os, const G4VSolid& e );
101  // Streaming operator, using DumpInfo().
102 
103  inline G4String GetName() const;
104  // Returns the current shape's name.
105  inline void SetName(const G4String& name);
106  // Sets the current shape's name.
107 
108  inline G4double GetTolerance() const;
109  // Returns the cached geometrical tolerance.
110 
111  virtual void Extent(G4ThreeVector& pMin, G4ThreeVector& pMax) const;
112  // Returns the bounding box of the solid.
113 
114  virtual G4bool CalculateExtent(const EAxis pAxis,
115  const G4VoxelLimits& pVoxelLimit,
116  const G4AffineTransform& pTransform,
117  G4double& pMin, G4double& pMax) const = 0;
118  // Calculate the minimum and maximum extent of the solid, when under the
119  // specified transform, and within the specified limits. If the solid
120  // is not intersected by the region, return false, else return true.
121 
122  virtual EInside Inside(const G4ThreeVector& p) const = 0;
123  // Returns kOutside if the point at offset p is outside the shapes
124  // boundaries plus Tolerance/2, kSurface if the point is <= Tolerance/2
125  // from a surface, otherwise kInside.
126 
127  virtual G4ThreeVector SurfaceNormal(const G4ThreeVector& p) const = 0;
128  // Returns the outwards pointing unit normal of the shape for the
129  // surface closest to the point at offset p.
130 
131  virtual G4double DistanceToIn(const G4ThreeVector& p,
132  const G4ThreeVector& v) const = 0;
133  // Return the distance along the normalised vector v to the shape,
134  // from the point at offset p. If there is no intersection, return
135  // kInfinity. The first intersection resulting from `leaving' a
136  // surface/volume is discarded. Hence, it is tolerant of points on
137  // the surface of the shape.
138 
139  virtual G4double DistanceToIn(const G4ThreeVector& p) const = 0;
140  // Calculate the distance to the nearest surface of a shape from an
141  // outside point. The distance can be an underestimate.
142 
143  virtual G4double DistanceToOut(const G4ThreeVector& p,
144  const G4ThreeVector& v,
145  const G4bool calcNorm=false,
146  G4bool *validNorm=0,
147  G4ThreeVector *n=0) const = 0;
148  // Return the distance along the normalised vector v to the shape,
149  // from a point at an offset p inside or on the surface of the shape.
150  // Intersections with surfaces, when the point is < Tolerance/2 from a
151  // surface must be ignored.
152  // If calcNorm==true:
153  // validNorm set true if the solid lies entirely behind or on the
154  // exiting surface.
155  // n set to exiting outwards normal vector (undefined Magnitude).
156  // validNorm set to false if the solid does not lie entirely behind
157  // or on the exiting surface
158  // If calcNorm==false:
159  // validNorm and n are unused.
160  //
161  // Must be called as solid.DistanceToOut(p,v) or by specifying all
162  // the parameters.
163 
164  virtual G4double DistanceToOut(const G4ThreeVector& p) const = 0;
165  // Calculate the distance to the nearest surface of a shape from an
166  // inside point. The distance can be an underestimate.
167 
168 
170  const G4int n,
171  const G4VPhysicalVolume* pRep);
172  // Throw exception if ComputeDimensions called frrom an illegal
173  // derived class.
174 
175  virtual G4double GetCubicVolume();
176  // Returns an estimation of the solid volume in internal units.
177  // This method may be overloaded by derived classes to compute the
178  // exact geometrical quantity for solids where this is possible,
179  // or anyway to cache the computed value.
180  // Note: the computed value is NOT cached.
181 
182  virtual G4double GetSurfaceArea();
183  // Return an estimation of the solid surface area in internal units.
184  // This method may be overloaded by derived classes to compute the
185  // exact geometrical quantity for solids where this is possible,
186  // or anyway to cache the computed value.
187  // Note: the computed value is NOT cached.
188 
189  virtual G4GeometryType GetEntityType() const = 0;
190  // Provide identification of the class of an object.
191  // (required for persistency and STEP interface)
192 
193  virtual G4ThreeVector GetPointOnSurface() const;
194  // Returns a random point located on the surface of the solid.
195  // Points returned are not necessarily uniformly distributed.
196 
197  virtual G4VSolid* Clone() const;
198  // Returns a pointer of a dynamically allocated copy of the solid.
199  // Returns NULL pointer with warning in case the concrete solid does not
200  // implement this method. The caller has responsibility for ownership.
201 
202  virtual std::ostream& StreamInfo(std::ostream& os) const = 0;
203  // Dumps contents of the solid to a stream.
204  inline void DumpInfo() const;
205  // Dumps contents of the solid to the standard output.
206 
207  // Visualization functions
208 
209  virtual void DescribeYourselfTo (G4VGraphicsScene& scene) const = 0;
210  // A "double dispatch" function which identifies the solid
211  // to the graphics scene.
212  virtual G4VisExtent GetExtent () const;
213  // Provide extent (bounding box) as possible hint to the graphics view.
214  virtual G4Polyhedron* CreatePolyhedron () const;
215  // Create a G4Polyhedron. (It is the caller's responsibility
216  // to delete it). A null pointer means "not created".
217  virtual G4Polyhedron* GetPolyhedron () const;
218  // Smart access function - creates on request and stores for future
219  // access. A null pointer means "not available".
220 
221  virtual const G4VSolid* GetConstituentSolid(G4int no) const;
222  virtual G4VSolid* GetConstituentSolid(G4int no);
223  // If the solid is made up from a Boolean operation of two solids,
224  // return the "no" solid. If the solid is not a "Boolean", return 0.
225 
226  virtual const G4DisplacedSolid* GetDisplacedSolidPtr() const;
228  // If the solid is a "G4DisplacedSolid", return a self pointer
229  // else return 0.
230 
231  public: // without description
232 
233  G4VSolid(__void__&);
234  // Fake default constructor for usage restricted to direct object
235  // persistency for clients requiring preallocation of memory for
236  // persistifiable objects.
237 
238  G4VSolid(const G4VSolid& rhs);
239  G4VSolid& operator=(const G4VSolid& rhs);
240  // Copy constructor and assignment operator.
241 
243  // Calculate cubic volume based on Inside() method.
244  // Accuracy is limited by the second argument or the statistics
245  // expressed by the first argument.
246 
247  G4double EstimateSurfaceArea(G4int nStat, G4double ell) const;
248  // Calculate surface area only based on Inside() method.
249  // Accuracy is limited by the second argument or the statistics
250  // expressed by the first argument.
251 
252  protected: // with description
253 
255  const G4VoxelLimits& pVoxelLimit,
256  const EAxis pAxis,
257  G4double& pMin, G4double& pMax) const;
258  // Calculate the maximum and minimum extents of the convex polygon
259  // pPolygon along the axis pAxis, within the limits pVoxelLimit.
260  //
261  // If the minimum is <pMin pMin is set to the new minimum.
262  // If the maximum is >pMax pMax is set to the new maximum.
263  //
264  // Modifications to pPolygon are made - it is left in an undefined state.
265 
266  void ClipCrossSection(G4ThreeVectorList* pVertices,
267  const G4int pSectionIndex,
268  const G4VoxelLimits& pVoxelLimit,
269  const EAxis pAxis,
270  G4double& pMin, G4double& pMax) const;
271  // Calculate the maximum and minimum extents of the polygon described
272  // by the vertices: pSectionIndex->pSectionIndex+1->
273  // pSectionIndex+2->pSectionIndex+3->pSectionIndex
274  // in the List pVertices.
275  //
276  // If the minimum is <pMin pMin is set to the new minimum.
277  // If the maximum is >pMax pMax is set to the new maximum.
278  //
279  // No modifications are made to pVertices.
280 
281  void ClipBetweenSections(G4ThreeVectorList* pVertices,
282  const G4int pSectionIndex,
283  const G4VoxelLimits& pVoxelLimit,
284  const EAxis pAxis,
285  G4double& pMin, G4double& pMax) const;
286  // Calculate the maximum and minimum extents of the polygons
287  // joining the CrossSections at pSectionIndex->pSectionIndex+3 and
288  // pSectionIndex+4->pSectionIndex7
289  // in the List pVertices, within the boundaries of the voxel limits
290  // pVoxelLimit.
291  //
292  // If the minimum is <pMin pMin is set to the new minimum.
293  // If the maximum is >pMax pMax is set to the new maximum.
294  //
295  // No modifications are made to pVertices.
296 
297  void ClipPolygon( G4ThreeVectorList& pPolygon,
298  const G4VoxelLimits& pVoxelLimit,
299  const EAxis pAxis ) const;
300  // Clip the specified convex polygon to the given limits, where
301  // the polygon is described by the vertices at (0),(1),...,(n),(0) in
302  // pPolygon.
303  // If the polygon is completely clipped away, the polygon is cleared.
304 
305  protected:
306 
307  G4double kCarTolerance; // Cached geometrical tolerance
308 
309  private:
310 
312  G4ThreeVectorList& outputPolygon,
313  const G4VoxelLimits& pVoxelLimit ) const;
314  // Clip the specified convex polygon to the given limits, storing the
315  // result in outputPolygon. The voxel limits must be limited in one
316  // *plane* only: This is achieved by having only x or y or z limits,
317  // and either the minimum or maximum limit set to -+kInfinity
318  // respectively.
319 
321 };
322 
323 #include "G4VSolid.icc"
324 
325 #endif
virtual G4Polyhedron * GetPolyhedron() const
Definition: G4VSolid.cc:665
G4String GetName() const
void ClipCrossSection(G4ThreeVectorList *pVertices, const G4int pSectionIndex, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
Definition: G4VSolid.cc:348
virtual G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pMin, G4double &pMax) const =0
static constexpr double s
Definition: G4SIunits.hh:169
CLHEP::Hep3Vector G4ThreeVector
void ClipPolygonToSimpleLimits(G4ThreeVectorList &pPolygon, G4ThreeVectorList &outputPolygon, const G4VoxelLimits &pVoxelLimit) const
Definition: G4VSolid.cc:570
virtual void ComputeDimensions(G4VPVParameterisation *p, const G4int n, const G4VPhysicalVolume *pRep)
Definition: G4VSolid.cc:138
G4double EstimateCubicVolume(G4int nStat, G4double epsilon) const
Definition: G4VSolid.cc:204
virtual G4double GetCubicVolume()
Definition: G4VSolid.cc:189
G4double GetTolerance() const
const char * name(G4int ptype)
virtual G4GeometryType GetEntityType() const =0
int G4int
Definition: G4Types.hh:78
void DumpInfo() const
void SetName(const G4String &name)
virtual std::ostream & StreamInfo(std::ostream &os) const =0
void CalculateClippedPolygonExtent(G4ThreeVectorList &pPolygon, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
Definition: G4VSolid.cc:428
virtual EInside Inside(const G4ThreeVector &p) const =0
G4String G4GeometryType
Definition: G4VSolid.hh:85
bool G4bool
Definition: G4Types.hh:79
virtual G4ThreeVector SurfaceNormal(const G4ThreeVector &p) const =0
std::vector< G4ThreeVector > G4ThreeVectorList
Definition: G4VSolid.hh:79
friend std::ostream & operator<<(std::ostream &os, const G4VSolid &e)
Definition: G4VSolid.cc:129
virtual G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const =0
virtual G4Polyhedron * CreatePolyhedron() const
Definition: G4VSolid.cc:660
const G4int n
std::vector< G4ThreeVector > G4ThreeVectorList
G4double EstimateSurfaceArea(G4int nStat, G4double ell) const
Definition: G4VSolid.cc:264
virtual ~G4VSolid()
Definition: G4VSolid.cc:102
virtual void DescribeYourselfTo(G4VGraphicsScene &scene) const =0
G4bool operator==(const G4VSolid &s) const
virtual G4VisExtent GetExtent() const
Definition: G4VSolid.cc:642
EInside
Definition: geomdefs.hh:58
EAxis
Definition: geomdefs.hh:54
virtual G4ThreeVector GetPointOnSurface() const
Definition: G4VSolid.cc:153
virtual const G4VSolid * GetConstituentSolid(G4int no) const
Definition: G4VSolid.cc:168
G4VSolid(const G4String &name)
Definition: G4VSolid.cc:61
G4VSolid & operator=(const G4VSolid &rhs)
Definition: G4VSolid.cc:111
G4double kCarTolerance
Definition: G4VSolid.hh:307
virtual G4VSolid * Clone() const
Definition: G4VSolid.cc:325
double G4double
Definition: G4Types.hh:76
virtual G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=false, G4bool *validNorm=0, G4ThreeVector *n=0) const =0
G4String fshapeName
Definition: G4VSolid.hh:320
virtual G4double GetSurfaceArea()
Definition: G4VSolid.cc:251
virtual void Extent(G4ThreeVector &pMin, G4ThreeVector &pMax) const
Definition: G4VSolid.cc:626
void ClipBetweenSections(G4ThreeVectorList *pVertices, const G4int pSectionIndex, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
Definition: G4VSolid.cc:379
double epsilon(double density, double temperature)
virtual const G4DisplacedSolid * GetDisplacedSolidPtr() const
Definition: G4VSolid.cc:174
void ClipPolygon(G4ThreeVectorList &pPolygon, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis) const
Definition: G4VSolid.cc:495