source: trunk/source/geometry/management/include/G4VSolid.hh @ 1340

Last change on this file since 1340 was 1340, checked in by garnier, 14 years ago

update ti head

File size: 13.6 KB
Line 
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.30 2010/10/19 15:19:37 gcosmo Exp $
28// GEANT4 tag $Name: geommng-V09-03-05 $
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
71class G4AffineTransform;
72class G4VoxelLimits;
73
74class G4VPVParameterisation;
75class G4VPhysicalVolume;
76
77class G4VGraphicsScene;
78class G4Polyhedron;
79class G4NURBS;
80class G4VisExtent;
81class G4DisplacedSolid;
82
83#include "G4ThreeVector.hh"
84#include <vector>
85
86typedef std::vector<G4ThreeVector> G4ThreeVectorList;
87typedef G4String   G4GeometryType;
88
89class 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 G4VSolid* Clone() const;
196      // Returns a pointer of a dynamically allocated copy of the solid.
197      // Returns NULL pointer with warning in case the concrete solid does not
198      // implement this method. The caller has responsibility for ownership.
199
200    virtual std::ostream& StreamInfo(std::ostream& os) const = 0;
201      // Dumps contents of the solid to a stream.
202    inline void DumpInfo() const;
203      // Dumps contents of the solid to the standard output.
204
205    // Visualization functions
206
207    virtual void DescribeYourselfTo (G4VGraphicsScene& scene) const = 0;
208      // A "double dispatch" function which identifies the solid
209      // to the graphics scene.
210    virtual G4VisExtent   GetExtent        () const;
211      // Provide extent (bounding box) as possible hint to the graphics view.
212    virtual G4Polyhedron* CreatePolyhedron () const;
213    virtual G4NURBS*      CreateNURBS      () const;
214      // Create a G4Polyhedron/G4NURBS/...  (It is the caller's responsibility
215      // to delete it).  A null pointer means "not created".
216    virtual G4Polyhedron* GetPolyhedron () const;
217      // Smart access function - creates on request and stores for future
218      // access.  A null pointer means "not available".
219
220    virtual const G4VSolid* GetConstituentSolid(G4int no) const;
221    virtual       G4VSolid* GetConstituentSolid(G4int no);
222      // If the solid is made up from a Boolean operation of two solids,
223      // return the "no" solid. If the solid is not a "Boolean", return 0.
224
225    virtual const G4DisplacedSolid* GetDisplacedSolidPtr() const; 
226    virtual       G4DisplacedSolid* GetDisplacedSolidPtr(); 
227      // If the solid is a "G4DisplacedSolid", return a self pointer
228      // else return 0.
229
230  public:  // without description
231
232    G4VSolid(__void__&);
233      // Fake default constructor for usage restricted to direct object
234      // persistency for clients requiring preallocation of memory for
235      // persistifiable objects.
236
237    G4VSolid(const G4VSolid& rhs);
238    G4VSolid& operator=(const G4VSolid& rhs); 
239      // Copy constructor and assignment operator.
240
241  protected:  // with description
242
243    void CalculateClippedPolygonExtent(G4ThreeVectorList& pPolygon,
244                                       const G4VoxelLimits& pVoxelLimit,
245                                       const EAxis pAxis, 
246                                       G4double& pMin, G4double& pMax) const;
247      // Calculate the maximum and minimum extents of the convex polygon
248      // pPolygon along the axis pAxis, within the limits pVoxelLimit.
249      //
250      // If the minimum is <pMin pMin is set to the new minimum.
251      // If the maximum is >pMax pMax is set to the new maximum.
252      //
253      // Modifications to pPolygon are made - it is left in an undefined state.
254
255    void ClipCrossSection(G4ThreeVectorList* pVertices,
256                          const G4int pSectionIndex,
257                          const G4VoxelLimits& pVoxelLimit,
258                          const EAxis pAxis, 
259                          G4double& pMin, G4double& pMax) const;
260      // Calculate the maximum and minimum extents of the polygon described
261      // by the vertices: pSectionIndex->pSectionIndex+1->
262      //                  pSectionIndex+2->pSectionIndex+3->pSectionIndex
263      // in the List pVertices.
264      //
265      // If the minimum is <pMin pMin is set to the new minimum.
266      // If the maximum is >pMax pMax is set to the new maximum.
267      //
268      // No modifications are made to pVertices.
269
270    void ClipBetweenSections(G4ThreeVectorList* pVertices,
271                             const G4int pSectionIndex,
272                             const G4VoxelLimits& pVoxelLimit,
273                             const EAxis pAxis, 
274                             G4double& pMin, G4double& pMax) const;
275      // Calculate the maximum and minimum extents of the polygons
276      // joining the CrossSections at pSectionIndex->pSectionIndex+3 and
277      //                              pSectionIndex+4->pSectionIndex7
278      // in the List pVertices, within the boundaries of the voxel limits
279      // pVoxelLimit.
280      //
281      // If the minimum is <pMin pMin is set to the new minimum.
282      // If the maximum is >pMax pMax is set to the new maximum.
283      //
284      // No modifications are made to pVertices.
285
286    void ClipPolygon(      G4ThreeVectorList& pPolygon,
287                     const G4VoxelLimits& pVoxelLimit,
288                     const EAxis              pAxis      ) const;
289      // Clip the specified convex polygon to the given limits, where
290      // the polygon is described by the vertices at (0),(1),...,(n),(0) in
291      // pPolygon.
292      // If the polygon is completely clipped away, the polygon is cleared.
293
294
295    G4double EstimateCubicVolume(G4int nStat, G4double epsilon) const;
296      // Calculate cubic volume based on Inside() method.
297      // Accuracy is limited by the second argument or the statistics
298      // expressed by the first argument.
299
300    G4double EstimateSurfaceArea(G4int nStat, G4double ell) const;
301      // Calculate surface area only based on Inside() method.
302      // Accuracy is limited by the second argument or the statistics
303      // expressed by the first argument.
304
305  protected:
306
307    G4double kCarTolerance;      // Cached geometrical tolerance
308
309  private:
310
311    void ClipPolygonToSimpleLimits(G4ThreeVectorList& pPolygon,
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
320    G4String fshapeName;         // Name
321};
322
323#include "G4VSolid.icc"
324
325#endif
Note: See TracBrowser for help on using the repository browser.