299 if (
true)
return bbox.
CalculateExtent(pAxis,pVoxelLimit,pTransform,pMin,pMax);
303 return exist = pMin < pMax;
316 const G4int NSTEPS = 24;
318 G4int ksteps = (dphi <= astep) ? 1 : (
G4int)((dphi-deg)/astep) + 1;
321 G4double sinHalf = std::sin(0.5*ang);
322 G4double cosHalf = std::cos(0.5*ang);
323 G4double sinStep = 2.*sinHalf*cosHalf;
324 G4double cosStep = 1. - 2.*sinHalf*sinHalf;
330 if (rmin1 == 0 && rmin2 == 0 && dphi == twopi)
336 for (
G4int k=0; k<NSTEPS; ++k)
338 baseA[k].set(rext1*cosCur,rext1*sinCur,-dz);
339 baseB[k].set(rext2*cosCur,rext2*sinCur, dz);
342 sinCur = sinCur*cosStep + cosCur*sinStep;
343 cosCur = cosCur*cosStep - sinTmp*sinStep;
345 std::vector<const G4ThreeVectorList *> polygons(2);
346 polygons[0] = &baseA;
347 polygons[1] = &baseB;
357 G4double sinCur = sinStart*cosHalf + cosStart*sinHalf;
358 G4double cosCur = cosStart*cosHalf - sinStart*sinHalf;
362 for (
G4int k=0; k<ksteps+2; ++k)
366 pols[0][0].set(rmin2*cosStart,rmin2*sinStart, dz);
367 pols[0][1].set(rmin1*cosStart,rmin1*sinStart,-dz);
368 pols[0][2].set(rmax1*cosStart,rmax1*sinStart,-dz);
369 pols[0][3].set(rmax2*cosStart,rmax2*sinStart, dz);
370 for (
G4int k=1; k<ksteps+1; ++k)
372 pols[k][0].set(rmin2*cosCur,rmin2*sinCur, dz);
373 pols[k][1].set(rmin1*cosCur,rmin1*sinCur,-dz);
374 pols[k][2].set(rext1*cosCur,rext1*sinCur,-dz);
375 pols[k][3].set(rext2*cosCur,rext2*sinCur, dz);
378 sinCur = sinCur*cosStep + cosCur*sinStep;
379 cosCur = cosCur*cosStep - sinTmp*sinStep;
381 pols[ksteps+1][0].set(rmin2*cosEnd,rmin2*sinEnd, dz);
382 pols[ksteps+1][1].set(rmin1*cosEnd,rmin1*sinEnd,-dz);
383 pols[ksteps+1][2].set(rmax1*cosEnd,rmax1*sinEnd,-dz);
384 pols[ksteps+1][3].set(rmax2*cosEnd,rmax2*sinEnd, dz);
387 std::vector<const G4ThreeVectorList *> polygons;
388 polygons.resize(ksteps+2);
389 for (
G4int k=0; k<ksteps+2; ++k)
391 polygons[k] = &pols[k];
407 G4int noSurfaces = 0;
410 G4double distSPhi = kInfinity, distEPhi = kInfinity;
411 G4double tanRMin, secRMin, pRMin, widRMin;
412 G4double tanRMax, secRMax, pRMax, widRMax;
417 distZ = std::fabs(std::fabs(p.
z()) - fDz);
418 rho = std::sqrt(p.
x()*p.
x() + p.
y()*p.
y());
420 tanRMin = (fRmin2 - fRmin1)*0.5/fDz;
421 secRMin = std::sqrt(1 + tanRMin*tanRMin);
422 pRMin = rho - p.
z()*tanRMin;
423 widRMin = fRmin2 - fDz*tanRMin;
424 distRMin = std::fabs(pRMin - widRMin)/secRMin;
426 tanRMax = (fRmax2 - fRmax1)*0.5/fDz;
427 secRMax = std::sqrt(1+tanRMax*tanRMax);
428 pRMax = rho - p.
z()*tanRMax;
429 widRMax = fRmax2 - fDz*tanRMax;
430 distRMax = std::fabs(pRMax - widRMax)/secRMax;
436 pPhi = std::atan2(p.
y(),p.
x());
438 if (pPhi < fSPhi-halfCarTolerance) { pPhi += twopi; }
439 else if (pPhi > fSPhi+fDPhi+halfCarTolerance) { pPhi -= twopi; }
441 distSPhi = std::fabs( pPhi - fSPhi );
442 distEPhi = std::fabs( pPhi - fSPhi - fDPhi );
444 else if( ((fRmin1) == 0.0) || ((fRmin2) == 0.0) )
452 if ( rho > halfCarTolerance )
454 nR =
G4ThreeVector(p.
x()/rho/secRMax, p.
y()/rho/secRMax, -tanRMax/secRMax);
455 if ((fRmin1 != 0.0) || (fRmin2 != 0.0))
457 nr =
G4ThreeVector(-p.
x()/rho/secRMin,-p.
y()/rho/secRMin,tanRMin/secRMin);
461 if( distRMax <= halfCarTolerance )
466 if( ((fRmin1 != 0.0) || (fRmin2 != 0.0)) && (distRMin <= halfCarTolerance) )
473 if (distSPhi <= halfAngTolerance)
478 if (distEPhi <= halfAngTolerance)
484 if (distZ <= halfCarTolerance)
487 if ( p.
z() >= 0.) { sumnorm += nZ; }
488 else { sumnorm -= nZ; }
490 if ( noSurfaces == 0 )
493 G4Exception(
"G4Cons::SurfaceNormal(p)",
"GeomSolids1002",
496 norm = ApproxSurfaceNormal(p);
498 else if ( noSurfaces == 1 ) { norm = sumnorm; }
499 else { norm = sumnorm.
unit(); }
651 const G4double dRmax = 50*(fRmax1+fRmax2);
653 G4double tanRMax,secRMax,rMaxAv,rMaxOAv ;
654 G4double tanRMin,secRMin,rMinAv,rMinOAv ;
657 G4double tolORMin,tolORMin2,tolIRMin,tolIRMin2 ;
658 G4double tolORMax2,tolIRMax,tolIRMax2 ;
661 G4double Dist,sd,xi,yi,zi,ri=0.,risec,rhoi2,cosPsi ;
671 tanRMin = (fRmin2 - fRmin1)*0.5/fDz ;
672 secRMin = std::sqrt(1.0 + tanRMin*tanRMin) ;
673 rMinAv = (fRmin1 + fRmin2)*0.5 ;
675 if (rMinAv > halfRadTolerance)
677 rMinOAv = rMinAv - halfRadTolerance ;
683 tanRMax = (fRmax2 - fRmax1)*0.5/fDz ;
684 secRMax = std::sqrt(1.0 + tanRMax*tanRMax) ;
685 rMaxAv = (fRmax1 + fRmax2)*0.5 ;
686 rMaxOAv = rMaxAv + halfRadTolerance ;
690 tolIDz = fDz - halfCarTolerance ;
691 tolODz = fDz + halfCarTolerance ;
693 if (std::fabs(p.
z()) >= tolIDz)
695 if ( p.
z()*v.
z() < 0 )
697 sd = (std::fabs(p.
z()) - fDz)/std::fabs(v.
z()) ;
699 if( sd < 0.0 ) { sd = 0.0; }
701 xi = p.
x() + sd*v.
x() ;
702 yi = p.
y() + sd*v.
y() ;
703 rhoi2 = xi*xi + yi*yi ;
710 tolORMin = fRmin1 - halfRadTolerance*secRMin ;
711 tolIRMin = fRmin1 + halfRadTolerance*secRMin ;
712 tolIRMax = fRmax1 - halfRadTolerance*secRMin ;
718 tolORMin = fRmin2 - halfRadTolerance*secRMin ;
719 tolIRMin = fRmin2 + halfRadTolerance*secRMin ;
720 tolIRMax = fRmax2 - halfRadTolerance*secRMin ;
727 tolIRMin2 = tolIRMin*tolIRMin ;
734 if ( tolIRMax > 0 ) { tolIRMax2 = tolIRMax*tolIRMax; }
735 else { tolIRMax2 = 0.0; }
737 if ( (tolIRMin2 <= rhoi2) && (rhoi2 <= tolIRMax2) )
739 if ( !fPhiFullCone && (rhoi2 != 0.0) )
743 cosPsi = (xi*cosCPhi + yi*sinCPhi)/std::sqrt(rhoi2) ;
745 if (cosPsi >= cosHDPhiIT) {
return sd; }
778 t1 = 1.0 - v.
z()*v.
z() ;
779 t2 = p.
x()*v.
x() + p.
y()*v.
y() ;
780 t3 = p.
x()*p.
x() + p.
y()*p.
y() ;
781 rin = tanRMin*p.
z() + rMinAv ;
782 rout = tanRMax*p.
z() + rMaxAv ;
787 nt1 = t1 - (tanRMax*v.
z())*(tanRMax*v.
z()) ;
788 nt2 = t2 - tanRMax*v.
z()*rout ;
789 nt3 = t3 - rout*rout ;
791 if (std::fabs(nt1) > kRadTolerance)
796 if ( (nt3 > rout*rout*kRadTolerance*kRadTolerance*secRMax*secRMax)
805 if ((rout < 0) && (nt3 <= 0))
810 if (b>0) { sd = c/(-b-std::sqrt(d)); }
811 else { sd = -b + std::sqrt(d); }
815 if ((b <= 0) && (c >= 0))
817 sd=c/(-b+std::sqrt(d));
823 sd = -b + std::sqrt(d) ;
824 if((sd<0.0) && (sd>-halfRadTolerance)) { sd = 0.0; }
836 G4double fTerm = sd-std::fmod(sd,dRmax);
839 zi = p.
z() + sd*v.
z() ;
841 if (std::fabs(zi) <= tolODz)
845 if ( fPhiFullCone ) {
return sd; }
847 xi = p.
x() + sd*v.
x() ;
848 yi = p.
y() + sd*v.
y() ;
849 ri = rMaxAv + zi*tanRMax ;
850 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri ;
852 if ( cosPsi >= cosHDPhiIT ) {
return sd; }
862 if ( ( t3 > (rin + halfRadTolerance*secRMin)*
863 (rin + halfRadTolerance*secRMin) )
864 && (nt2 < 0) && (d >= 0) && (std::fabs(p.
z()) <= tolIDz) )
871 risec = std::sqrt(xi*xi + yi*yi)*secRMax ;
875 cosPsi = (p.
x()*cosCPhi + p.
y()*sinCPhi)/std::sqrt(t3) ;
876 if ( cosPsi >= cosHDPhiIT )
878 if ( Normal.
dot(v) <= 0 ) {
return 0.0; }
883 if ( Normal.
dot(v) <= 0 ) {
return 0.0; }
890 if ( std::fabs(nt2) > kRadTolerance )
894 if ( sd < 0 ) {
return kInfinity; }
897 zi = p.
z() + sd*v.
z() ;
899 if ((std::fabs(zi) <= tolODz) && (nt2 < 0))
903 if ( fPhiFullCone ) {
return sd; }
905 xi = p.
x() + sd*v.
x() ;
906 yi = p.
y() + sd*v.
y() ;
907 ri = rMaxAv + zi*tanRMax ;
908 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri ;
910 if (cosPsi >= cosHDPhiIT) {
return sd; }
930 nt1 = t1 - (tanRMin*v.
z())*(tanRMin*v.
z()) ;
931 nt2 = t2 - tanRMin*v.
z()*rin ;
936 if ( nt3 > rin*kRadTolerance*secRMin )
946 if(b>0){sd = c/( -b-std::sqrt(d));}
947 else {sd = -b + std::sqrt(d) ;}
953 G4double fTerm = sd-std::fmod(sd,dRmax);
956 zi = p.
z() + sd*v.
z() ;
958 if ( std::fabs(zi) <= tolODz )
962 xi = p.
x() + sd*v.
x() ;
963 yi = p.
y() + sd*v.
y() ;
964 ri = rMinAv + zi*tanRMin ;
965 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri ;
967 if (cosPsi >= cosHDPhiIT)
969 if ( sd > halfRadTolerance ) { snxt=sd; }
974 risec = std::sqrt(xi*xi + yi*yi)*secRMin ;
976 if ( Normal.
dot(v) <= 0 ) { snxt = sd; }
982 if ( sd > halfRadTolerance ) {
return sd; }
986 xi = p.
x() + sd*v.
x() ;
987 yi = p.
y() + sd*v.
y() ;
988 risec = std::sqrt(xi*xi + yi*yi)*secRMin ;
989 Normal =
G4ThreeVector(-xi/risec,-yi/risec,tanRMin/secRMin) ;
990 if ( Normal.
dot(v) <= 0 ) {
return sd; }
996 else if ( nt3 < -rin*kRadTolerance*secRMin )
1009 if (b>0) { sd = c/(-b-std::sqrt(d)); }
1010 else { sd = -b + std::sqrt(d); }
1011 zi = p.
z() + sd*v.
z() ;
1012 ri = rMinAv + zi*tanRMin ;
1016 if ( (sd >= 0) && (std::fabs(zi) <= tolODz) )
1020 G4double fTerm = sd-std::fmod(sd,dRmax);
1023 if ( !fPhiFullCone )
1025 xi = p.
x() + sd*v.
x() ;
1026 yi = p.
y() + sd*v.
y() ;
1027 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri ;
1029 if (cosPsi >= cosHDPhiOT)
1031 if ( sd > halfRadTolerance ) { snxt=sd; }
1036 risec = std::sqrt(xi*xi + yi*yi)*secRMin ;
1037 Normal =
G4ThreeVector(-xi/risec,-yi/risec,tanRMin/secRMin);
1038 if ( Normal.
dot(v) <= 0 ) { snxt = sd; }
1044 if( sd > halfRadTolerance ) {
return sd; }
1048 xi = p.
x() + sd*v.
x() ;
1049 yi = p.
y() + sd*v.
y() ;
1050 risec = std::sqrt(xi*xi + yi*yi)*secRMin ;
1051 Normal =
G4ThreeVector(-xi/risec,-yi/risec,tanRMin/secRMin) ;
1052 if ( Normal.
dot(v) <= 0 ) {
return sd; }
1058 if (b>0) { sd = -b - std::sqrt(d); }
1059 else { sd = c/(-b+std::sqrt(d)); }
1060 zi = p.
z() + sd*v.
z() ;
1061 ri = rMinAv + zi*tanRMin ;
1063 if ( (sd >= 0) && (ri > 0) && (std::fabs(zi) <= tolODz) )
1067 G4double fTerm = sd-std::fmod(sd,dRmax);
1070 if ( !fPhiFullCone )
1072 xi = p.
x() + sd*v.
x() ;
1073 yi = p.
y() + sd*v.
y() ;
1074 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri ;
1076 if (cosPsi >= cosHDPhiIT)
1078 if ( sd > halfRadTolerance ) { snxt=sd; }
1083 risec = std::sqrt(xi*xi + yi*yi)*secRMin ;
1084 Normal =
G4ThreeVector(-xi/risec,-yi/risec,tanRMin/secRMin);
1085 if ( Normal.
dot(v) <= 0 ) { snxt = sd; }
1091 if ( sd > halfRadTolerance ) {
return sd; }
1095 xi = p.
x() + sd*v.
x() ;
1096 yi = p.
y() + sd*v.
y() ;
1097 risec = std::sqrt(xi*xi + yi*yi)*secRMin ;
1098 Normal =
G4ThreeVector(-xi/risec,-yi/risec,tanRMin/secRMin) ;
1099 if ( Normal.
dot(v) <= 0 ) {
return sd; }
1112 if ( std::fabs(p.
z()) <= tolODz )
1118 if ( !fPhiFullCone )
1120 cosPsi = (p.
x()*cosCPhi + p.
y()*sinCPhi)/std::sqrt(t3) ;
1122 if (cosPsi >= cosHDPhiIT) {
return 0.0; }
1124 else {
return 0.0; }
1137 if (b>0) { sd = -b - std::sqrt(d); }
1138 else { sd = c/(-b+std::sqrt(d)); }
1139 zi = p.
z() + sd*v.
z() ;
1140 ri = rMinAv + zi*tanRMin ;
1144 if (b>0) { sd = c/(-b-std::sqrt(d)); }
1145 else { sd = -b + std::sqrt(d); }
1147 zi = p.
z() + sd*v.
z() ;
1149 if ( (sd >= 0) && (std::fabs(zi) <= tolODz) )
1153 G4double fTerm = sd-std::fmod(sd,dRmax);
1156 if ( !fPhiFullCone )
1158 xi = p.
x() + sd*v.
x() ;
1159 yi = p.
y() + sd*v.
y() ;
1160 ri = rMinAv + zi*tanRMin ;
1161 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri ;
1163 if ( cosPsi >= cosHDPhiIT ) { snxt = sd; }
1168 else {
return kInfinity; }
1180 if (b>0) { sd = c/(-b-std::sqrt(d)); }
1181 else { sd = -b + std::sqrt(d) ; }
1182 zi = p.
z() + sd*v.
z() ;
1184 if ( (sd >= 0) && (std::fabs(zi) <= tolODz) )
1188 G4double fTerm = sd-std::fmod(sd,dRmax);
1191 if ( !fPhiFullCone )
1193 xi = p.
x() + sd*v.
x();
1194 yi = p.
y() + sd*v.
y();
1195 ri = rMinAv + zi*tanRMin ;
1196 cosPsi = (xi*cosCPhi + yi*sinCPhi)/ri;
1198 if (cosPsi >= cosHDPhiIT) { snxt = sd; }
1217 if ( !fPhiFullCone )
1221 Comp = v.
x()*sinSPhi - v.
y()*cosSPhi ;
1225 Dist = (p.
y()*cosSPhi - p.
x()*sinSPhi) ;
1227 if (Dist < halfCarTolerance)
1233 if ( sd < 0 ) { sd = 0.0; }
1235 zi = p.
z() + sd*v.
z() ;
1237 if ( std::fabs(zi) <= tolODz )
1239 xi = p.
x() + sd*v.
x() ;
1240 yi = p.
y() + sd*v.
y() ;
1241 rhoi2 = xi*xi + yi*yi ;
1242 tolORMin2 = (rMinOAv + zi*tanRMin)*(rMinOAv + zi*tanRMin) ;
1243 tolORMax2 = (rMaxOAv + zi*tanRMax)*(rMaxOAv + zi*tanRMax) ;
1245 if ( (rhoi2 >= tolORMin2) && (rhoi2 <= tolORMax2) )
1250 if ((yi*cosCPhi - xi*sinCPhi) <= 0 ) { snxt = sd; }
1259 Comp = -(v.
x()*sinEPhi - v.
y()*cosEPhi) ;
1263 Dist = -(p.
y()*cosEPhi - p.
x()*sinEPhi) ;
1264 if (Dist < halfCarTolerance)
1270 if ( sd < 0 ) { sd = 0.0; }
1272 zi = p.
z() + sd*v.
z() ;
1274 if (std::fabs(zi) <= tolODz)
1276 xi = p.
x() + sd*v.
x() ;
1277 yi = p.
y() + sd*v.
y() ;
1278 rhoi2 = xi*xi + yi*yi ;
1279 tolORMin2 = (rMinOAv + zi*tanRMin)*(rMinOAv + zi*tanRMin) ;
1280 tolORMax2 = (rMaxOAv + zi*tanRMax)*(rMaxOAv + zi*tanRMax) ;
1282 if ( (rhoi2 >= tolORMin2) && (rhoi2 <= tolORMax2) )
1287 if ( (yi*cosCPhi - xi*sinCPhi) >= 0.0 ) { snxt = sd; }
1294 if (snxt < halfCarTolerance) { snxt = 0.; }
1308 G4double safe=0.0, rho, safeR1, safeR2, safeZ, safePhi, cosPsi ;
1312 rho = std::sqrt(p.
x()*p.
x() + p.
y()*p.
y()) ;
1313 safeZ = std::fabs(p.
z()) - fDz ;
1315 if ( (fRmin1 != 0.0) || (fRmin2 != 0.0) )
1317 tanRMin = (fRmin2 - fRmin1)*0.5/fDz ;
1318 secRMin = std::sqrt(1.0 + tanRMin*tanRMin) ;
1319 pRMin = tanRMin*p.
z() + (fRmin1 + fRmin2)*0.5 ;
1320 safeR1 = (pRMin - rho)/secRMin ;
1322 tanRMax = (fRmax2 - fRmax1)*0.5/fDz ;
1323 secRMax = std::sqrt(1.0 + tanRMax*tanRMax) ;
1324 pRMax = tanRMax*p.
z() + (fRmax1 + fRmax2)*0.5 ;
1325 safeR2 = (rho - pRMax)/secRMax ;
1327 if ( safeR1 > safeR2) { safe = safeR1; }
1328 else { safe = safeR2; }
1332 tanRMax = (fRmax2 - fRmax1)*0.5/fDz ;
1333 secRMax = std::sqrt(1.0 + tanRMax*tanRMax) ;
1334 pRMax = tanRMax*p.
z() + (fRmax1 + fRmax2)*0.5 ;
1335 safe = (rho - pRMax)/secRMax ;
1337 if ( safeZ > safe ) { safe = safeZ; }
1339 if ( !fPhiFullCone && (rho != 0.0) )
1343 cosPsi = (p.
x()*cosCPhi + p.
y()*sinCPhi)/rho ;
1345 if ( cosPsi < cosHDPhi )
1347 if ( (p.
y()*cosCPhi - p.
x()*sinCPhi) <= 0.0 )
1349 safePhi = std::fabs(p.
x()*sinSPhi-p.
y()*cosSPhi);
1353 safePhi = std::fabs(p.
x()*sinEPhi-p.
y()*cosEPhi);
1355 if ( safePhi > safe ) { safe = safePhi; }
1358 if ( safe < 0.0 ) { safe = 0.0; }
1374 ESide side = kNull, sider = kNull, sidephi = kNull;
1378 G4double tanRMax, secRMax, rMaxAv ;
1379 G4double tanRMin, secRMin, rMinAv ;
1381 G4double t1, t2, t3, rout, rin, nt1, nt2, nt3 ;
1386 ESide sidetol = kNull ;
1391 G4double pDistS, compS, pDistE, compE, sphi2, xi, yi, risec, vphi ;
1398 pdist = fDz - p.
z() ;
1400 if (pdist > halfCarTolerance)
1402 snxt = pdist/v.
z() ;
1415 else if ( v.
z() < 0.0 )
1417 pdist = fDz + p.
z() ;
1419 if ( pdist > halfCarTolerance)
1421 snxt = -pdist/v.
z() ;
1457 tanRMax = (fRmax2 - fRmax1)*0.5/fDz ;
1458 secRMax = std::sqrt(1.0 + tanRMax*tanRMax) ;
1459 rMaxAv = (fRmax1 + fRmax2)*0.5 ;
1462 t1 = 1.0 - v.
z()*v.
z() ;
1463 t2 = p.
x()*v.
x() + p.
y()*v.
y() ;
1464 t3 = p.
x()*p.
x() + p.
y()*p.
y() ;
1465 rout = tanRMax*p.
z() + rMaxAv ;
1467 nt1 = t1 - (tanRMax*v.
z())*(tanRMax*v.
z()) ;
1468 nt2 = t2 - tanRMax*v.
z()*rout ;
1469 nt3 = t3 - rout*rout ;
1473 deltaRoi2 = snxt*snxt*t1 + 2*snxt*t2 + t3
1474 - fRmax2*(fRmax2 + kRadTolerance*secRMax);
1476 else if (v.
z() < 0.0)
1478 deltaRoi2 = snxt*snxt*t1 + 2*snxt*t2 + t3
1479 - fRmax1*(fRmax1 + kRadTolerance*secRMax);
1486 if ( (nt1 != 0.0) && (deltaRoi2 > 0.0) )
1499 if (nt3 > -halfRadTolerance && nt2 >= 0 )
1503 risec = std::sqrt(t3)*secRMax ;
1511 if (b>0) { srd = -b - std::sqrt(d); }
1512 else { srd = c/(-b+std::sqrt(d)); }
1514 zi = p.
z() + srd*v.
z() ;
1515 ri = tanRMax*zi + rMaxAv ;
1517 if ((ri >= 0) && (-halfRadTolerance <= srd) && (srd <= halfRadTolerance))
1525 if ( (ri < 0) || (srd < halfRadTolerance) )
1530 if (b>0) { sr2 = c/(-b-std::sqrt(d)); }
1531 else { sr2 = -b + std::sqrt(d); }
1532 zi = p.
z() + sr2*v.
z() ;
1533 ri = tanRMax*zi + rMaxAv ;
1535 if ((ri >= 0) && (sr2 > halfRadTolerance))
1543 if( (-halfRadTolerance <= sr2) && ( sr2 <= halfRadTolerance) )
1561 risec = std::sqrt(t3)*secRMax;
1568 else if ( (nt2 != 0.0) && (deltaRoi2 > 0.0) )
1574 risec = std::sqrt(t3)*secRMax;
1590 if ( slentol <= halfCarTolerance )
1601 xi = p.
x() + slentol*v.
x();
1602 yi = p.
y() + slentol*v.
y();
1603 risec = std::sqrt(xi*xi + yi*yi)*secRMax;
1606 if ( Normal.
dot(v) > 0 )
1610 *n = Normal.
unit() ;
1617 slentol = kInfinity ;
1622 if ( (fRmin1 != 0.0) || (fRmin2 != 0.0) )
1624 tanRMin = (fRmin2 - fRmin1)*0.5/fDz ;
1625 nt1 = t1 - (tanRMin*v.
z())*(tanRMin*v.
z()) ;
1629 secRMin = std::sqrt(1.0 + tanRMin*tanRMin) ;
1630 rMinAv = (fRmin1 + fRmin2)*0.5 ;
1631 rin = tanRMin*p.
z() + rMinAv ;
1632 nt2 = t2 - tanRMin*v.
z()*rin ;
1633 nt3 = t3 - rin*rin ;
1646 if (nt3 < kRadTolerance*(rin + kRadTolerance*0.25))
1650 if (calcNorm) { *validNorm =
false; }
1656 if (b>0) { sr2 = -b - std::sqrt(d); }
1657 else { sr2 = c/(-b+std::sqrt(d)); }
1658 zi = p.
z() + sr2*v.
z() ;
1659 ri = tanRMin*zi + rMinAv ;
1661 if( (ri>=0.0)&&(-halfRadTolerance<=sr2)&&(sr2<=halfRadTolerance) )
1669 if( (ri<0) || (sr2 < halfRadTolerance) )
1671 if (b>0) { sr3 = c/(-b-std::sqrt(d)); }
1672 else { sr3 = -b + std::sqrt(d) ; }
1677 if ( sr3 > halfRadTolerance )
1681 zi = p.
z() + sr3*v.
z() ;
1682 ri = tanRMin*zi + rMinAv ;
1691 else if ( sr3 > -halfRadTolerance )
1699 else if ( (sr2 < srd) && (sr2 > halfCarTolerance) )
1704 else if (sr2 > -halfCarTolerance)
1711 if( slentol <= halfCarTolerance )
1720 xi = p.
x() + slentol*v.
x() ;
1721 yi = p.
y() + slentol*v.
y() ;
1722 if( sidetol==kRMax )
1724 risec = std::sqrt(xi*xi + yi*yi)*secRMax ;
1725 Normal =
G4ThreeVector(xi/risec,yi/risec,-tanRMax/secRMax) ;
1729 risec = std::sqrt(xi*xi + yi*yi)*secRMin ;
1730 Normal =
G4ThreeVector(-xi/risec,-yi/risec,tanRMin/secRMin) ;
1732 if( Normal.
dot(v) > 0 )
1738 *n = Normal.
unit() ;
1747 slentol = kInfinity ;
1758 if ( !fPhiFullCone )
1763 vphi = std::atan2(v.
y(),v.
x()) ;
1765 if ( vphi < fSPhi - halfAngTolerance ) { vphi += twopi; }
1766 else if ( vphi > fSPhi + fDPhi + halfAngTolerance ) { vphi -= twopi; }
1768 if ( (p.
x() != 0.0) || (p.
y() != 0.0) )
1772 pDistS = p.
x()*sinSPhi - p.
y()*cosSPhi ;
1773 pDistE = -p.
x()*sinEPhi + p.
y()*cosEPhi ;
1777 compS = -sinSPhi*v.
x() + cosSPhi*v.
y() ;
1778 compE = sinEPhi*v.
x() - cosEPhi*v.
y() ;
1782 if( ( (fDPhi <= pi) && ( (pDistS <= halfCarTolerance)
1783 && (pDistE <= halfCarTolerance) ) )
1784 || ( (fDPhi > pi) && ((pDistS <= halfCarTolerance)
1785 || (pDistE <= halfCarTolerance) ) ) )
1790 sphi = pDistS/compS ;
1791 if (sphi >= -halfCarTolerance)
1793 xi = p.
x() + sphi*v.
x() ;
1794 yi = p.
y() + sphi*v.
y() ;
1803 if ( ( fSPhi-halfAngTolerance <= vphi )
1804 && ( fSPhi+fDPhi+halfAngTolerance >=vphi ) )
1810 if ( (yi*cosCPhi-xi*sinCPhi)>=0 )
1817 if ( pDistS > -halfCarTolerance )
1835 sphi2 = pDistE/compE ;
1839 if ( (sphi2 > -halfCarTolerance) && (sphi2 < sphi) )
1841 xi = p.
x() + sphi2*v.
x() ;
1842 yi = p.
y() + sphi2*v.
y() ;
1851 if( (fSPhi-halfAngTolerance > vphi)
1852 || (fSPhi+fDPhi+halfAngTolerance < vphi) )
1855 if ( pDistE <= -halfCarTolerance ) { sphi = sphi2; }
1856 else { sphi = 0.0; }
1860 if ( yi*cosCPhi-xi*sinCPhi >= 0 )
1865 if ( pDistE <= -halfCarTolerance ) { sphi = sphi2; }
1866 else { sphi = 0.0; }
1881 if ( (fSPhi-halfAngTolerance <= vphi)
1882 && (vphi <= fSPhi+fDPhi+halfAngTolerance) )
1908 xi = p.
x() + snxt*v.
x() ;
1909 yi = p.
y() + snxt*v.
y() ;
1910 risec = std::sqrt(xi*xi + yi*yi)*secRMax ;
1915 *validNorm = false ;
1925 *validNorm = false ;
1936 *validNorm = false ;
1950 std::ostringstream message;
1951 G4long oldprc = message.precision(16) ;
1952 message <<
"Undefined side for valid surface normal to solid."
1955 <<
"p.x() = " << p.
x()/mm <<
" mm" <<
G4endl
1956 <<
"p.y() = " << p.
y()/mm <<
" mm" <<
G4endl
1958 <<
"pho at z = " << std::sqrt( p.
x()*p.
x()+p.
y()*p.
y() )/mm
1960 if( p.
x() != 0. || p.
y() != 0.)
1962 message <<
"point phi = " << std::atan2(p.
y(),p.
x())/degree
1966 <<
"v.x() = " << v.
x() <<
G4endl
1967 <<
"v.y() = " << v.
y() <<
G4endl
1970 <<
"snxt = " << snxt/mm <<
" mm" <<
G4endl ;
1971 message.precision(oldprc) ;
1972 G4Exception(
"G4Cons::DistanceToOut(p,v,..)",
"GeomSolids1002",
1977 if (snxt < halfCarTolerance) { snxt = 0.; }
2111 G4double rone = (fRmax1-fRmax2)/(2.*fDz);
2112 G4double rtwo = (fRmin1-fRmin2)/(2.*fDz);
2113 G4double qone = (fRmax1 == fRmax2) ? 0. : fDz*(fRmax1+fRmax2)/(fRmax1-fRmax2);
2114 G4double qtwo = (fRmin1 == fRmin2) ? 0. : fDz*(fRmin1+fRmin2)/(fRmin1-fRmin2);
2116 G4double slin = std::hypot(fRmin1-fRmin2, 2.*fDz);
2117 G4double slout = std::hypot(fRmax1-fRmax2, 2.*fDz);
2118 G4double Aone = 0.5*fDPhi*(fRmax2 + fRmax1)*slout;
2119 G4double Atwo = 0.5*fDPhi*(fRmin2 + fRmin1)*slin;
2120 G4double Athree = 0.5*fDPhi*(fRmax1*fRmax1-fRmin1*fRmin1);
2121 G4double Afour = 0.5*fDPhi*(fRmax2*fRmax2-fRmin2*fRmin2);
2122 G4double Afive = fDz*(fRmax1-fRmin1+fRmax2-fRmin2);
2124 G4double phi = G4RandFlat::shoot(fSPhi,fSPhi+fDPhi);
2130 if ( (fSPhi == 0.) && fPhiFullCone ) { Afive = 0.; }
2131 G4double chose = G4RandFlat::shoot(0.,Aone+Atwo+Athree+Afour+2.*Afive);
2133 if( (chose >= 0.) && (chose < Aone) )
2135 if(fRmax1 != fRmax2)
2137 G4double zRand = G4RandFlat::shoot(-1.*fDz,fDz);
2138 return { rone*cosu*(qone-zRand), rone*sinu*(qone-zRand), zRand };
2141 return { fRmax1*cosu, fRmax2*sinu, G4RandFlat::shoot(-1.*fDz,fDz) };
2143 if( (chose >= Aone) && (chose < Aone + Atwo) )
2145 if(fRmin1 != fRmin2)
2147 G4double zRand = G4RandFlat::shoot(-1.*fDz,fDz);
2148 return { rtwo*cosu*(qtwo-zRand), rtwo*sinu*(qtwo-zRand), zRand };
2151 return { fRmin1*cosu, fRmin2*sinu, G4RandFlat::shoot(-1.*fDz,fDz) };
2153 if( (chose >= Aone + Atwo) && (chose < Aone + Atwo + Athree) )
2155 return {rRand1*cosu, rRand1*sinu, -1*fDz};
2157 if( (chose >= Aone + Atwo + Athree)
2158 && (chose < Aone + Atwo + Athree + Afour) )
2160 return { rRand2*cosu, rRand2*sinu, fDz };
2162 if( (chose >= Aone + Atwo + Athree + Afour)
2163 && (chose < Aone + Atwo + Athree + Afour + Afive) )
2165 G4double zRand = G4RandFlat::shoot(-1.*fDz,fDz);
2166 rRand1 = G4RandFlat::shoot(fRmin2-((zRand-fDz)/(2.*fDz))*(fRmin1-fRmin2),
2167 fRmax2-((zRand-fDz)/(2.*fDz))*(fRmax1-fRmax2));
2168 return { rRand1*cosSPhi, rRand1*sinSPhi, zRand };
2172 G4double zRand = G4RandFlat::shoot(-1.*fDz,fDz);
2173 rRand1 = G4RandFlat::shoot(fRmin2-((zRand-fDz)/(2.*fDz))*(fRmin1-fRmin2),
2174 fRmax2-((zRand-fDz)/(2.*fDz))*(fRmax1-fRmax2));
2175 return { rRand1*cosEPhi, rRand1*sinEPhi, zRand };