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
G4GenericTrap.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// G4GenericTrap
35//
36// Class description:
37//
38// G4GenericTrap is a solid which represents an arbitrary trapezoid with
39// up to 8 vertices standing on two parallel planes perpendicular to Z axis.
40//
41// Parameters in the constructor:
42// - name - solid name
43// - halfZ - the solid half length in Z
44// - vertices - the (x,y) coordinates of vertices:
45// o first four points: vertices[i], i<4
46// are the vertices sitting on the -halfZ plane;
47// o last four points: vertices[i], i>=4
48// are the vertices sitting on the +halfZ plane.
49//
50// The order of defining the vertices of the solid is the following:
51// - point 0 is connected with points 1,3,4
52// - point 1 is connected with points 0,2,5
53// - point 2 is connected with points 1,3,6
54// - point 3 is connected with points 0,2,7
55// - point 4 is connected with points 0,5,7
56// - point 5 is connected with points 1,4,6
57// - point 6 is connected with points 2,5,7
58// - point 7 is connected with points 3,4,6
59// Points can be identical in order to create shapes with less than
60// 8 vertices.
61
62// Authors:
63// Tatiana Nikitina, CERN; Ivana Hrivnacova, IPN Orsay
64// Adapted from Root Arb8 implementation, author Andrea Gheata, CERN
65// -------------------------------------------------------------------
66
67#ifndef G4GenericTrap_HH
68#define G4GenericTrap_HH
69
70#include <vector>
71
72#include "G4TwoVector.hh"
73#include "G4VSolid.hh"
74#include "globals.hh"
75
76class G4VFacet;
78
79class G4GenericTrap : public G4VSolid
80{
81 public: // with description
82
83 G4GenericTrap( const G4String& name, G4double halfZ,
84 const std::vector<G4TwoVector>& vertices );
85 // Constructor
86
88 // Destructor
89
90 // Accessors
91
92 inline G4double GetZHalfLength() const;
93 inline G4int GetNofVertices() const;
94 inline G4TwoVector GetVertex(G4int index) const;
95 inline const std::vector<G4TwoVector>& GetVertices() const;
96 inline G4double GetTwistAngle(G4int index) const;
97 inline G4bool IsTwisted() const;
98 inline G4int GetVisSubdivisions() const;
99 inline void SetVisSubdivisions(G4int subdiv);
100
101 // Solid methods
102
103 EInside Inside(const G4ThreeVector& p) const;
106 const G4ThreeVector& v) const;
107 G4double DistanceToIn(const G4ThreeVector& p) const;
109 const G4ThreeVector& v,
110 const G4bool calcNorm = false,
111 G4bool *validNorm = 0,
112 G4ThreeVector *n = 0) const;
113 G4double DistanceToOut(const G4ThreeVector& p) const;
114 G4bool CalculateExtent(const EAxis pAxis,
115 const G4VoxelLimits& pVoxelLimit,
116 const G4AffineTransform& pTransform,
117 G4double& pmin, G4double& pmax) const;
118
120
121 G4VSolid* Clone() const;
122
123 std::ostream& StreamInfo(std::ostream& os) const;
124
126
129
130 // Visualisation functions
131
132 G4Polyhedron* GetPolyhedron () const;
133 void DescribeYourselfTo(G4VGraphicsScene& scene) const;
134 G4VisExtent GetExtent() const;
136 G4NURBS* CreateNURBS() const;
137
138 public: // without description
139
140 G4GenericTrap(__void__&);
141 // Fake default constructor for usage restricted to direct object
142 // persistency for clients requiring preallocation of memory for
143 // persistifiable objects.
144
145 G4GenericTrap(const G4GenericTrap& rhs);
147 // Copy constructor and assignment operator.
148
149 private:
150
151 // Internal methods
152
153 inline void SetTwistAngle(G4int index, G4double twist);
154 G4bool ComputeIsTwisted() ;
155 G4bool CheckOrder(const std::vector<G4TwoVector>& vertices) const;
156 G4bool IsSegCrossing(const G4TwoVector& a, const G4TwoVector& b,
157 const G4TwoVector& c, const G4TwoVector& d) const;
158 G4bool IsSegCrossingZ(const G4TwoVector& a, const G4TwoVector& b,
159 const G4TwoVector& c, const G4TwoVector& d) const;
160 G4ThreeVectorList* CreateRotatedVertices(const
161 G4AffineTransform& pTransform) const;
162 void ReorderVertices(std::vector<G4ThreeVector>& vertices) const;
163 void ComputeBBox();
164 inline G4ThreeVector GetMinimumBBox() const;
165 inline G4ThreeVector GetMaximumBBox() const;
166
167 G4VFacet* MakeDownFacet(const std::vector<G4ThreeVector>& fromVertices,
168 G4int ind1, G4int ind2, G4int ind3) const;
169 G4VFacet* MakeUpFacet(const std::vector<G4ThreeVector>& fromVertices,
170 G4int ind1, G4int ind2, G4int ind3) const;
171 G4VFacet* MakeSideFacet(const G4ThreeVector& downVertex0,
172 const G4ThreeVector& downVertex1,
173 const G4ThreeVector& upVertex1,
174 const G4ThreeVector& upVertex0) const;
175 G4TessellatedSolid* CreateTessellatedSolid() const;
176
177 EInside InsidePolygone(const G4ThreeVector& p,
178 const std::vector<G4TwoVector>& poly) const;
179 G4double DistToPlane(const G4ThreeVector& p,
180 const G4ThreeVector& v, const G4int ipl) const ;
181 G4double DistToTriangle(const G4ThreeVector& p,
182 const G4ThreeVector& v, const G4int ipl) const;
183 G4ThreeVector NormalToPlane(const G4ThreeVector& p,
184 const G4int ipl) const;
185 G4double SafetyToFace(const G4ThreeVector& p, const G4int iseg) const;
186 G4double GetFaceSurfaceArea(const G4ThreeVector& p0,
187 const G4ThreeVector& p1,
188 const G4ThreeVector& p2,
189 const G4ThreeVector& p3) const;
190 protected:
191
193
194 private:
195
196 // static data members
197
198 static const G4int fgkNofVertices;
199 static const G4double fgkTolerance;
200
201 // data members
202
203 G4double fDz;
204 std::vector<G4TwoVector> fVertices;
205 G4bool fIsTwisted;
206 G4double fTwist[4];
207 G4TessellatedSolid* fTessellatedSolid;
208 G4ThreeVector fMinBBoxVector;
209 G4ThreeVector fMaxBBoxVector;
210 G4int fVisSubdivisions;
211
212 enum ESide {kUndefined,kXY0,kXY1,kXY2,kXY3,kMZ,kPZ};
213 // Codes for faces (kXY[num]=num of lateral face,kMZ= minus z face etc)
214
215 G4double fSurfaceArea;
216 G4double fCubicVolume;
217 // Surface and Volume
218};
219
220#include "G4GenericTrap.icc"
221
222#endif
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
std::vector< G4ThreeVector > G4ThreeVectorList
Definition: G4VSolid.hh:85
G4VSolid * Clone() const
G4int GetNofVertices() const
G4Polyhedron * CreatePolyhedron() const
G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const
G4GenericTrap & operator=(const G4GenericTrap &rhs)
G4double GetZHalfLength() const
G4double GetCubicVolume()
G4TwoVector GetVertex(G4int index) const
G4double GetSurfaceArea()
G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=false, G4bool *validNorm=0, G4ThreeVector *n=0) const
G4ThreeVector GetPointOnSurface() const
G4double GetTwistAngle(G4int index) const
G4Polyhedron * GetPolyhedron() const
std::ostream & StreamInfo(std::ostream &os) const
G4VisExtent GetExtent() const
G4NURBS * CreateNURBS() const
EInside Inside(const G4ThreeVector &p) const
G4GeometryType GetEntityType() const
G4ThreeVector SurfaceNormal(const G4ThreeVector &p) const
const std::vector< G4TwoVector > & GetVertices() const
G4int GetVisSubdivisions() const
G4bool IsTwisted() const
void DescribeYourselfTo(G4VGraphicsScene &scene) const
void SetVisSubdivisions(G4int subdiv)
G4Polyhedron * fpPolyhedron
G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pmin, G4double &pmax) const
EAxis
Definition: geomdefs.hh:54
EInside
Definition: geomdefs.hh:58