Geant4-11
G4ReduciblePolygon.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// 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
53{
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
92
93 void ReverseOrder();
94 void StartWithZMin();
95
96 //
97 // Tests
98 //
99 G4double Area();
100 G4bool CrossesItself( G4double tolerance );
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 //
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) {}
138 };
139
141
142 private:
143
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//
153{
154 public:
155
157 { subject = theSubject; current = nullptr; }
158
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
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
G4ReduciblePolygon::ABVertex * current
G4ReduciblePolygonIterator(const G4ReduciblePolygon *theSubject)
const G4ReduciblePolygon * subject
G4ReduciblePolygon(const G4double a[], const G4double b[], G4int n)
G4bool BisectedBy(G4double a1, G4double b1, G4double a2, G4double b2, G4double tolerance)
void Create(const G4double a[], const G4double b[], G4int n)
void ScaleB(G4double scale)
G4double Amin() const
void CopyVertices(G4double a[], G4double b[]) const
G4ReduciblePolygon(const G4ReduciblePolygon &)
G4ReduciblePolygon & operator=(const G4ReduciblePolygon &)
G4bool RemoveDuplicateVertices(G4double tolerance)
G4int NumVertices() const
G4bool RemoveRedundantVertices(G4double tolerance)
G4double Bmin() const
G4bool CrossesItself(G4double tolerance)
G4double Bmax() const
G4double Amax() const
void ScaleA(G4double scale)