Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4TriangularFacet.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 and of QinetiQ Ltd, *
20// * subject to DEFCON 705 IPR conditions. *
21// * By using, copying, modifying or distributing the software (or *
22// * any work based on the software) you agree to acknowledge its *
23// * use in resulting scientific publications, and indicate your *
24// * acceptance of all terms of the Geant4 Software license. *
25// ********************************************************************
26//
27// $Id$
28//
29// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
30//
31// Class G4TriangularFacet
32//
33// Class description:
34//
35// The G4TriangularFacet class is used for the contruction of
36// G4TessellatedSolid.
37// It is defined by three fVertices, which shall be supplied in anti-clockwise
38// order looking from the outsider of the solid where it belongs.
39// Its constructor:
40//
41// G4TriangularFacet (const G4ThreeVector Pt0, const G4ThreeVector vt1,
42// const G4ThreeVector vt2, G4FacetVertexType);
43//
44// takes 4 parameters to define the three fVertices:
45// 1) G4FacetvertexType = "ABSOLUTE": in this case Pt0, vt1 and vt2 are
46// the 3 fVertices in anti-clockwise order looking from the outsider.
47// 2) G4FacetvertexType = "RELATIVE": in this case the first vertex is Pt0,
48// the second vertex is Pt0+vt1 and the third vertex is Pt0+vt2, all
49// in anti-clockwise order when looking from the outsider.
50
51// CHANGE HISTORY
52// --------------
53//
54// 31 October 2004, P R Truscott, QinetiQ Ltd, UK - Created.
55// 12 October 2012, M Gayer, CERN, - Reviewed optimized implementation.
56//
57///////////////////////////////////////////////////////////////////////////////
58#ifndef G4TriangularFacet_hh
59#define G4TriangularFacet_hh 1
60
61#include "G4VFacet.hh"
62#include "G4Types.hh"
63#include "G4ThreeVector.hh"
64
66{
67 public: // with desctiption
68
71
72 G4TriangularFacet (const G4ThreeVector &vt0, const G4ThreeVector &vt1,
75
77
80
82 G4double Distance (const G4ThreeVector &p, G4double minDist);
83 G4double Distance (const G4ThreeVector &p, G4double minDist,
84 const G4bool outgoing);
85 G4double Extent (const G4ThreeVector axis);
86 G4bool Intersect (const G4ThreeVector &p, const G4ThreeVector &v,
87 const G4bool outgoing, G4double &distance,
88 G4double &distFromSurface, G4ThreeVector &normal);
91
93 void SetSurfaceNormal (G4ThreeVector normal);
94
96
97 inline G4bool IsDefined () const;
98 inline G4int GetNumberOfVertices () const;
99 inline G4ThreeVector GetVertex (G4int i) const;
100 inline void SetVertex (G4int i, const G4ThreeVector &val);
101
102 inline G4ThreeVector GetCircumcentre () const;
103 inline G4double GetRadius () const;
104
105 inline G4int AllocatedMemory();
106
107 inline G4int GetVertexIndex (G4int i) const;
108 inline void SetVertexIndex (G4int i, G4int j);
109 inline void SetVertices(std::vector<G4ThreeVector> *v);
110
111 private:
112
113 void CopyFrom(const G4TriangularFacet &rhs);
114
115 G4ThreeVector fSurfaceNormal;
116 G4double fArea;
117 G4ThreeVector fCircumcentre;
118 G4double fRadius;
119 G4int fIndices[3];
120
121 std::vector<G4ThreeVector> *fVertices;
122
123 G4double fA, fB, fC;
124 G4double fDet;
125 G4double fSqrDist;
126 G4ThreeVector fE1, fE2;
127 G4bool fIsDefined;
128};
129
130///////////////////////////////////////////////////////////////////////////////
131// Inlined Methods
132///////////////////////////////////////////////////////////////////////////////
133
135{
136 return fIsDefined;
137}
138
140{
141 return 3;
142}
143
145{
146 G4int indice = fIndices[i];
147 return indice < 0 ? (*fVertices)[i] : (*fVertices)[indice];
148}
149
151{
152 (*fVertices)[i] = val;
153}
154
156{
157 return fCircumcentre;
158}
159
161{
162 return fRadius;
163}
164
166{
167 G4int size = sizeof(*this);
168 size += GetNumberOfVertices() * sizeof(G4ThreeVector);
169 return size;
170}
171
173{
174 if (i < 3) return fIndices[i];
175 else return 999999999;
176}
177
179{
180 fIndices[i] = j;
181}
182
183inline void G4TriangularFacet::SetVertices(std::vector<G4ThreeVector> *v)
184{
185 if (fIndices[0] < 0 && fVertices)
186 {
187 delete fVertices;
188 fVertices = 0;
189 }
190 fVertices = v;
191}
192
193#endif
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
G4FacetVertexType
Definition: G4VFacet.hh:56
void SetSurfaceNormal(G4ThreeVector normal)
void SetVertex(G4int i, const G4ThreeVector &val)
G4ThreeVector GetPointOnFace() const
G4ThreeVector GetCircumcentre() const
void SetVertices(std::vector< G4ThreeVector > *v)
G4bool Intersect(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool outgoing, G4double &distance, G4double &distFromSurface, G4ThreeVector &normal)
G4TriangularFacet & operator=(const G4TriangularFacet &right)
G4bool IsDefined() const
G4int GetNumberOfVertices() const
G4TriangularFacet * GetFlippedFacet()
G4GeometryType GetEntityType() const
void SetVertexIndex(G4int i, G4int j)
G4ThreeVector Distance(const G4ThreeVector &p)
G4int GetVertexIndex(G4int i) const
G4ThreeVector GetVertex(G4int i) const
G4double GetRadius() const
G4ThreeVector GetSurfaceNormal() const
G4double Extent(const G4ThreeVector axis)