Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/geometry/management/include/G4VSolid.hh

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ]

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