00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include "G4VoxelLimits.hh"
00040
00041 #include "G4ios.hh"
00042
00044
00045
00046
00047
00048 G4VoxelLimits::G4VoxelLimits()
00049 : fxAxisMin(-kInfinity),fxAxisMax(kInfinity),
00050 fyAxisMin(-kInfinity),fyAxisMax(kInfinity),
00051 fzAxisMin(-kInfinity),fzAxisMax(kInfinity)
00052 {
00053 }
00054
00055 G4VoxelLimits::~G4VoxelLimits()
00056 {
00057 }
00058
00060
00061
00062
00063
00064
00065 void G4VoxelLimits::AddLimit( const EAxis pAxis,
00066 const G4double pMin,
00067 const G4double pMax )
00068 {
00069 if ( pAxis == kXAxis )
00070 {
00071 if ( pMin > fxAxisMin ) fxAxisMin = pMin ;
00072 if ( pMax < fxAxisMax ) fxAxisMax = pMax ;
00073 }
00074 else if ( pAxis == kYAxis )
00075 {
00076 if ( pMin > fyAxisMin ) fyAxisMin = pMin ;
00077 if ( pMax < fyAxisMax ) fyAxisMax = pMax ;
00078 }
00079 else
00080 {
00081 assert( pAxis == kZAxis ) ;
00082
00083 if ( pMin > fzAxisMin ) fzAxisMin = pMin ;
00084 if ( pMax < fzAxisMax ) fzAxisMax = pMax ;
00085 }
00086 }
00087
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102 G4bool G4VoxelLimits::ClipToLimits( G4ThreeVector& pStart,
00103 G4ThreeVector& pEnd ) const
00104 {
00105 G4int sCode, eCode ;
00106 G4bool remainsAfterClip ;
00107
00108
00109
00110
00111 sCode = OutCode(pStart) ;
00112 eCode = OutCode(pEnd) ;
00113
00114 if ( sCode & eCode )
00115 {
00116
00117
00118 remainsAfterClip = false;
00119 }
00120 else if ( sCode == 0 && eCode == 0 )
00121 {
00122
00123
00124 remainsAfterClip = true ;
00125 }
00126 else
00127 {
00128
00129
00130
00131 G4double x1, y1, z1, x2, y2, z2 ;
00132
00133 x1 = pStart.x() ;
00134 y1 = pStart.y() ;
00135 z1 = pStart.z() ;
00136
00137 x2 = pEnd.x() ;
00138 y2 = pEnd.y() ;
00139 z2 = pEnd.z() ;
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154 while ( sCode != eCode )
00155 {
00156
00157
00158
00159
00160 if ( sCode )
00161 {
00162 if ( sCode & 0x01 )
00163 {
00164 z1 += (fxAxisMin-x1)*(z2-z1)/(x2-x1);
00165 y1 += (fxAxisMin-x1)*(y2-y1)/(x2-x1);
00166 x1 = fxAxisMin;
00167 }
00168 else if ( sCode & 0x02 )
00169 {
00170 z1 += (fxAxisMax-x1)*(z2-z1)/(x2-x1);
00171 y1 += (fxAxisMax-x1)*(y2-y1)/(x2-x1);
00172 x1 = fxAxisMax ;
00173 }
00174 else if ( sCode & 0x04 )
00175 {
00176 x1 += (fyAxisMin-y1)*(x2-x1)/(y2-y1);
00177 z1 += (fyAxisMin-y1)*(z2-z1)/(y2-y1);
00178 y1 = fyAxisMin;
00179 }
00180 else if ( sCode & 0x08 )
00181 {
00182 x1 += (fyAxisMax-y1)*(x2-x1)/(y2-y1);
00183 z1 += (fyAxisMax-y1)*(z2-z1)/(y2-y1);
00184 y1 = fyAxisMax;
00185 }
00186 else if ( sCode & 0x10 )
00187 {
00188 x1 += (fzAxisMin-z1)*(x2-x1)/(z2-z1);
00189 y1 += (fzAxisMin-z1)*(y2-y1)/(z2-z1);
00190 z1 = fzAxisMin;
00191 }
00192 else if ( sCode & 0x20 )
00193 {
00194 x1 += (fzAxisMax-z1)*(x2-x1)/(z2-z1);
00195 y1 += (fzAxisMax-z1)*(y2-y1)/(z2-z1);
00196 z1 = fzAxisMax;
00197 }
00198 }
00199 if ( eCode )
00200 {
00201 if ( eCode & 0x01 )
00202 {
00203 z2 += (fxAxisMin-x2)*(z1-z2)/(x1-x2);
00204 y2 += (fxAxisMin-x2)*(y1-y2)/(x1-x2);
00205 x2 = fxAxisMin;
00206 }
00207 else if ( eCode & 0x02 )
00208 {
00209 z2 += (fxAxisMax-x2)*(z1-z2)/(x1-x2);
00210 y2 += (fxAxisMax-x2)*(y1-y2)/(x1-x2);
00211 x2 = fxAxisMax;
00212 }
00213 else if ( eCode & 0x04 )
00214 {
00215 x2 += (fyAxisMin-y2)*(x1-x2)/(y1-y2);
00216 z2 += (fyAxisMin-y2)*(z1-z2)/(y1-y2);
00217 y2 = fyAxisMin;
00218 }
00219 else if (eCode&0x08)
00220 {
00221 x2 += (fyAxisMax-y2)*(x1-x2)/(y1-y2);
00222 z2 += (fyAxisMax-y2)*(z1-z2)/(y1-y2);
00223 y2 = fyAxisMax;
00224 }
00225 else if ( eCode & 0x10 )
00226 {
00227 x2 += (fzAxisMin-z2)*(x1-x2)/(z1-z2);
00228 y2 += (fzAxisMin-z2)*(y1-y2)/(z1-z2);
00229 z2 = fzAxisMin;
00230 }
00231 else if ( eCode & 0x20 )
00232 {
00233 x2 += (fzAxisMax-z2)*(x1-x2)/(z1-z2);
00234 y2 += (fzAxisMax-z2)*(y1-y2)/(z1-z2);
00235 z2 = fzAxisMax;
00236 }
00237 }
00238
00239 pStart = G4ThreeVector(x1,y1,z1);
00240 pEnd = G4ThreeVector(x2,y2,z2);
00241 sCode = OutCode(pStart);
00242 eCode = OutCode(pEnd);
00243 }
00244 if ( sCode == 0 && eCode == 0 ) remainsAfterClip = true;
00245 else remainsAfterClip = false;
00246 }
00247 return remainsAfterClip;
00248 }
00249
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262 G4int G4VoxelLimits::OutCode( const G4ThreeVector& pVec ) const
00263 {
00264 G4int code = 0 ;
00265
00266 if ( IsXLimited() )
00267 {
00268 if ( pVec.x() < fxAxisMin ) code |= 0x01 ;
00269 if ( pVec.x() > fxAxisMax ) code |= 0x02 ;
00270 }
00271 if ( IsYLimited() )
00272 {
00273 if ( pVec.y() < fyAxisMin ) code |= 0x04 ;
00274 if ( pVec.y() > fyAxisMax ) code |= 0x08 ;
00275 }
00276 if (IsZLimited())
00277 {
00278 if ( pVec.z() < fzAxisMin ) code |= 0x10 ;
00279 if ( pVec.z() > fzAxisMax ) code |= 0x20 ;
00280 }
00281 return code;
00282 }
00283
00285
00286 std::ostream& operator << (std::ostream& os, const G4VoxelLimits& pLim)
00287 {
00288 os << "{";
00289 if (pLim.IsXLimited())
00290 {
00291 os << "(" << pLim.GetMinXExtent()
00292 << "," << pLim.GetMaxXExtent() << ") ";
00293 }
00294 else
00295 {
00296 os << "(-,-) ";
00297 }
00298 if (pLim.IsYLimited())
00299 {
00300 os << "(" << pLim.GetMinYExtent()
00301 << "," << pLim.GetMaxYExtent() << ") ";
00302 }
00303 else
00304 {
00305 os << "(-,-) ";
00306 }
00307 if (pLim.IsZLimited())
00308 {
00309 os << "(" << pLim.GetMinZExtent()
00310 << "," << pLim.GetMaxZExtent() << ")";
00311 }
00312 else
00313 {
00314 os << "(-,-)";
00315 }
00316 os << "}";
00317 return os;
00318 }