ECCE @ EIC Software
Reference for
ECCE @ EIC
simulation and reconstruction software on GitHub
Home page
Related Pages
Modules
Namespaces
Classes
Files
External Links
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
G4ReduciblePolygon.hh
Go to the documentation of this file.
Or view
the newest version in sPHENIX GitHub for file G4ReduciblePolygon.hh
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
// G4ReduciblePolygon
27
//
28
// Class description:
29
//
30
// Utility class used to specify, test, reduce, and/or otherwise
31
// manipulate a 2D polygon.
32
//
33
// For this class, a polygon consists of n > 2 points in 2D
34
// space (a,b). The polygon is always closed by connecting the
35
// last point to the first. A G4ReduciblePolygon is guaranteed
36
// to fulfill this definition in all instances.
37
//
38
// Illegal manipulations (such that a valid polygon would be
39
// produced) result in an error return if possible and
40
// otherwise a G4Exception.
41
//
42
// The set of manipulations is limited currently to what
43
// is needed for G4Polycone and G4Polyhedra.
44
45
// Author: David C. Williams (davidw@scipp.ucsc.edu)
46
// --------------------------------------------------------------------
47
#ifndef G4REDUCIBLEPOLYGON_HH
48
#define G4REDUCIBLEPOLYGON_HH
49
50
#include "
G4Types.hh
"
51
52
class
G4ReduciblePolygon
53
{
54
friend
class
G4ReduciblePolygonIterator
;
55
56
public
:
57
//
58
// Creator: via simple a/b arrays
59
//
60
G4ReduciblePolygon
(
const
G4double
a
[],
const
G4double
b
[],
G4int
n
);
61
62
//
63
// Creator: a special version for G4Polygon and G4Polycone
64
// that takes two a points at planes of b
65
// (where a==r and b==z for the GEANT3 classic PCON and PGON)
66
//
67
G4ReduciblePolygon
(
const
G4double
rmin[],
const
G4double
rmax
[],
68
const
G4double
z
[],
G4int
n
);
69
70
virtual
~G4ReduciblePolygon
();
71
72
//
73
// Queries
74
//
75
inline
G4int
NumVertices
()
const
{
return
numVertices
; }
76
77
inline
G4double
Amin
()
const
{
return
aMin
; }
78
inline
G4double
Amax
()
const
{
return
aMax
; }
79
inline
G4double
Bmin
()
const
{
return
bMin
; }
80
inline
G4double
Bmax
()
const
{
return
bMax
; }
81
82
void
CopyVertices
(
G4double
a
[],
G4double
b
[] )
const
;
83
84
//
85
// Manipulations
86
//
87
void
ScaleA
(
G4double
scale
);
88
void
ScaleB
(
G4double
scale
);
89
90
G4bool
RemoveDuplicateVertices
(
G4double
tolerance );
91
G4bool
RemoveRedundantVertices
(
G4double
tolerance );
92
93
void
ReverseOrder
();
94
void
StartWithZMin
();
95
96
//
97
// Tests
98
//
99
G4double
Area
();
100
G4bool
CrossesItself
(
G4double
tolerance );
101
G4bool
BisectedBy
(
G4double
a1,
G4double
b1,
102
G4double
a2,
G4double
b2,
G4double
tolerance );
103
104
void
Print
();
// Debugging only
105
106
public
:
// without description
107
108
G4ReduciblePolygon
(__void__&);
109
// Fake default constructor for usage restricted to direct object
110
// persistency for clients requiring preallocation of memory for
111
// persistifiable objects.
112
113
protected
:
114
115
void
Create
(
const
G4double
a
[],
const
G4double
b
[],
G4int
n
);
116
117
void
CalculateMaxMin
();
118
119
//
120
// Below are member values that are *always* kept up to date (please!)
121
//
122
G4double
aMin
,
aMax
,
bMin
,
bMax
;
123
G4int
numVertices
= 0;
124
125
//
126
// A subclass which holds the vertices in a single-linked list
127
//
128
// Yeah, call me an old-fashioned c hacker, but I cannot make
129
// myself use the rogue tools for this trivial list.
130
//
131
struct
ABVertex
;
// Secret recipe for allowing
132
friend
struct
ABVertex
;
// protected nested structures
133
struct
ABVertex
134
{
135
ABVertex
() :
a
(0.),
b
(0.),
next
(0) {}
136
G4double
a
,
b
;
137
ABVertex
*
next
;
138
};
139
140
ABVertex
*
vertexHead
=
nullptr
;
141
142
private
:
143
144
G4ReduciblePolygon
(
const
G4ReduciblePolygon
&);
145
G4ReduciblePolygon
&
operator=
(
const
G4ReduciblePolygon
&);
146
// Private copy constructor and assignment operator.
147
};
148
149
// A companion class for iterating over the vertices of our polygon.
150
// It is simple enough that all routines are declared inline here.
151
//
152
class
G4ReduciblePolygonIterator
153
{
154
public
:
155
156
G4ReduciblePolygonIterator
(
const
G4ReduciblePolygon
* theSubject )
157
{
subject
= theSubject;
current
=
nullptr
; }
158
159
void
Begin
() {
current
=
subject
->
vertexHead
; }
160
G4bool
Next
()
161
{
162
if
(
current
!=
nullptr
)
current
=
current
->
next
;
163
return
Valid
();
164
}
165
166
G4bool
Valid
()
const
{
return
current
!=
nullptr
; }
167
168
G4double
GetA
()
const
{
return
current
->
a
; }
169
G4double
GetB
()
const
{
return
current
->
b
; }
170
171
protected
:
172
173
const
G4ReduciblePolygon
*
subject
=
nullptr
;
// Who are we iterating over
174
G4ReduciblePolygon::ABVertex
*
current
=
nullptr
;
// Current vertex
175
};
176
177
#endif
geant4
tree
geant4-10.6-release
source
geometry
solids
specific
include
G4ReduciblePolygon.hh
Built by
Jin Huang
. updated:
Wed Jun 29 2022 17:25:19
using
1.8.2 with
ECCE GitHub integration