Geant4
9.6.p02
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
geant4_9_6_p02
source
geometry
management
include
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$
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
73
class
G4VPVParameterisation
;
74
class
G4VPhysicalVolume
;
75
76
class
G4VGraphicsScene
;
77
class
G4Polyhedron
;
78
class
G4NURBS
;
79
class
G4VisExtent
;
80
class
G4DisplacedSolid
;
81
82
#include "
G4ThreeVector.hh
"
83
#include <vector>
84
85
typedef
std::vector<G4ThreeVector>
G4ThreeVectorList
;
86
typedef
G4String
G4GeometryType
;
87
88
class
G4VSolid
89
{
90
public
:
// with description
91
92
G4VSolid
(
const
G4String
&
name
);
93
// Creates a new shape, with the supplied name. No provision is made
94
// for sharing a common name amongst multiple classes.
95
virtual
~G4VSolid
();
96
// Default destructor.
97
98
inline
G4bool
operator==
(
const
G4VSolid
&
s
)
const
;
99
// Return true only if addresses are the same.
100
101
friend
std::ostream&
operator<<
( std::ostream& os,
const
G4VSolid
&
e
);
102
// Streaming operator, using DumpInfo().
103
104
inline
G4String
GetName
()
const
;
105
// Returns the current shape's name.
106
inline
void
SetName
(
const
G4String
& name);
107
// Sets the current shape's name.
108
109
inline
G4double
GetTolerance
()
const
;
110
// Returns the cached geometrical tolerance.
111
112
virtual
G4bool
CalculateExtent
(
const
EAxis
pAxis,
113
const
G4VoxelLimits
& pVoxelLimit,
114
const
G4AffineTransform
& pTransform,
115
G4double
& pMin,
G4double
& pMax)
const
= 0;
116
// Calculate the minimum and maximum extent of the solid, when under the
117
// specified transform, and within the specified limits. If the solid
118
// is not intersected by the region, return false, else return true.
119
120
virtual
EInside
Inside
(
const
G4ThreeVector
&
p
)
const
= 0;
121
// Returns kOutside if the point at offset p is outside the shapes
122
// boundaries plus Tolerance/2, kSurface if the point is <= Tolerance/2
123
// from a surface, otherwise kInside.
124
125
virtual
G4ThreeVector
SurfaceNormal
(
const
G4ThreeVector
& p)
const
= 0;
126
// Returns the outwards pointing unit normal of the shape for the
127
// surface closest to the point at offset p.
128
129
virtual
G4double
DistanceToIn
(
const
G4ThreeVector
& p,
130
const
G4ThreeVector
&
v
)
const
= 0;
131
// Return the distance along the normalised vector v to the shape,
132
// from the point at offset p. If there is no intersection, return
133
// kInfinity. The first intersection resulting from `leaving' a
134
// surface/volume is discarded. Hence, it is tolerant of points on
135
// the surface of the shape.
136
137
virtual
G4double
DistanceToIn
(
const
G4ThreeVector
& p)
const
= 0;
138
// Calculate the distance to the nearest surface of a shape from an
139
// outside point. The distance can be an underestimate.
140
141
virtual
G4double
DistanceToOut
(
const
G4ThreeVector
& p,
142
const
G4ThreeVector
& v,
143
const
G4bool
calcNorm=
false
,
144
G4bool
*validNorm=0,
145
G4ThreeVector
*
n
=0)
const
= 0;
146
// Return the distance along the normalised vector v to the shape,
147
// from a point at an offset p inside or on the surface of the shape.
148
// Intersections with surfaces, when the point is < Tolerance/2 from a
149
// surface must be ignored.
150
// If calcNorm==true:
151
// validNorm set true if the solid lies entirely behind or on the
152
// exiting surface.
153
// n set to exiting outwards normal vector (undefined Magnitude).
154
// validNorm set to false if the solid does not lie entirely behind
155
// or on the exiting surface
156
// If calcNorm==false:
157
// validNorm and n are unused.
158
//
159
// Must be called as solid.DistanceToOut(p,v) or by specifying all
160
// the parameters.
161
162
virtual
G4double
DistanceToOut
(
const
G4ThreeVector
& p)
const
= 0;
163
// Calculate the distance to the nearest surface of a shape from an
164
// inside point. The distance can be an underestimate.
165
166
167
virtual
void
ComputeDimensions
(
G4VPVParameterisation
* p,
168
const
G4int
n
,
169
const
G4VPhysicalVolume
* pRep);
170
// Throw exception if ComputeDimensions called frrom an illegal
171
// derived class.
172
173
virtual
G4double
GetCubicVolume
();
174
// Returns an estimation of the solid volume in internal units.
175
// This method may be overloaded by derived classes to compute the
176
// exact geometrical quantity for solids where this is possible,
177
// or anyway to cache the computed value.
178
// Note: the computed value is NOT cached.
179
180
virtual
G4double
GetSurfaceArea
();
181
// Return an estimation of the solid surface area in internal units.
182
// This method may be overloaded by derived classes to compute the
183
// exact geometrical quantity for solids where this is possible,
184
// or anyway to cache the computed value.
185
// Note: the computed value is NOT cached.
186
187
virtual
G4GeometryType
GetEntityType
()
const
= 0;
188
// Provide identification of the class of an object.
189
// (required for persistency and STEP interface)
190
191
virtual
G4ThreeVector
GetPointOnSurface
()
const
;
192
// Returns a random point located on the surface of the solid.
193
// Points returned are not necessarily uniformly distributed.
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
Generated on Sat May 25 2013 14:33:11 for Geant4 by
1.8.4