Geant4-11
G4VoxelLimits.cc
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// Class G4VoxelLimits implementation
27//
28// 13.07.95, P.Kent - Initial version
29// --------------------------------------------------------------------
30
31#include "G4VoxelLimits.hh"
32
33#include "G4ios.hh"
34
36//
37// Further restrict limits
38// No checks for illegal restrictions
39//
40void G4VoxelLimits::AddLimit( const EAxis pAxis,
41 const G4double pMin,
42 const G4double pMax )
43{
44 if ( pAxis == kXAxis )
45 {
46 if ( pMin > fxAxisMin ) fxAxisMin = pMin ;
47 if ( pMax < fxAxisMax ) fxAxisMax = pMax ;
48 }
49 else if ( pAxis == kYAxis )
50 {
51 if ( pMin > fyAxisMin ) fyAxisMin = pMin ;
52 if ( pMax < fyAxisMax ) fyAxisMax = pMax ;
53 }
54 else
55 {
56 assert( pAxis == kZAxis ) ;
57
58 if ( pMin > fzAxisMin ) fzAxisMin = pMin ;
59 if ( pMax < fzAxisMax ) fzAxisMax = pMax ;
60 }
61}
62
64//
65// ClipToLimits
66//
67// Clip the line segment pStart->pEnd to the volume described by the
68// current limits. Return true if the line remains after clipping,
69// else false, and leave the vectors in an undefined state.
70//
71// Process:
72//
73// Use Cohen-Sutherland clipping in 3D
74// [Fundamentals of Interactive Computer Graphics,Foley & Van Dam]
75//
77 G4ThreeVector& pEnd ) const
78{
79 G4int sCode, eCode ;
80 G4bool remainsAfterClip ;
81
82 // Determine if line is trivially inside (both outcodes==0) or outside
83 // (logical AND of outcodes !=0)
84
85 sCode = OutCode(pStart) ;
86 eCode = OutCode(pEnd) ;
87
88 if ( sCode & eCode )
89 {
90 // Trivially outside, no intersection with region
91
92 remainsAfterClip = false;
93 }
94 else if ( sCode == 0 && eCode == 0 )
95 {
96 // Trivially inside, no intersections
97
98 remainsAfterClip = true ;
99 }
100 else
101 {
102 // Line segment *may* cut volume boundaries
103 // At most, one end point is inside
104
105 G4double x1, y1, z1, x2, y2, z2 ;
106
107 x1 = pStart.x() ;
108 y1 = pStart.y() ;
109 z1 = pStart.z() ;
110
111 x2 = pEnd.x() ;
112 y2 = pEnd.y() ;
113 z2 = pEnd.z() ;
114
115 while ( sCode != eCode ) // Loop checking, 06.08.2015, G.Cosmo
116 {
117 // Copy vectors to work variables x1-z1,x2-z2
118 // Ensure x1-z1 lies outside volume, swapping vectors and outcodes
119 // if necessary
120
121 if ( sCode )
122 {
123 if ( sCode & 0x01 ) // Clip against fxAxisMin
124 {
125 z1 += (fxAxisMin-x1)*(z2-z1)/(x2-x1);
126 y1 += (fxAxisMin-x1)*(y2-y1)/(x2-x1);
127 x1 = fxAxisMin;
128 }
129 else if ( sCode & 0x02 ) // Clip against fxAxisMax
130 {
131 z1 += (fxAxisMax-x1)*(z2-z1)/(x2-x1);
132 y1 += (fxAxisMax-x1)*(y2-y1)/(x2-x1);
133 x1 = fxAxisMax ;
134 }
135 else if ( sCode & 0x04 ) // Clip against fyAxisMin
136 {
137 x1 += (fyAxisMin-y1)*(x2-x1)/(y2-y1);
138 z1 += (fyAxisMin-y1)*(z2-z1)/(y2-y1);
139 y1 = fyAxisMin;
140 }
141 else if ( sCode & 0x08 ) // Clip against fyAxisMax
142 {
143 x1 += (fyAxisMax-y1)*(x2-x1)/(y2-y1);
144 z1 += (fyAxisMax-y1)*(z2-z1)/(y2-y1);
145 y1 = fyAxisMax;
146 }
147 else if ( sCode & 0x10 ) // Clip against fzAxisMin
148 {
149 x1 += (fzAxisMin-z1)*(x2-x1)/(z2-z1);
150 y1 += (fzAxisMin-z1)*(y2-y1)/(z2-z1);
151 z1 = fzAxisMin;
152 }
153 else if ( sCode & 0x20 ) // Clip against fzAxisMax
154 {
155 x1 += (fzAxisMax-z1)*(x2-x1)/(z2-z1);
156 y1 += (fzAxisMax-z1)*(y2-y1)/(z2-z1);
157 z1 = fzAxisMax;
158 }
159 }
160 if ( eCode ) // Clip 2nd end: repeat of 1st, but 1<>2
161 {
162 if ( eCode & 0x01 ) // Clip against fxAxisMin
163 {
164 z2 += (fxAxisMin-x2)*(z1-z2)/(x1-x2);
165 y2 += (fxAxisMin-x2)*(y1-y2)/(x1-x2);
166 x2 = fxAxisMin;
167 }
168 else if ( eCode & 0x02 ) // Clip against fxAxisMax
169 {
170 z2 += (fxAxisMax-x2)*(z1-z2)/(x1-x2);
171 y2 += (fxAxisMax-x2)*(y1-y2)/(x1-x2);
172 x2 = fxAxisMax;
173 }
174 else if ( eCode & 0x04 ) // Clip against fyAxisMin
175 {
176 x2 += (fyAxisMin-y2)*(x1-x2)/(y1-y2);
177 z2 += (fyAxisMin-y2)*(z1-z2)/(y1-y2);
178 y2 = fyAxisMin;
179 }
180 else if (eCode&0x08) // Clip against fyAxisMax
181 {
182 x2 += (fyAxisMax-y2)*(x1-x2)/(y1-y2);
183 z2 += (fyAxisMax-y2)*(z1-z2)/(y1-y2);
184 y2 = fyAxisMax;
185 }
186 else if ( eCode & 0x10 ) // Clip against fzAxisMin
187 {
188 x2 += (fzAxisMin-z2)*(x1-x2)/(z1-z2);
189 y2 += (fzAxisMin-z2)*(y1-y2)/(z1-z2);
190 z2 = fzAxisMin;
191 }
192 else if ( eCode & 0x20 ) // Clip against fzAxisMax
193 {
194 x2 += (fzAxisMax-z2)*(x1-x2)/(z1-z2);
195 y2 += (fzAxisMax-z2)*(y1-y2)/(z1-z2);
196 z2 = fzAxisMax;
197 }
198 }
199 pStart = G4ThreeVector(x1,y1,z1);
200 pEnd = G4ThreeVector(x2,y2,z2);
201 sCode = OutCode(pStart);
202 eCode = OutCode(pEnd);
203 }
204 if ( sCode == 0 && eCode == 0 ) remainsAfterClip = true;
205 else remainsAfterClip = false;
206 }
207 return remainsAfterClip;
208}
209
211//
212// Calculate the `outcode' for the specified vector:
213// The following bits are set:
214// 0 pVec.x()<fxAxisMin && IsXLimited()
215// 1 pVec.x()>fxAxisMax && IsXLimited()
216// 2 pVec.y()<fyAxisMin && IsYLimited()
217// 3 pVec.y()>fyAxisMax && IsYLimited()
218// 4 pVec.z()<fzAxisMin && IsZLimited()
219// 5 pVec.z()>fzAxisMax && IsZLimited()
220//
222{
223 G4int code = 0 ; // The outcode
224
225 if ( IsXLimited() )
226 {
227 if ( pVec.x() < fxAxisMin ) code |= 0x01 ;
228 if ( pVec.x() > fxAxisMax ) code |= 0x02 ;
229 }
230 if ( IsYLimited() )
231 {
232 if ( pVec.y() < fyAxisMin ) code |= 0x04 ;
233 if ( pVec.y() > fyAxisMax ) code |= 0x08 ;
234 }
235 if (IsZLimited())
236 {
237 if ( pVec.z() < fzAxisMin ) code |= 0x10 ;
238 if ( pVec.z() > fzAxisMax ) code |= 0x20 ;
239 }
240 return code;
241}
242
244
245std::ostream& operator << (std::ostream& os, const G4VoxelLimits& pLim)
246{
247 os << "{";
248 if (pLim.IsXLimited())
249 {
250 os << "(" << pLim.GetMinXExtent()
251 << "," << pLim.GetMaxXExtent() << ") ";
252 }
253 else
254 {
255 os << "(-,-) ";
256 }
257 if (pLim.IsYLimited())
258 {
259 os << "(" << pLim.GetMinYExtent()
260 << "," << pLim.GetMaxYExtent() << ") ";
261 }
262 else
263 {
264 os << "(-,-) ";
265 }
266 if (pLim.IsZLimited())
267 {
268 os << "(" << pLim.GetMinZExtent()
269 << "," << pLim.GetMaxZExtent() << ")";
270 }
271 else
272 {
273 os << "(-,-)";
274 }
275 os << "}";
276 return os;
277}
static const G4double pMax
static const G4double pMin
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
double z() const
double x() const
double y() const
G4int OutCode(const G4ThreeVector &pVec) const
G4double fzAxisMax
G4double fzAxisMin
G4bool IsYLimited() const
G4double fxAxisMin
G4bool ClipToLimits(G4ThreeVector &pStart, G4ThreeVector &pEnd) const
G4double GetMinZExtent() const
void AddLimit(const EAxis pAxis, const G4double pMin, const G4double pMax)
G4bool IsXLimited() const
G4double GetMaxYExtent() const
G4double GetMaxZExtent() const
G4double GetMinYExtent() const
G4double fxAxisMax
G4double GetMinXExtent() const
G4double fyAxisMax
G4bool IsZLimited() const
G4double fyAxisMin
G4double GetMaxXExtent() const
std::ostream & operator<<(std::ostream &, const BasicVector3D< float > &)
EAxis
Definition: geomdefs.hh:54
@ kYAxis
Definition: geomdefs.hh:56
@ kXAxis
Definition: geomdefs.hh:55
@ kZAxis
Definition: geomdefs.hh:57
Definition: inftrees.h:24