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
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//
27// $Id$
28//
29//
30// --------------------------------------------------------------------
31// GEANT 4 class header file
32//
33//
34// G4ReduciblePolygon.hh
35//
36// Class description:
37//
38// Utility class used to specify, test, reduce, and/or otherwise
39// manipulate a 2D polygon.
40//
41// For this class, a polygon consists of n > 2 points in 2D
42// space (a,b). The polygon is always closed by connecting the
43// last point to the first. A G4ReduciblePolygon is guaranteed
44// to fulfill this definition in all instances.
45//
46// Illegal manipulations (such that a valid polygon would be
47// produced) result in an error return if possible and
48// otherwise a G4Exception.
49//
50// The set of manipulations is limited currently to what
51// is needed for G4Polycone and G4Polyhedra.
52
53// Author:
54// David C. Williams (davidw@scipp.ucsc.edu)
55// --------------------------------------------------------------------
56#ifndef G4ReduciblePolygon_hh
57#define G4ReduciblePolygon_hh
58
59#include "G4Types.hh"
60
62{
64
65 public:
66 //
67 // Creator: via simple a/b arrays
68 //
69 G4ReduciblePolygon( const G4double a[], const G4double b[], G4int n );
70
71 //
72 // Creator: a special version for G4Polygon and G4Polycone
73 // that takes two a points at planes of b
74 // (where a==r and b==z for the GEANT3 classic PCON and PGON)
75 //
76 G4ReduciblePolygon( const G4double rmin[], const G4double rmax[],
77 const G4double z[], G4int n );
78
79 virtual ~G4ReduciblePolygon();
80
81 //
82 // Queries
83 //
84 inline G4int NumVertices() const { return numVertices; }
85
86 inline G4double Amin() const { return aMin; }
87 inline G4double Amax() const { return aMax; }
88 inline G4double Bmin() const { return bMin; }
89 inline G4double Bmax() const { return bMax; }
90
91 void CopyVertices( G4double a[], G4double b[] ) const;
92
93 //
94 // Manipulations
95 //
96 void ScaleA( G4double scale );
97 void ScaleB( G4double scale );
98
101
102 void ReverseOrder();
103
104 //
105 // Tests
106 //
107 G4double Area();
108 G4bool CrossesItself( G4double tolerance );
110 G4double a2, G4double b2, G4double tolerance );
111
112 void Print(); // Debugging only
113
114 public: // without description
115
116 G4ReduciblePolygon(__void__&);
117 // Fake default constructor for usage restricted to direct object
118 // persistency for clients requiring preallocation of memory for
119 // persistifiable objects.
120
121 protected:
122
123 void Create( const G4double a[], const G4double b[], G4int n );
124
125 void CalculateMaxMin();
126
127 //
128 // Below are member values that are *always* kept up to date (please!)
129 //
132
133 //
134 // A subclass which holds the vertices in a single-linked list
135 //
136 // Yeah, call me an old-fashioned c hacker, but I cannot make
137 // myself use the rogue tools for this trivial list.
138 //
139 struct ABVertex; // Secret recipe for allowing
140 friend struct ABVertex; // protected nested structures
141 struct ABVertex
142 {
143 ABVertex() : a(0.), b(0.), next(0) {}
146 };
147
149
150 private:
151
153 G4ReduciblePolygon& operator=(const G4ReduciblePolygon&);
154 // Private copy constructor and assignment operator.
155};
156
157
158//
159// A companion class for iterating over the vertices of our polygon.
160// It is simple enough that all routines are declared inline here.
161//
163{
164 public:
165
167 { subject = theSubject; current=0; }
168
170 G4bool Next() { if (current) current=current->next; return Valid(); }
171
172 G4bool Valid() const { return current!=0; }
173
174 G4double GetA() const { return current->a; }
175 G4double GetB() const { return current->b; }
176
177 protected:
178
179 const G4ReduciblePolygon *subject; // Who are we iterating over
181};
182
183#endif
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
G4ReduciblePolygon::ABVertex * current
G4ReduciblePolygonIterator(const G4ReduciblePolygon *theSubject)
const G4ReduciblePolygon * subject
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
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)