Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
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$
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
62
64{
65 G4double x, y, r, z; // position
67 zNorm; // r/z normal
68 G4ThreeVector norm3D; // 3D normal
69
70 // Needed for Triangulation Algorithm
71 //
74};
75
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
86{
87
88 public: // with description
89
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,
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
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
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
155 G4PolyPhiFaceVertex **base3Dnorm=0,
156 G4ThreeVector **head3Dnorm=0 );
157 // Decide if the point in r,z is inside the edges of our face.
158
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
175 // Calculation of 2*Area of Triangle with Sign
176
180 // Boolean functions for sign of Surface
181
184 // Boolean function for finding proper intersection of two
185 // line segments (a,b) and (c,d).
186
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
193 // Boolean function for finding proper intersection or not
194 // of two line segments (a,b) and (c,d).
195
197 // Boolean Diagonalie help to determine if diagonal s
198 // of segment (a,b) is convex or reflex.
199
201 // Boolean function for determining if b is inside the cone (a0,a,a1)
202 // where a is the center of the cone.
203
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
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
G4double SurfaceArea()
G4bool Left(G4TwoVector a, G4TwoVector b, G4TwoVector c)
G4bool Collinear(G4TwoVector a, G4TwoVector b, G4TwoVector c)
void Diagnose(G4VSolid *solid)
G4PolyPhiFace & operator=(const G4PolyPhiFace &source)
virtual ~G4PolyPhiFace()
G4bool Diagonal(G4PolyPhiFaceVertex *a, G4PolyPhiFaceVertex *b)
G4ThreeVector surface_point
G4bool InsideEdges(G4double r, G4double z)
G4bool Diagonalie(G4PolyPhiFaceVertex *a, G4PolyPhiFaceVertex *b)
G4VCSGface * Clone()
G4bool IntersectProp(G4TwoVector a, G4TwoVector b, G4TwoVector c, G4TwoVector d)
G4ThreeVector surface
G4bool LeftOn(G4TwoVector a, G4TwoVector b, G4TwoVector c)
G4bool Intersect(const G4ThreeVector &p, const G4ThreeVector &v, G4bool outgoing, G4double surfTolerance, G4double &distance, G4double &distFromSurface, G4ThreeVector &normal, G4bool &allBehind)
G4ThreeVector Normal(const G4ThreeVector &p, G4double *bestDistance)
G4double fSurfaceArea
void CopyStuff(const G4PolyPhiFace &source)
void CalculateExtent(const EAxis axis, const G4VoxelLimits &voxelLimit, const G4AffineTransform &tranform, G4SolidExtentList &extentList)
G4double Area2(G4TwoVector a, G4TwoVector b, G4TwoVector c)
G4double ExactZOrder(G4double z, G4double qx, G4double qy, G4double qz, const G4ThreeVector &v, G4double normSign, const G4PolyPhiFaceVertex *vert) const
G4double Distance(const G4ThreeVector &p, G4bool outgoing)
G4double Extent(const G4ThreeVector axis)
G4PolyPhiFaceEdge * edges
G4ThreeVector radial
G4bool InCone(G4PolyPhiFaceVertex *a, G4PolyPhiFaceVertex *b)
G4bool Between(G4TwoVector a, G4TwoVector b, G4TwoVector c)
G4PolyPhiFaceVertex * corners
G4PolyPhiFaceVertex * triangles
G4ThreeVector normal
EInside Inside(const G4ThreeVector &p, G4double tolerance, G4double *bestDistance)
G4double kCarTolerance
G4ThreeVector GetPointOnFace()
G4double SurfaceTriangle(G4ThreeVector p1, G4ThreeVector p2, G4ThreeVector p3, G4ThreeVector *p4)
G4bool InsideEdgesExact(G4double r, G4double z, G4double normSign, const G4ThreeVector &p, const G4ThreeVector &v)
EAxis
Definition: geomdefs.hh:54
EInside
Definition: geomdefs.hh:58
G4PolyPhiFaceVertex * v1
G4ThreeVector norm3D
G4PolyPhiFaceVertex * v0
G4ThreeVector norm3D
G4PolyPhiFaceVertex * next
G4PolyPhiFaceVertex * prev