444 double snxt = UUtils::kInfinity;
445 const double dRmax = 100 *
std::max(fRmax1, fRmax2);
447 static const double halfRadTolerance = kRadTolerance * 0.5;
449 double rMaxAv, rMaxOAv;
450 double rMinAv, rMinOAv;
453 double tolORMin, tolORMin2, tolIRMin, tolIRMin2;
454 double tolORMax2, tolIRMax, tolIRMax2;
455 double tolODz, tolIDz;
457 double Dist, sd, xi, yi, zi, ri = 0., risec, rhoi2, cosPsi;
459 double t1, t2, t3,
b,
c, d;
460 double nt1, nt2, nt3;
466 rMinAv = (fRmin1 + fRmin2) * 0.5;
468 if (rMinAv > halfRadTolerance)
470 rMinOAv = rMinAv - halfRadTolerance;
476 rMaxAv = (fRmax1 + fRmax2) * 0.5;
477 rMaxOAv = rMaxAv + halfRadTolerance;
481 tolIDz = fDz - halfCarTolerance;
482 tolODz = fDz + halfCarTolerance;
484 if (std::fabs(p.
z) >= tolIDz)
488 sd = (std::fabs(p.
z) - fDz) / std::fabs(v.
z);
497 rhoi2 = xi * xi + yi * yi ;
504 tolORMin = fRmin1 - halfRadTolerance * secRMin;
505 tolIRMin = fRmin1 + halfRadTolerance * secRMin;
506 tolIRMax = fRmax1 - halfRadTolerance * secRMin;
507 tolORMax2 = (fRmax1 + halfRadTolerance * secRMax) *
508 (fRmax1 + halfRadTolerance * secRMax);
512 tolORMin = fRmin2 - halfRadTolerance * secRMin;
513 tolIRMin = fRmin2 + halfRadTolerance * secRMin;
514 tolIRMax = fRmax2 - halfRadTolerance * secRMin;
515 tolORMax2 = (fRmax2 + halfRadTolerance * secRMax) *
516 (fRmax2 + halfRadTolerance * secRMax);
520 tolORMin2 = tolORMin * tolORMin;
521 tolIRMin2 = tolIRMin * tolIRMin;
530 tolIRMax2 = tolIRMax * tolIRMax;
537 if ((tolIRMin2 <= rhoi2) && (rhoi2 <= tolIRMax2))
539 if (!fPhiFullCone && rhoi2)
543 cosPsi = (xi * cosCPhi + yi * sinCPhi) / std::sqrt(rhoi2);
545 if (cosPsi >= cosHDPhiIT)
581 t1 = 1.0 - v.
z * v.
z;
582 t2 = p.
x * v.
x + p.
y * v.
y;
583 t3 = p.
x * p.
x + p.
y * p.
y;
584 rin = tanRMin * p.
z + rMinAv;
585 rout = tanRMax * p.
z + rMaxAv;
590 nt1 = t1 - (tanRMax * v.
z) * (tanRMax * v.
z);
591 nt2 = t2 - tanRMax * v.
z * rout;
592 nt3 = t3 - rout * rout;
594 if (std::fabs(nt1) > kRadTolerance)
599 if ((nt3 > rout * rout * kRadTolerance * kRadTolerance * secRMax * secRMax)
608 if ((rout < 0) && (nt3 <= 0))
615 sd = c / (-b - std::sqrt(d));
619 sd = -b + std::sqrt(d);
624 if ((b <= 0) && (c >= 0))
626 sd = c / (-b + std::sqrt(d));
632 sd = -b + std::sqrt(d);
636 return UUtils::kInfinity;
645 double fTerm = sd - std::fmod(sd, dRmax);
650 if (std::fabs(zi) <= tolODz)
662 ri = rMaxAv + zi * tanRMax;
663 cosPsi = (xi * cosCPhi + yi * sinCPhi) / ri;
665 if (cosPsi >= cosHDPhiIT)
679 if ((t3 > (rin + halfRadTolerance * secRMin)*
680 (rin + halfRadTolerance * secRMin))
681 && (nt2 < 0) && (d >= 0) && (std::fabs(p.
z) <= tolIDz))
688 risec = std::sqrt(xi * xi + yi * yi) * secRMax;
689 norm =
UVector3(xi / risec, yi / risec, -tanRMax / secRMax);
692 cosPsi = (p.
x * cosCPhi + p.
y * sinCPhi) / std::sqrt(t3);
693 if (cosPsi >= cosHDPhiIT)
695 if (norm.
Dot(v) <= 0)
703 if (norm.
Dot(v) <= 0)
713 if (std::fabs(nt2) > kRadTolerance)
715 sd = -0.5 * nt3 / nt2;
719 return UUtils::kInfinity;
725 if ((std::fabs(zi) <= tolODz) && (nt2 < 0))
737 ri = rMaxAv + zi * tanRMax;
738 cosPsi = (xi * cosCPhi + yi * sinCPhi) / ri;
740 if (cosPsi >= cosHDPhiIT)
750 sd = UUtils::kInfinity;
765 nt1 = t1 - (tanRMin * v.
z) * (tanRMin * v.
z);
766 nt2 = t2 - tanRMin * v.
z * rin;
767 nt3 = t3 - rin * rin;
771 if (nt3 > rin * kRadTolerance * secRMin)
783 sd = c / (-b - std::sqrt(d));
787 sd = -b + std::sqrt(d);
795 double fTerm = sd - std::fmod(sd, dRmax);
800 if (std::fabs(zi) <= tolODz)
806 ri = rMinAv + zi * tanRMin;
807 cosPsi = (xi * cosCPhi + yi * sinCPhi) / ri;
809 if (cosPsi >= cosHDPhiIT)
811 if (sd > halfRadTolerance)
819 risec = std::sqrt(xi * xi + yi * yi) * secRMin;
820 norm =
UVector3(-xi / risec, -yi / risec, tanRMin / secRMin);
821 if (norm.
Dot(v) <= 0)
830 if (sd > halfRadTolerance)
840 risec = std::sqrt(xi * xi + yi * yi) * secRMin;
841 norm =
UVector3(-xi / risec, -yi / risec, tanRMin / secRMin);
842 if (norm.
Dot(v) <= 0)
852 else if (nt3 < -rin * kRadTolerance * secRMin)
867 sd = c / (-b - std::sqrt(d));
871 sd = -b + std::sqrt(d);
874 ri = rMinAv + zi * tanRMin;
878 if ((sd >= 0) && (std::fabs(zi) <= tolODz))
883 double fTerm = sd - std::fmod(sd, dRmax);
890 cosPsi = (xi * cosCPhi + yi * sinCPhi) / ri;
892 if (cosPsi >= cosHDPhiOT)
894 if (sd > halfRadTolerance)
902 risec = std::sqrt(xi * xi + yi * yi) * secRMin;
903 norm =
UVector3(-xi / risec, -yi / risec, tanRMin / secRMin);
904 if (norm.
Dot(v) <= 0)
913 if (sd > halfRadTolerance)
923 risec = std::sqrt(xi * xi + yi * yi) * secRMin;
924 norm =
UVector3(-xi / risec, -yi / risec, tanRMin / secRMin);
925 if (norm.
Dot(v) <= 0)
937 sd = -b - std::sqrt(d);
941 sd = c / (-b + std::sqrt(d));
944 ri = rMinAv + zi * tanRMin;
946 if ((sd >= 0) && (ri > 0) && (std::fabs(zi) <= tolODz))
951 double fTerm = sd - std::fmod(sd, dRmax);
958 cosPsi = (xi * cosCPhi + yi * sinCPhi) / ri;
960 if (cosPsi >= cosHDPhiIT)
962 if (sd > halfRadTolerance)
970 risec = std::sqrt(xi * xi + yi * yi) * secRMin;
971 norm =
UVector3(-xi / risec, -yi / risec, tanRMin / secRMin);
972 if (norm.
Dot(v) <= 0)
981 if (sd > halfRadTolerance)
991 risec = std::sqrt(xi * xi + yi * yi) * secRMin;
992 norm =
UVector3(-xi / risec, -yi / risec, tanRMin / secRMin);
993 if (norm.
Dot(v) <= 0)
1010 if (std::fabs(p.
z) <= tolODz)
1018 cosPsi = (p.
x * cosCPhi + p.
y * sinCPhi) / std::sqrt(t3);
1020 if (cosPsi >= cosHDPhiIT)
1043 sd = -b - std::sqrt(d);
1047 sd = c / (-b + std::sqrt(d));
1049 zi = p.
z + sd * v.
z;
1050 ri = rMinAv + zi * tanRMin;
1056 sd = c / (-b - std::sqrt(d));
1060 sd = -b + std::sqrt(d);
1063 zi = p.
z + sd * v.
z;
1065 if ((sd >= 0) && (std::fabs(zi) <= tolODz))
1070 double fTerm = sd - std::fmod(sd, dRmax);
1075 xi = p.
x + sd * v.
x;
1076 yi = p.
y + sd * v.
y;
1077 ri = rMinAv + zi * tanRMin;
1078 cosPsi = (xi * cosCPhi + yi * sinCPhi) / ri;
1080 if (cosPsi >= cosHDPhiIT)
1093 return UUtils::kInfinity;
1108 sd = c / (-b - std::sqrt(d));
1112 sd = -b + std::sqrt(d);
1114 zi = p.
z + sd * v.
z;
1116 if ((sd >= 0) && (std::fabs(zi) <= tolODz))
1121 double fTerm = sd - std::fmod(sd, dRmax);
1126 xi = p.
x + sd * v.
x;
1127 yi = p.
y + sd * v.
y;
1128 ri = rMinAv + zi * tanRMin;
1129 cosPsi = (xi * cosCPhi + yi * sinCPhi) / ri;
1131 if (cosPsi >= cosHDPhiIT)
1160 Comp = v.
x * sinSPhi - v.
y * cosSPhi;
1164 Dist = (p.
y * cosSPhi - p.
x * sinSPhi);
1166 if (Dist < halfCarTolerance)
1177 zi = p.
z + sd * v.
z;
1179 if (std::fabs(zi) <= tolODz)
1181 xi = p.
x + sd * v.
x;
1182 yi = p.
y + sd * v.
y;
1183 rhoi2 = xi * xi + yi * yi;
1184 tolORMin2 = (rMinOAv + zi * tanRMin) * (rMinOAv + zi * tanRMin);
1185 tolORMax2 = (rMaxOAv + zi * tanRMax) * (rMaxOAv + zi * tanRMax);
1187 if ((rhoi2 >= tolORMin2) && (rhoi2 <= tolORMax2))
1192 if ((yi * cosCPhi - xi * sinCPhi) <= 0)
1204 Comp = -(v.
x * sinEPhi - v.
y * cosEPhi);
1208 Dist = -(p.
y * cosEPhi - p.
x * sinEPhi);
1209 if (Dist < halfCarTolerance)
1220 zi = p.
z + sd * v.
z;
1222 if (std::fabs(zi) <= tolODz)
1224 xi = p.
x + sd * v.
x;
1225 yi = p.
y + sd * v.
y;
1226 rhoi2 = xi * xi + yi * yi;
1227 tolORMin2 = (rMinOAv + zi * tanRMin) * (rMinOAv + zi * tanRMin);
1228 tolORMax2 = (rMaxOAv + zi * tanRMax) * (rMaxOAv + zi * tanRMax);
1230 if ((rhoi2 >= tolORMin2) && (rhoi2 <= tolORMax2))
1235 if ((yi * cosCPhi - xi * sinCPhi) >= 0.0)
1245 if (snxt < halfCarTolerance)
double DistanceToIn(const UVector3 &p, const UVector3 &v, double aPstep=UUtils::kInfinity) const
static double Tolerance()
double Dot(const UVector3 &) const
T max(const T t1, const T t2)
brief Return the largest of the two arguments