51 #if !defined(G4GEOM_USE_UCONS) 65 using namespace CLHEP;
87 :
G4CSGSolid(pName), fRmin1(pRmin1), fRmin2(pRmin2),
88 fRmax1(pRmax1), fRmax2(pRmax2), fDz(pDz), fSPhi(0.), fDPhi(0.)
101 std::ostringstream message;
102 message <<
"Invalid Z half-length for Solid: " <<
GetName() <<
G4endl 110 if (((pRmin1>=pRmax1) || (pRmin2>=pRmax2) || (pRmin1<0)) && (pRmin2<0))
112 std::ostringstream message;
113 message <<
"Invalid values of radii for Solid: " <<
GetName() <<
G4endl 114 <<
" pRmin1 = " << pRmin1 <<
", pRmin2 = " << pRmin2
115 <<
", pRmax1 = " << pRmax1 <<
", pRmax2 = " << pRmax2;
176 if (
this == &rhs) {
return *
this; }
207 G4double r2, rl, rh, pPhi, tolRMin, tolRMax;
214 r2 = p.
x()*p.
x() + p.
y()*p.
y() ;
221 if ( tolRMin < 0 ) { tolRMin = 0; }
224 if ( (r2<tolRMin*tolRMin) || (r2>tolRMax*tolRMax) ) {
return in =
kOutside; }
227 else { tolRMin = 0.0; }
232 if ( (r2 < tolRMin*tolRMin) || (r2 >= tolRMax*tolRMax) ) { in =
kSurface; }
236 pPhi = std::atan2(p.
y(),p.
x()) ;
290 G4double diff1, diff2, delta, maxDiff, newMin, newMax, RMax ;
291 G4double xoff1, xoff2, yoff1, yoff2 ;
294 zMin = zoffset -
fDz ;
295 zMax = zoffset +
fDz ;
320 xMin = 2*xoffset-xMax ;
344 yMin = 2*yoffset-yMax ;
345 RMax = yMax - yoffset ;
369 yoff1 = yoffset - yMin ;
370 yoff2 = yMax - yoffset ;
372 if ((yoff1 >= 0) && (yoff2 >= 0))
381 delta=RMax*RMax-yoff1*yoff1;
382 diff1=(delta>0.) ? std::sqrt(delta) : 0.;
383 delta=RMax*RMax-yoff2*yoff2;
384 diff2=(delta>0.) ? std::sqrt(delta) : 0.;
385 maxDiff = (diff1>diff2) ? diff1:diff2 ;
386 newMin = xoffset - maxDiff ;
387 newMax = xoffset + maxDiff ;
388 pMin = ( newMin < xMin ) ? xMin : newMin ;
389 pMax = ( newMax > xMax) ? xMax : newMax ;
394 xoff1 = xoffset - xMin ;
395 xoff2 = xMax - xoffset ;
397 if ((xoff1 >= 0) && (xoff2 >= 0) )
406 delta=RMax*RMax-xoff1*xoff1;
407 diff1=(delta>0.) ? std::sqrt(delta) : 0.;
408 delta=RMax*RMax-xoff2*xoff2;
409 diff2=(delta>0.) ? std::sqrt(delta) : 0.;
410 maxDiff = (diff1 > diff2) ? diff1:diff2 ;
411 newMin = yoffset - maxDiff ;
412 newMax = yoffset + maxDiff ;
413 pMin = (newMin < yMin) ? yMin : newMin ;
414 pMax = (newMax > yMax) ? yMax : newMax ;
433 G4int i, noEntries, noBetweenSections4 ;
434 G4bool existsAfterClip = false ;
440 noEntries = vertices->size() ;
441 noBetweenSections4 = noEntries-4 ;
443 for ( i = 0 ; i < noEntries ; i += 4 )
447 for ( i = 0 ; i < noBetweenSections4 ; i += 4 )
453 existsAfterClip = true ;
474 existsAfterClip = true ;
480 return existsAfterClip ;
492 G4int noSurfaces = 0;
496 G4double tanRMin, secRMin, pRMin, widRMin;
497 G4double tanRMax, secRMax, pRMax, widRMax;
502 distZ = std::fabs(std::fabs(p.
z()) -
fDz);
503 rho = std::sqrt(p.
x()*p.
x() + p.
y()*p.
y());
506 secRMin = std::sqrt(1 + tanRMin*tanRMin);
507 pRMin = rho - p.
z()*tanRMin;
509 distRMin = std::fabs(pRMin - widRMin)/secRMin;
512 secRMax = std::sqrt(1+tanRMax*tanRMax);
513 pRMax = rho - p.
z()*tanRMax;
515 distRMax = std::fabs(pRMax - widRMax)/secRMax;
521 pPhi = std::atan2(p.
y(),p.
x());
526 distSPhi = std::fabs( pPhi -
fSPhi );
539 nR =
G4ThreeVector(p.
x()/rho/secRMax, p.
y()/rho/secRMax, -tanRMax/secRMax);
542 nr =
G4ThreeVector(-p.
x()/rho/secRMin,-p.
y()/rho/secRMin,tanRMin/secRMin);
572 if ( p.
z() >= 0.) { sumnorm += nZ; }
573 else { sumnorm -= nZ; }
575 if ( noSurfaces == 0 )
578 G4Exception(
"G4Cons::SurfaceNormal(p)",
"GeomSolids1002",
583 else if ( noSurfaces == 1 ) { norm = sumnorm; }
584 else { norm = sumnorm.
unit(); }
599 G4double distZ, distRMin, distRMax, distSPhi, distEPhi, distMin ;
600 G4double tanRMin, secRMin, pRMin, widRMin ;
601 G4double tanRMax, secRMax, pRMax, widRMax ;
603 distZ = std::fabs(std::fabs(p.
z()) -
fDz) ;
604 rho = std::sqrt(p.
x()*p.
x() + p.
y()*p.
y()) ;
607 secRMin = std::sqrt(1 + tanRMin*tanRMin) ;
608 pRMin = rho - p.
z()*tanRMin ;
610 distRMin = std::fabs(pRMin - widRMin)/secRMin ;
613 secRMax = std::sqrt(1+tanRMax*tanRMax) ;
614 pRMax = rho - p.
z()*tanRMax ;
616 distRMax = std::fabs(pRMax - widRMax)/secRMax ;
618 if (distRMin < distRMax)
620 if (distZ < distRMin)
633 if (distZ < distRMax)
646 phi = std::atan2(p.
y(),p.
x()) ;
648 if (phi < 0) { phi +=
twopi; }
651 else { distSPhi = std::fabs(phi -
fSPhi)*rho; }
653 distEPhi = std::fabs(phi -
fSPhi -
fDPhi)*rho ;
657 if (distSPhi < distEPhi)
659 if (distSPhi < distMin) { side =
kNSPhi; }
663 if (distEPhi < distMin) { side =
kNEPhi; }
690 "Undefined side for valid surface normal to solid.");
726 G4double tanRMax,secRMax,rMaxAv,rMaxOAv ;
727 G4double tanRMin,secRMin,rMinAv,rMinOAv ;
730 G4double tolORMin,tolORMin2,tolIRMin,tolIRMin2 ;
731 G4double tolORMax2,tolIRMax,tolIRMax2 ;
734 G4double Dist,sd,xi,yi,zi,ri=0.,risec,rhoi2,cosPsi ;
745 secRMin = std::sqrt(1.0 + tanRMin*tanRMin) ;
757 secRMax = std::sqrt(1.0 + tanRMax*tanRMax) ;
766 if (std::fabs(p.
z()) >= tolIDz)
768 if ( p.
z()*v.
z() < 0 )
770 sd = (std::fabs(p.
z()) -
fDz)/std::fabs(v.
z()) ;
772 if( sd < 0.0 ) { sd = 0.0; }
774 xi = p.
x() + sd*v.
x() ;
775 yi = p.
y() + sd*v.
y() ;
776 rhoi2 = xi*xi + yi*yi ;
783 tolORMin =
fRmin1 - halfRadTolerance*secRMin ;
784 tolIRMin =
fRmin1 + halfRadTolerance*secRMin ;
785 tolIRMax =
fRmax1 - halfRadTolerance*secRMin ;
791 tolORMin =
fRmin2 - halfRadTolerance*secRMin ;
792 tolIRMin =
fRmin2 + halfRadTolerance*secRMin ;
793 tolIRMax =
fRmax2 - halfRadTolerance*secRMin ;
800 tolIRMin2 = tolIRMin*tolIRMin ;
807 if ( tolIRMax > 0 ) { tolIRMax2 = tolIRMax*tolIRMax; }
808 else { tolIRMax2 = 0.0; }
810 if ( (tolIRMin2 <= rhoi2) && (rhoi2 <= tolIRMax2) )
851 t1 = 1.0 - v.
z()*v.
z() ;
852 t2 = p.
x()*v.
x() + p.
y()*v.
y() ;
853 t3 = p.
x()*p.
x() + p.
y()*p.
y() ;
854 rin = tanRMin*p.
z() + rMinAv ;
855 rout = tanRMax*p.
z() + rMaxAv ;
860 nt1 = t1 - (tanRMax*v.
z())*(tanRMax*v.
z()) ;
861 nt2 = t2 - tanRMax*v.
z()*rout ;
862 nt3 = t3 - rout*rout ;
878 if ((rout < 0) && (nt3 <= 0))
883 if (b>0) { sd = c/(-b-std::sqrt(d)); }
884 else { sd = -b + std::sqrt(d); }
888 if ((b <= 0) && (c >= 0))
890 sd=c/(-b+std::sqrt(d));
896 sd = -b + std::sqrt(d) ;
897 if((sd<0) & (sd>-halfRadTolerance)) sd=0;
909 G4double fTerm = sd-std::fmod(sd,dRmax);
912 zi = p.
z() + sd*v.
z() ;
914 if (std::fabs(zi) <= tolODz)
921 xi = p.
x() + sd*v.
x() ;
922 yi = p.
y() + sd*v.
y() ;
923 ri = rMaxAv + zi*tanRMax ;
937 if ( ( t3 > (rin + halfRadTolerance*secRMin)*
938 (rin + halfRadTolerance*secRMin) )
939 && (nt2 < 0) && (d >= 0) && (std::fabs(p.
z()) <= tolIDz) )
946 risec = std::sqrt(xi*xi + yi*yi)*secRMax ;
953 if ( Normal.
dot(v) <= 0 ) {
return 0.0; }
958 if ( Normal.
dot(v) <= 0 ) {
return 0.0; }
972 zi = p.
z() + sd*v.
z() ;
974 if ((std::fabs(zi) <= tolODz) && (nt2 < 0))
981 xi = p.
x() + sd*v.
x() ;
982 yi = p.
y() + sd*v.
y() ;
983 ri = rMaxAv + zi*tanRMax ;
1008 nt1 = t1 - (tanRMin*v.
z())*(tanRMin*v.
z()) ;
1009 nt2 = t2 - tanRMin*v.
z()*rin ;
1010 nt3 = t3 - rin*rin ;
1024 if(b>0){sd = c/( -b-std::sqrt(d));}
1025 else {sd = -b + std::sqrt(d) ;}
1031 G4double fTerm = sd-std::fmod(sd,dRmax);
1034 zi = p.
z() + sd*v.
z() ;
1036 if ( std::fabs(zi) <= tolODz )
1040 xi = p.
x() + sd*v.
x() ;
1041 yi = p.
y() + sd*v.
y() ;
1042 ri = rMinAv + zi*tanRMin ;
1047 if ( sd > halfRadTolerance ) { snxt=sd; }
1052 risec = std::sqrt(xi*xi + yi*yi)*secRMin ;
1053 Normal =
G4ThreeVector(-xi/risec,-yi/risec,tanRMin/secRMin);
1054 if ( Normal.
dot(v) <= 0 ) { snxt = sd; }
1060 if ( sd > halfRadTolerance ) {
return sd; }
1065 xi = p.
x() + sd*v.
x() ;
1066 yi = p.
y() + sd*v.
y() ;
1067 risec = std::sqrt(xi*xi + yi*yi)*secRMin ;
1068 Normal =
G4ThreeVector(-xi/risec,-yi/risec,tanRMin/secRMin) ;
1069 if ( Normal.
dot(v) <= 0 ) {
return sd; }
1089 if (b>0) { sd = c/(-b-std::sqrt(d)); }
1090 else { sd = -b + std::sqrt(d); }
1091 zi = p.
z() + sd*v.
z() ;
1092 ri = rMinAv + zi*tanRMin ;
1096 if ( (sd >= 0) && (std::fabs(zi) <= tolODz) )
1100 G4double fTerm = sd-std::fmod(sd,dRmax);
1105 xi = p.
x() + sd*v.
x() ;
1106 yi = p.
y() + sd*v.
y() ;
1111 if ( sd > halfRadTolerance ) { snxt=sd; }
1116 risec = std::sqrt(xi*xi + yi*yi)*secRMin ;
1117 Normal =
G4ThreeVector(-xi/risec,-yi/risec,tanRMin/secRMin);
1118 if ( Normal.
dot(v) <= 0 ) { snxt = sd; }
1124 if( sd > halfRadTolerance ) {
return sd; }
1129 xi = p.
x() + sd*v.
x() ;
1130 yi = p.
y() + sd*v.
y() ;
1131 risec = std::sqrt(xi*xi + yi*yi)*secRMin ;
1132 Normal =
G4ThreeVector(-xi/risec,-yi/risec,tanRMin/secRMin) ;
1133 if ( Normal.
dot(v) <= 0 ) {
return sd; }
1140 if (b>0) { sd = -b - std::sqrt(d); }
1141 else { sd = c/(-b+std::sqrt(d)); }
1142 zi = p.
z() + sd*v.
z() ;
1143 ri = rMinAv + zi*tanRMin ;
1145 if ( (sd >= 0) && (ri > 0) && (std::fabs(zi) <= tolODz) )
1149 G4double fTerm = sd-std::fmod(sd,dRmax);
1154 xi = p.
x() + sd*v.
x() ;
1155 yi = p.
y() + sd*v.
y() ;
1160 if ( sd > halfRadTolerance ) { snxt=sd; }
1165 risec = std::sqrt(xi*xi + yi*yi)*secRMin ;
1166 Normal =
G4ThreeVector(-xi/risec,-yi/risec,tanRMin/secRMin);
1167 if ( Normal.
dot(v) <= 0 ) { snxt = sd; }
1173 if ( sd > halfRadTolerance ) {
return sd; }
1178 xi = p.
x() + sd*v.
x() ;
1179 yi = p.
y() + sd*v.
y() ;
1180 risec = std::sqrt(xi*xi + yi*yi)*secRMin ;
1181 Normal =
G4ThreeVector(-xi/risec,-yi/risec,tanRMin/secRMin) ;
1182 if ( Normal.
dot(v) <= 0 ) {
return sd; }
1196 if ( std::fabs(p.
z()) <= tolODz )
1208 else {
return 0.0; }
1221 if (b>0) { sd = -b - std::sqrt(d); }
1222 else { sd = c/(-b+std::sqrt(d)); }
1223 zi = p.
z() + sd*v.
z() ;
1224 ri = rMinAv + zi*tanRMin ;
1228 if (b>0) { sd = c/(-b-std::sqrt(d)); }
1229 else { sd = -b + std::sqrt(d); }
1231 zi = p.
z() + sd*v.
z() ;
1233 if ( (sd >= 0) && (std::fabs(zi) <= tolODz) )
1237 G4double fTerm = sd-std::fmod(sd,dRmax);
1242 xi = p.
x() + sd*v.
x() ;
1243 yi = p.
y() + sd*v.
y() ;
1244 ri = rMinAv + zi*tanRMin ;
1264 if (b>0) { sd = c/(-b-std::sqrt(d)); }
1265 else { sd = -b + std::sqrt(d) ; }
1266 zi = p.
z() + sd*v.
z() ;
1268 if ( (sd >= 0) && (std::fabs(zi) <= tolODz) )
1272 G4double fTerm = sd-std::fmod(sd,dRmax);
1277 xi = p.
x() + sd*v.
x();
1278 yi = p.
y() + sd*v.
y();
1279 ri = rMinAv + zi*tanRMin ;
1311 if (Dist < halfCarTolerance)
1317 if ( sd < 0 ) { sd = 0.0; }
1319 zi = p.
z() + sd*v.
z() ;
1321 if ( std::fabs(zi) <= tolODz )
1323 xi = p.
x() + sd*v.
x() ;
1324 yi = p.
y() + sd*v.
y() ;
1325 rhoi2 = xi*xi + yi*yi ;
1326 tolORMin2 = (rMinOAv + zi*tanRMin)*(rMinOAv + zi*tanRMin) ;
1327 tolORMax2 = (rMaxOAv + zi*tanRMax)*(rMaxOAv + zi*tanRMax) ;
1329 if ( (rhoi2 >= tolORMin2) && (rhoi2 <= tolORMax2) )
1348 if (Dist < halfCarTolerance)
1354 if ( sd < 0 ) { sd = 0.0; }
1356 zi = p.
z() + sd*v.
z() ;
1358 if (std::fabs(zi) <= tolODz)
1360 xi = p.
x() + sd*v.
x() ;
1361 yi = p.
y() + sd*v.
y() ;
1362 rhoi2 = xi*xi + yi*yi ;
1363 tolORMin2 = (rMinOAv + zi*tanRMin)*(rMinOAv + zi*tanRMin) ;
1364 tolORMax2 = (rMaxOAv + zi*tanRMax)*(rMaxOAv + zi*tanRMax) ;
1366 if ( (rhoi2 >= tolORMin2) && (rhoi2 <= tolORMax2) )
1378 if (snxt < halfCarTolerance) { snxt = 0.; }
1392 G4double safe=0.0, rho, safeR1, safeR2, safeZ, safePhi, cosPsi ;
1396 rho = std::sqrt(p.
x()*p.
x() + p.
y()*p.
y()) ;
1397 safeZ = std::fabs(p.
z()) -
fDz ;
1402 secRMin = std::sqrt(1.0 + tanRMin*tanRMin) ;
1404 safeR1 = (pRMin - rho)/secRMin ;
1407 secRMax = std::sqrt(1.0 + tanRMax*tanRMax) ;
1409 safeR2 = (rho - pRMax)/secRMax ;
1411 if ( safeR1 > safeR2) { safe = safeR1; }
1412 else { safe = safeR2; }
1417 secRMax = std::sqrt(1.0 + tanRMax*tanRMax) ;
1419 safe = (rho - pRMax)/secRMax ;
1421 if ( safeZ > safe ) { safe = safeZ; }
1429 if ( cosPsi < std::cos(
fDPhi*0.5) )
1433 safePhi = std::fabs(p.
x()*std::sin(
fSPhi)-p.
y()*std::cos(
fSPhi));
1439 if ( safePhi > safe ) { safe = safePhi; }
1442 if ( safe < 0.0 ) { safe = 0.0; }
1462 G4double tanRMax, secRMax, rMaxAv ;
1463 G4double tanRMin, secRMin, rMinAv ;
1475 G4double pDistS, compS, pDistE, compE, sphi2, xi, yi, risec, vphi ;
1482 pdist =
fDz - p.
z() ;
1486 snxt = pdist/v.
z() ;
1499 else if ( v.
z() < 0.0 )
1501 pdist =
fDz + p.
z() ;
1505 snxt = -pdist/v.
z() ;
1542 secRMax = std::sqrt(1.0 + tanRMax*tanRMax) ;
1546 t1 = 1.0 - v.
z()*v.
z() ;
1547 t2 = p.
x()*v.
x() + p.
y()*v.
y() ;
1548 t3 = p.
x()*p.
x() + p.
y()*p.
y() ;
1549 rout = tanRMax*p.
z() + rMaxAv ;
1551 nt1 = t1 - (tanRMax*v.
z())*(tanRMax*v.
z()) ;
1552 nt2 = t2 - tanRMax*v.
z()*rout ;
1553 nt3 = t3 - rout*rout ;
1557 deltaRoi2 = snxt*snxt*t1 + 2*snxt*t2 + t3
1560 else if ( v.
z() < 0.0 )
1562 deltaRoi2 = snxt*snxt*t1 + 2*snxt*t2 + t3
1570 if ( nt1 && (deltaRoi2 > 0.0) )
1587 risec = std::sqrt(t3)*secRMax ;
1596 if (b>0) { srd = -b - std::sqrt(d); }
1597 else { srd = c/(-b+std::sqrt(d)) ; }
1599 zi = p.
z() + srd*v.
z() ;
1600 ri = tanRMax*zi + rMaxAv ;
1615 if (b>0) { sr2 = c/(-b-std::sqrt(d)); }
1616 else { sr2 = -b + std::sqrt(d); }
1617 zi = p.
z() + sr2*v.
z() ;
1618 ri = tanRMax*zi + rMaxAv ;
1647 risec = std::sqrt(t3)*secRMax;
1654 else if ( nt2 && (deltaRoi2 > 0.0) )
1660 risec = std::sqrt(t3)*secRMax;
1687 xi = p.
x() + slentol*v.
x();
1688 yi = p.
y() + slentol*v.
y();
1689 risec = std::sqrt(xi*xi + yi*yi)*secRMax;
1692 if ( Normal.
dot(v) > 0 )
1696 *n = Normal.
unit() ;
1712 nt1 = t1 - (tanRMin*v.
z())*(tanRMin*v.
z()) ;
1716 secRMin = std::sqrt(1.0 + tanRMin*tanRMin) ;
1718 rin = tanRMin*p.
z() + rMinAv ;
1719 nt2 = t2 - tanRMin*v.
z()*rin ;
1720 nt3 = t3 - rin*rin ;
1737 if (calcNorm) { *validNorm =
false; }
1743 if (b>0) { sr2 = -b - std::sqrt(d); }
1744 else { sr2 = c/(-b+std::sqrt(d)); }
1745 zi = p.
z() + sr2*v.
z() ;
1746 ri = tanRMin*zi + rMinAv ;
1758 if (b>0) { sr3 = c/(-b-std::sqrt(d)); }
1759 else { sr3 = -b + std::sqrt(d) ; }
1768 zi = p.
z() + sr3*v.
z() ;
1769 ri = tanRMin*zi + rMinAv ;
1807 xi = p.
x() + slentol*v.
x() ;
1808 yi = p.
y() + slentol*v.
y() ;
1809 if( sidetol==
kRMax )
1811 risec = std::sqrt(xi*xi + yi*yi)*secRMax ;
1812 Normal =
G4ThreeVector(xi/risec,yi/risec,-tanRMax/secRMax) ;
1816 risec = std::sqrt(xi*xi + yi*yi)*secRMin ;
1817 Normal =
G4ThreeVector(-xi/risec,-yi/risec,tanRMin/secRMin) ;
1819 if( Normal.
dot(v) > 0 )
1825 *n = Normal.
unit() ;
1852 vphi = std::atan2(v.
y(),v.
x()) ;
1857 if ( p.
x() || p.
y() )
1879 sphi = pDistS/compS ;
1882 xi = p.
x() + sphi*v.
x() ;
1883 yi = p.
y() + sphi*v.
y() ;
1924 sphi2 = pDistE/compE ;
1930 xi = p.
x() + sphi2*v.
x() ;
1931 yi = p.
y() + sphi2*v.
y() ;
1945 else { sphi = 0.0; }
1955 else { sphi = 0.0; }
1997 xi = p.
x() + snxt*v.
x() ;
1998 yi = p.
y() + snxt*v.
y() ;
1999 risec = std::sqrt(xi*xi + yi*yi)*secRMax ;
2004 *validNorm = false ;
2014 *validNorm = false ;
2025 *validNorm = false ;
2039 std::ostringstream message;
2040 G4int oldprc = message.precision(16) ;
2041 message <<
"Undefined side for valid surface normal to solid." 2043 <<
"Position:" << G4endl << G4endl
2044 <<
"p.x() = " << p.
x()/
mm <<
" mm" << G4endl
2045 <<
"p.y() = " << p.
y()/
mm <<
" mm" << G4endl
2046 <<
"p.z() = " << p.
z()/
mm <<
" mm" << G4endl << G4endl
2047 <<
"pho at z = " << std::sqrt( p.
x()*p.
x()+p.
y()*p.
y() )/
mm 2048 <<
" mm" << G4endl << G4endl ;
2049 if( p.
x() != 0. || p.
y() != 0.)
2051 message <<
"point phi = " << std::atan2(p.
y(),p.
x())/
degree 2052 <<
" degree" << G4endl << G4endl ;
2054 message <<
"Direction:" << G4endl << G4endl
2055 <<
"v.x() = " << v.
x() << G4endl
2056 <<
"v.y() = " << v.
y() << G4endl
2057 <<
"v.z() = " << v.
z() << G4endl<< G4endl
2058 <<
"Proposed distance :" << G4endl<< G4endl
2059 <<
"snxt = " << snxt/
mm <<
" mm" <<
G4endl ;
2060 message.precision(oldprc) ;
2061 G4Exception(
"G4Cons::DistanceToOut(p,v,..)",
"GeomSolids1002",
2077 G4double safe=0.0, rho, safeR1, safeR2, safeZ, safePhi;
2091 G4cout <<
"pho at z = " << std::sqrt( p.
x()*p.
x()+p.
y()*p.
y() )/
mm 2092 <<
" mm" << G4endl << G4endl ;
2093 if( (p.
x() != 0.) || (p.
x() != 0.) )
2096 <<
" degree" << G4endl << G4endl ;
2098 G4cout.precision(oldprc) ;
2099 G4Exception(
"G4Cons::DistanceToOut(p)",
"GeomSolids1002",
2104 rho = std::sqrt(p.
x()*p.
x() + p.
y()*p.
y()) ;
2105 safeZ =
fDz - std::fabs(p.
z()) ;
2110 secRMin = std::sqrt(1.0 + tanRMin*tanRMin) ;
2112 safeR1 = (rho - pRMin)/secRMin ;
2120 secRMax = std::sqrt(1.0 + tanRMax*tanRMax) ;
2122 safeR2 = (pRMax - rho)/secRMax ;
2124 if (safeR1 < safeR2) { safe = safeR1; }
2125 else { safe = safeR2; }
2126 if (safeZ < safe) { safe = safeZ ; }
2142 if (safePhi < safe) { safe = safePhi; }
2144 if ( safe < 0 ) { safe = 0; }
2165 G4double meshAngle, meshRMax1, meshRMax2, crossAngle;
2166 G4double cosCrossAngle, sinCrossAngle, sAngle ;
2167 G4double rMaxX1, rMaxX2, rMaxY1, rMaxY2, rMinX1, rMinX2, rMinY1, rMinY2 ;
2168 G4int crossSection, noCrossSections ;
2182 meshAngle =
fDPhi/(noCrossSections - 1) ;
2184 meshRMax1 =
fRmax1/std::cos(meshAngle*0.5) ;
2185 meshRMax2 =
fRmax2/std::cos(meshAngle*0.5) ;
2192 sAngle = -meshAngle*0.5 ;
2202 vertices->reserve(noCrossSections*4) ;
2203 for (crossSection = 0 ; crossSection < noCrossSections ; crossSection++)
2207 crossAngle = sAngle + crossSection*meshAngle ;
2208 cosCrossAngle = std::cos(crossAngle) ;
2209 sinCrossAngle = std::sin(crossAngle) ;
2211 rMaxX1 = meshRMax1*cosCrossAngle ;
2212 rMaxY1 = meshRMax1*sinCrossAngle ;
2213 rMaxX2 = meshRMax2*cosCrossAngle ;
2214 rMaxY2 = meshRMax2*sinCrossAngle ;
2216 rMinX1 =
fRmin1*cosCrossAngle ;
2217 rMinY1 =
fRmin1*sinCrossAngle ;
2218 rMinX2 =
fRmin2*cosCrossAngle ;
2219 rMinY2 =
fRmin2*sinCrossAngle ;
2237 "Error in allocation of vertices. Out of memory !");
2258 return new G4Cons(*
this);
2267 G4int oldprc = os.precision(16);
2268 os <<
"-----------------------------------------------------------\n" 2269 <<
" *** Dump for solid - " <<
GetName() <<
" ***\n" 2270 <<
" ===================================================\n" 2271 <<
" Solid type: G4Cons\n" 2272 <<
" Parameters: \n" 2273 <<
" inside -fDz radius: " <<
fRmin1/
mm <<
" mm \n" 2274 <<
" outside -fDz radius: " <<
fRmax1/
mm <<
" mm \n" 2275 <<
" inside +fDz radius: " <<
fRmin2/
mm <<
" mm \n" 2276 <<
" outside +fDz radius: " <<
fRmax2/
mm <<
" mm \n" 2277 <<
" half length in Z : " <<
fDz/
mm <<
" mm \n" 2278 <<
" starting angle of segment: " <<
fSPhi/
degree <<
" degrees \n" 2279 <<
" delta angle of segment : " <<
fDPhi/
degree <<
" degrees \n" 2280 <<
"-----------------------------------------------------------\n";
2281 os.precision(oldprc);
2296 G4double Aone, Atwo, Athree, Afour, Afive, slin, slout, phi;
2297 G4double zRand, cosu, sinu, rRand1, rRand2, chose, rone, rtwo, qone, qtwo;
2312 cosu = std::cos(phi); sinu = std::sin(phi);
2319 if( (chose >= 0.) && (chose < Aone) )
2325 rtwo*sinu*(qtwo-zRand), zRand);
2333 else if( (chose >= Aone) && (chose <= Aone + Atwo) )
2339 rone*sinu*(qone-zRand), zRand);
2347 else if( (chose >= Aone + Atwo) && (chose < Aone + Atwo + Athree) )
2351 else if( (chose >= Aone + Atwo + Athree)
2352 && (chose < Aone + Atwo + Athree + Afour) )
2356 else if( (chose >= Aone + Atwo + Athree + Afour)
2357 && (chose < Aone + Atwo + Athree + Afour + Afive) )
2363 rRand1*std::sin(
fSPhi), zRand);
G4Cons(const G4String &pName, G4double pRmin1, G4double pRmax1, G4double pRmin2, G4double pRmax2, G4double pDz, G4double pSPhi, G4double pDPhi)
ThreeVector shoot(const G4int Ap, const G4int Af)
void ClipBetweenSections(G4ThreeVectorList *pVertices, const G4int pSectionIndex, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
G4ThreeVector ApproxSurfaceNormal(const G4ThreeVector &p) const
G4double GetMinXExtent() const
G4double halfRadTolerance
static const G4double kInfinity
G4double GetMinYExtent() const
CLHEP::Hep3Vector G4ThreeVector
std::ostream & StreamInfo(std::ostream &os) const
G4Cons & operator=(const G4Cons &rhs)
G4ThreeVectorList * CreateRotatedVertices(const G4AffineTransform &pTransform) const
G4double GetRadiusInRing(G4double rmin, G4double rmax) const
G4double GetMinZExtent() const
G4bool IsYLimited() const
void ClipCrossSection(G4ThreeVectorList *pVertices, const G4int pSectionIndex, const G4VoxelLimits &pVoxelLimit, const EAxis pAxis, G4double &pMin, G4double &pMax) const
G4bool IsXLimited() const
const G4int kMinMeshSections
virtual void AddSolid(const G4Box &)=0
G4double GetMaxZExtent() const
void ComputeDimensions(G4VPVParameterisation *p, const G4int n, const G4VPhysicalVolume *pRep)
void DescribeYourselfTo(G4VGraphicsScene &scene) const
void CheckPhiAngles(G4double sPhi, G4double dPhi)
G4double GetMaxXExtent() const
G4GLOB_DLL std::ostream G4cout
G4double GetRadialTolerance() const
G4double halfCarTolerance
static const double twopi
G4bool CalculateExtent(const EAxis pAxis, const G4VoxelLimits &pVoxelLimit, const G4AffineTransform &pTransform, G4double &pmin, G4double &pmax) const
std::vector< G4ThreeVector > G4ThreeVectorList
G4double GetAngularTolerance() const
G4double GetMinExtent(const EAxis pAxis) const
EInside Inside(const G4ThreeVector &p) const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
G4ThreeVector GetPointOnSurface() const
double dot(const Hep3Vector &) const
G4bool IsZLimited() const
G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=G4bool(false), G4bool *validNorm=0, G4ThreeVector *n=0) const
G4double halfAngTolerance
G4ThreeVector SurfaceNormal(const G4ThreeVector &p) const
G4Polyhedron * CreatePolyhedron() const
static const double degree
G4double GetMaxExtent(const EAxis pAxis) const
G4double GetMaxYExtent() const
G4CSGSolid & operator=(const G4CSGSolid &rhs)
G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const
G4GeometryType GetEntityType() const
const G4double kMeshAngleDefault
static G4GeometryTolerance * GetInstance()
const G4int kMaxMeshSections
virtual void ComputeDimensions(G4Box &, const G4int, const G4VPhysicalVolume *) const