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
solids
specific
include
G4PolyPhiFace.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: G4PolyPhiFace.hh 67011 2013-01-29 16:17:41Z gcosmo $
28
//
29
//
30
// --------------------------------------------------------------------
31
// GEANT 4 class header file
32
//
33
//
34
// G4PolyPhiFace
35
//
36
// Class description:
37
//
38
// Definition of a face that bounds a polycone or polyhedra when
39
// it has a phi opening:
40
//
41
// G4PolyPhiFace( const G4ReduciblePolygon *rz,
42
// G4double phi,
43
// G4double deltaPhi,
44
// G4double phiOther )
45
//
46
// Specifically: a face that lies on a plane that passes through
47
// the z axis. It has boundaries that are straight lines of arbitrary
48
// length and direction, but with corners aways on the same side of
49
// the z axis.
50
51
// Author:
52
// David C. Williams (davidw@scipp.ucsc.edu)
53
// --------------------------------------------------------------------
54
55
#ifndef G4PolyPhiFace_hh
56
#define G4PolyPhiFace_hh
57
58
#include "
G4VCSGface.hh
"
59
#include "
G4TwoVector.hh
"
60
61
class
G4ReduciblePolygon
;
62
63
struct
G4PolyPhiFaceVertex
64
{
65
G4double
x
,
y
,
r
,
z
;
// position
66
G4double
rNorm
,
67
zNorm
;
// r/z normal
68
G4ThreeVector
norm3D
;
// 3D normal
69
70
// Needed for Triangulation Algorithm
71
//
72
G4bool
ear
;
73
G4PolyPhiFaceVertex
*
next
,*
prev
;
74
};
75
76
struct
G4PolyPhiFaceEdge
77
{
78
G4PolyPhiFaceEdge
():
v0
(0),
v1
(0),
tr
(.0),
tz
(0.),
length
(0.) {}
79
G4PolyPhiFaceVertex
*
v0
, *
v1
;
// Corners
80
G4double
tr
,
tz
,
// Unit vector along edge
81
length
;
// Length of edge
82
G4ThreeVector
norm3D
;
// 3D edge normal vector
83
};
84
85
class
G4PolyPhiFace
:
public
G4VCSGface
86
{
87
88
public
:
// with description
89
90
G4PolyPhiFace
(
const
G4ReduciblePolygon
*rz,
91
G4double
phi,
G4double
deltaPhi,
G4double
phiOther );
92
// Constructor.
93
// Points r,z should be supplied in clockwise order in r,z.
94
// For example:
95
// [1]---------[2] ^ R
96
// | | |
97
// | | +--> z
98
// [0]---------[3]
99
100
virtual
~G4PolyPhiFace
();
101
// Destructor. Removes edges and corners.
102
103
G4PolyPhiFace
(
const
G4PolyPhiFace
&source );
104
G4PolyPhiFace
&
operator=
(
const
G4PolyPhiFace
&source );
105
// Copy constructor and assgnment operator.
106
107
G4bool
Intersect
(
const
G4ThreeVector
&
p
,
const
G4ThreeVector
&
v
,
108
G4bool
outgoing,
G4double
surfTolerance,
109
G4double
&distance,
G4double
&distFromSurface,
110
G4ThreeVector
&
normal
,
G4bool
&
allBehind
);
111
112
G4double
Distance
(
const
G4ThreeVector
&p,
G4bool
outgoing );
113
114
EInside
Inside
(
const
G4ThreeVector
&p,
G4double
tolerance,
115
G4double
*bestDistance );
116
117
G4ThreeVector
Normal
(
const
G4ThreeVector
&p,
G4double
*bestDistance );
118
119
G4double
Extent
(
const
G4ThreeVector
axis );
120
121
void
CalculateExtent
(
const
EAxis
axis,
122
const
G4VoxelLimits
&voxelLimit,
123
const
G4AffineTransform
&tranform,
124
G4SolidExtentList
&extentList );
125
126
inline
G4VCSGface
*
Clone
();
127
// Allocates on the heap a clone of this face.
128
129
G4double
SurfaceArea
();
130
G4double
SurfaceTriangle
(
G4ThreeVector
p1,
G4ThreeVector
p2,
131
G4ThreeVector
p3,
G4ThreeVector
* p4);
132
G4ThreeVector
GetPointOnFace
();
133
// Auxiliary methods for determination of points on surface.
134
135
public
:
// without description
136
137
G4PolyPhiFace
(__void__&);
138
// Fake default constructor for usage restricted to direct object
139
// persistency for clients requiring preallocation of memory for
140
// persistifiable objects.
141
142
void
Diagnose
(
G4VSolid
*solid );
143
// Throw an exception if something is found inconsistent with
144
// the solid. For debugging purposes only
145
146
protected
:
147
148
G4bool
InsideEdgesExact
(
G4double
r
,
G4double
z
,
G4double
normSign,
149
const
G4ThreeVector
&p,
const
G4ThreeVector
&v );
150
// Decide if the point in r,z is inside the edges of our face,
151
// **but** do so consistently with other faces.
152
153
G4bool
InsideEdges
(
G4double
r,
G4double
z );
154
G4bool
InsideEdges
(
G4double
r,
G4double
z,
G4double
*distRZ2,
155
G4PolyPhiFaceVertex
**base3Dnorm=0,
156
G4ThreeVector
**head3Dnorm=0 );
157
// Decide if the point in r,z is inside the edges of our face.
158
159
inline
G4double
ExactZOrder
(
G4double
z,
160
G4double
qx,
G4double
qy,
G4double
qz,
161
const
G4ThreeVector
&v,
162
G4double
normSign,
163
const
G4PolyPhiFaceVertex
*vert )
const
;
164
// Decide precisely whether a trajectory passes to the left, right,
165
// or exactly passes through the z position of a vertex point in face.
166
167
void
CopyStuff
(
const
G4PolyPhiFace
&source );
168
169
protected
:
170
171
// Functions used for Triangulation in Case of generic Polygone.
172
// The triangulation is used for GetPointOnFace()
173
174
G4double
Area2
(
G4TwoVector
a
,
G4TwoVector
b
,
G4TwoVector
c
);
175
// Calculation of 2*Area of Triangle with Sign
176
177
G4bool
Left
(
G4TwoVector
a,
G4TwoVector
b,
G4TwoVector
c );
178
G4bool
LeftOn
(
G4TwoVector
a,
G4TwoVector
b,
G4TwoVector
c );
179
G4bool
Collinear
(
G4TwoVector
a,
G4TwoVector
b,
G4TwoVector
c );
180
// Boolean functions for sign of Surface
181
182
G4bool
IntersectProp
(
G4TwoVector
a,
G4TwoVector
b,
183
G4TwoVector
c,
G4TwoVector
d
);
184
// Boolean function for finding proper intersection of two
185
// line segments (a,b) and (c,d).
186
187
G4bool
Between
(
G4TwoVector
a,
G4TwoVector
b,
G4TwoVector
c );
188
// Boolean function for determining if point c is between a and b
189
// where the three points (a,b,c) are on the same line.
190
191
G4bool
Intersect
(
G4TwoVector
a,
G4TwoVector
b,
192
G4TwoVector
c,
G4TwoVector
d );
193
// Boolean function for finding proper intersection or not
194
// of two line segments (a,b) and (c,d).
195
196
G4bool
Diagonalie
(
G4PolyPhiFaceVertex
*a,
G4PolyPhiFaceVertex
*b );
197
// Boolean Diagonalie help to determine if diagonal s
198
// of segment (a,b) is convex or reflex.
199
200
G4bool
InCone
(
G4PolyPhiFaceVertex
*a,
G4PolyPhiFaceVertex
*b );
201
// Boolean function for determining if b is inside the cone (a0,a,a1)
202
// where a is the center of the cone.
203
204
G4bool
Diagonal
(
G4PolyPhiFaceVertex
*a,
G4PolyPhiFaceVertex
*b );
205
// Boolean function for determining if Diagonal is possible
206
// inside Polycone or PolyHedra.
207
208
void
EarInit
();
209
// Initialisation for Triangulisation by ear tips.
210
// For details see "Computational Geometry in C" by Joseph O'Rourke.
211
212
void
Triangulate
();
213
// Triangularisation by ear tips for Polycone or Polyhedra.
214
// For details see "Computational Geometry in C" by Joseph O'Rourke.
215
// NOTE: a copy of the shape is made and this copy is reordered in
216
// order to have a list of triangles. This list is used by the
217
// method GetPointOnFace().
218
219
protected
:
220
221
G4int
numEdges
;
// Number of edges
222
G4PolyPhiFaceEdge
*
edges
;
// The edges of the face
223
G4PolyPhiFaceVertex
*
corners
;
// And the corners
224
G4ThreeVector
normal
;
// Normal unit vector
225
G4ThreeVector
radial
;
// Unit vector along radial direction
226
G4ThreeVector
surface
;
// Point on surface
227
G4ThreeVector
surface_point
;
// Auxiliary point on surface used for
228
// method GetPointOnFace()
229
G4double
rMin
,
rMax
,
// Extent in r
230
zMin
,
zMax
;
// Extent in z
231
G4bool
allBehind
;
// True if the polycone/polyhedra
232
// is behind the place of this face
233
G4double
kCarTolerance
;
// Surface thickness
234
G4double
fSurfaceArea
;
// Surface Area of PolyPhiFace
235
G4PolyPhiFaceVertex
*
triangles
;
// Auxiliary pointer to 'corners' used for
236
// triangulation. Copy structure, changing
237
// the structure of 'corners' (ear removal)
238
};
239
240
#include "G4PolyPhiFace.icc"
241
242
#endif
Generated on Sat May 25 2013 14:33:14 for Geant4 by
1.8.4