41 double pRmin1,
double pRmax1,
42 double pRmin2,
double pRmax2,
44 double pSPhi,
double pDPhi)
45 :
VUSolid(pName.c_str()), fRmin1(pRmin1), fRmin2(pRmin2),
46 fRmax1(pRmax1), fRmax2(pRmax2), fDz(pDz), fSPhi(0.), fDPhi(0.)
54 std::ostringstream message;
55 message <<
"Invalid Z half-length for Solid: " <<
GetName() << std::endl
62 if (((pRmin1 >= pRmax1) || (pRmin2 >= pRmax2) || (pRmin1 < 0)) && (pRmin2 < 0))
64 std::ostringstream message;
65 message <<
"Invalid values of radii for Solid: " <<
GetName() << std::endl
66 <<
" pRmin1 = " << pRmin1 <<
", pRmin2 = " << pRmin2
67 <<
", pRmax1 = " << pRmax1 <<
", pRmax2 = " << pRmax2;
71 if ((pRmin1 == 0.0) && (pRmin2 > 0.0))
75 if ((pRmin2 == 0.0) && (pRmin1 > 0.0))
93 :
VUSolid(
""), kRadTolerance(0.), kAngTolerance(0.),
94 fRmin1(0.), fRmin2(0.), fRmax1(0.), fRmax2(0.), fDz(0.),
95 fSPhi(0.), fDPhi(0.), sinCPhi(0.), cosCPhi(0.), cosHDPhiOT(0.),
96 cosHDPhiIT(0.), sinSPhi(0.), cosSPhi(0.), sinEPhi(0.), cosEPhi(0.),
115 :
VUSolid(rhs), kRadTolerance(rhs.kRadTolerance),
116 kAngTolerance(rhs.kAngTolerance), fRmin1(rhs.fRmin1), fRmin2(rhs.fRmin2),
117 fRmax1(rhs.fRmax1), fRmax2(rhs.fRmax2), fDz(rhs.fDz), fSPhi(rhs.fSPhi),
118 fDPhi(rhs.fDPhi), sinCPhi(rhs.sinCPhi), cosCPhi(rhs.cosCPhi),
119 cosHDPhiOT(rhs.cosHDPhiOT), cosHDPhiIT(rhs.cosHDPhiIT),
120 sinSPhi(rhs.sinSPhi), cosSPhi(rhs.cosSPhi), sinEPhi(rhs.sinEPhi),
121 cosEPhi(rhs.cosEPhi), fPhiFullCone(rhs.fPhiFullCone)
141 VUSolid::operator=(rhs);
178 double distZ, distRMin, distRMax;
180 double pRMin, widRMin;
181 double pRMax, widRMax;
187 UVector3 nR, nr(0., 0., 0.), nPs, nPe;
189 distZ = std::fabs(std::fabs(p.
z()) -
fDz);
190 rho = std::sqrt(p.
x() * p.
x() + p.
y() * p.
y());
194 distRMin = std::fabs(pRMin - widRMin) /
secRMin;
198 distRMax = std::fabs(pRMax - widRMax) /
secRMax;
204 pPhi = std::atan2(p.
y(), p.
x());
206 if (pPhi <
fSPhi - delta)
215 distSPhi = std::fabs(pPhi -
fSPhi);
235 if (distRMax <= delta)
247 if (distSPhi <= dAngle)
252 if (distEPhi <= dAngle)
275 UWarning, 1,
"Point p is not on surface !?");
279 else if (noSurfaces == 1)
285 norm = sumnorm.
Unit();
290 return (
bool) noSurfaces;
303 double distZ, distRMin, distRMax, distSPhi, distEPhi, distMin;
304 double pRMin, widRMin;
305 double pRMax, widRMax;
307 distZ = std::fabs(std::fabs(p.
z()) -
fDz);
308 rho = std::sqrt(p.
x() * p.
x() + p.
y() * p.
y());
312 distRMin = std::fabs(pRMin - widRMin) /
secRMin;
316 distRMax = std::fabs(pRMax - widRMax) /
secRMax;
318 if (distRMin < distRMax)
320 if (distZ < distRMin)
333 if (distZ < distRMax)
346 phi = std::atan2(p.
y(), p.
x());
359 distSPhi = std::fabs(phi -
fSPhi) * rho;
362 distEPhi = std::fabs(phi -
fSPhi -
fDPhi) * rho;
366 if (distSPhi < distEPhi)
368 if (distSPhi < distMin)
375 if (distEPhi < distMin)
410 "Undefined side for valid surface normal to solid.");
448 double rMaxAv, rMaxOAv;
449 double rMinAv, rMinOAv;
452 double tolORMin, tolORMin2, tolIRMin, tolIRMin2;
453 double tolORMax2, tolIRMax, tolIRMax2;
454 double tolODz, tolIDz;
456 double Dist, sd, xi, yi, zi, ri = 0., risec, rhoi2, cosPsi;
458 double t1, t2, t3, b, c, d;
459 double nt1, nt2, nt3;
467 if (rMinAv > halfRadTolerance)
469 rMinOAv = rMinAv - halfRadTolerance;
476 rMaxOAv = rMaxAv + halfRadTolerance;
480 tolIDz =
fDz - halfCarTolerance;
481 tolODz =
fDz + halfCarTolerance;
483 if (std::fabs(p.
z()) >= tolIDz)
485 if (p.
z() * v.
z() < 0)
487 sd = (std::fabs(p.
z()) -
fDz) / std::fabs(v.
z());
494 xi = p.
x() + sd * v.
x();
495 yi = p.
y() + sd * v.
y();
496 rhoi2 = xi * xi + yi * yi ;
520 tolIRMin2 = tolIRMin * tolIRMin;
529 tolIRMax2 = tolIRMax * tolIRMax;
536 if ((tolIRMin2 <= rhoi2) && (rhoi2 <= tolIRMax2))
580 t1 = 1.0 - v.
z() * v.
z();
581 t2 = p.
x() * v.
x() + p.
y() * v.
y();
582 t3 = p.
x() * p.
x() + p.
y() * p.
y();
591 nt3 = t3 - rout * rout;
607 if ((rout < 0) && (nt3 <= 0))
614 sd = c / (-b - std::sqrt(d));
618 sd = -b + std::sqrt(d);
623 if ((b <= 0) && (c >= 0))
625 sd = c / (-b + std::sqrt(d));
631 sd = -b + std::sqrt(d);
644 double fTerm = sd - std::fmod(sd, dRmax);
647 zi = p.
z() + sd * v.
z();
649 if (std::fabs(zi) <= tolODz)
659 xi = p.
x() + sd * v.
x();
660 yi = p.
y() + sd * v.
y();
678 if ((t3 > (rin + halfRadTolerance *
secRMin)*
679 (rin + halfRadTolerance * secRMin))
680 && (nt2 < 0) && (d >= 0) && (std::fabs(p.
z()) <= tolIDz))
687 risec = std::sqrt(xi * xi + yi * yi) *
secRMax;
694 if (norm.
Dot(v) <= 0)
702 if (norm.
Dot(v) <= 0)
714 sd = -0.5 * nt3 / nt2;
722 zi = p.
z() + sd * v.
z();
724 if ((std::fabs(zi) <= tolODz) && (nt2 < 0))
734 xi = p.
x() + sd * v.
x();
735 yi = p.
y() + sd * v.
y();
766 nt3 = t3 - rin * rin;
782 sd = c / (-b - std::sqrt(d));
786 sd = -b + std::sqrt(d);
794 double fTerm = sd - std::fmod(sd, dRmax);
797 zi = p.
z() + sd * v.
z();
799 if (std::fabs(zi) <= tolODz)
803 xi = p.
x() + sd * v.
x();
804 yi = p.
y() + sd * v.
y();
810 if (sd > halfRadTolerance)
818 risec = std::sqrt(xi * xi + yi * yi) *
secRMin;
819 norm =
UVector3(-xi / risec, -yi / risec, tanRMin / secRMin);
820 if (norm.
Dot(v) <= 0)
829 if (sd > halfRadTolerance)
837 xi = p.
x() + sd * v.
x();
838 yi = p.
y() + sd * v.
y();
839 risec = std::sqrt(xi * xi + yi * yi) *
secRMin;
841 if (norm.
Dot(v) <= 0)
866 sd = c / (-b - std::sqrt(d));
870 sd = -b + std::sqrt(d);
872 zi = p.
z() + sd * v.
z();
877 if ((sd >= 0) && (std::fabs(zi) <= tolODz))
882 double fTerm = sd - std::fmod(sd, dRmax);
887 xi = p.
x() + sd * v.
x();
888 yi = p.
y() + sd * v.
y();
893 if (sd > halfRadTolerance)
901 risec = std::sqrt(xi * xi + yi * yi) *
secRMin;
902 norm =
UVector3(-xi / risec, -yi / risec, tanRMin / secRMin);
903 if (norm.
Dot(v) <= 0)
912 if (sd > halfRadTolerance)
920 xi = p.
x() + sd * v.
x();
921 yi = p.
y() + sd * v.
y();
922 risec = std::sqrt(xi * xi + yi * yi) *
secRMin;
923 norm =
UVector3(-xi / risec, -yi / risec, tanRMin / secRMin);
924 if (norm.
Dot(v) <= 0)
936 sd = -b - std::sqrt(d);
940 sd = c / (-b + std::sqrt(d));
942 zi = p.
z() + sd * v.
z();
945 if ((sd >= 0) && (ri > 0) && (std::fabs(zi) <= tolODz))
950 double fTerm = sd - std::fmod(sd, dRmax);
955 xi = p.
x() + sd * v.
x();
956 yi = p.
y() + sd * v.
y();
961 if (sd > halfRadTolerance)
969 risec = std::sqrt(xi * xi + yi * yi) *
secRMin;
970 norm =
UVector3(-xi / risec, -yi / risec, tanRMin / secRMin);
971 if (norm.
Dot(v) <= 0)
980 if (sd > halfRadTolerance)
988 xi = p.
x() + sd * v.
x();
989 yi = p.
y() + sd * v.
y();
990 risec = std::sqrt(xi * xi + yi * yi) *
secRMin;
991 norm =
UVector3(-xi / risec, -yi / risec, tanRMin / secRMin);
992 if (norm.
Dot(v) <= 0)
1009 if (std::fabs(p.
z()) <= tolODz)
1042 sd = -b - std::sqrt(d);
1046 sd = c / (-b + std::sqrt(d));
1048 zi = p.
z() + sd * v.
z();
1055 sd = c / (-b - std::sqrt(d));
1059 sd = -b + std::sqrt(d);
1062 zi = p.
z() + sd * v.
z();
1064 if ((sd >= 0) && (std::fabs(zi) <= tolODz))
1069 double fTerm = sd - std::fmod(sd, dRmax);
1074 xi = p.
x() + sd * v.
x();
1075 yi = p.
y() + sd * v.
y();
1107 sd = c / (-b - std::sqrt(d));
1111 sd = -b + std::sqrt(d);
1113 zi = p.
z() + sd * v.
z();
1115 if ((sd >= 0) && (std::fabs(zi) <= tolODz))
1120 double fTerm = sd - std::fmod(sd, dRmax);
1125 xi = p.
x() + sd * v.
x();
1126 yi = p.
y() + sd * v.
y();
1165 if (Dist < halfCarTolerance)
1176 zi = p.
z() + sd * v.
z();
1178 if (std::fabs(zi) <= tolODz)
1180 xi = p.
x() + sd * v.
x();
1181 yi = p.
y() + sd * v.
y();
1182 rhoi2 = xi * xi + yi * yi;
1186 if ((rhoi2 >= tolORMin2) && (rhoi2 <= tolORMax2))
1208 if (Dist < halfCarTolerance)
1219 zi = p.
z() + sd * v.
z();
1221 if (std::fabs(zi) <= tolODz)
1223 xi = p.
x() + sd * v.
x();
1224 yi = p.
y() + sd * v.
y();
1225 rhoi2 = xi * xi + yi * yi;
1229 if ((rhoi2 >= tolORMin2) && (rhoi2 <= tolORMax2))
1244 if (snxt < halfCarTolerance)
1261 double safe = 0.0, rho, safeR1, safeR2, safeZ, safePhi;
1262 double pRMin, pRMax;
1265 rho = std::sqrt(p.
x() * p.
x() + p.
y() * p.
y());
1266 safeZ = std::fabs(p.
z()) -
fDz;
1267 safeR1 = 0; safeR2 = 0;
1272 safeR1 = (pRMin - rho) /
secRMin;
1275 safeR2 = (rho - pRMax) /
secRMax;
1277 if (safeR1 > safeR2)
1289 safe = (rho - pRMax) /
secRMax;
1301 if ((outside) && (safePhi > safe))
1308 safe = 0.0;
return safe;
1310 if (!aAccurate)
return safe;
1316 safsq += safeR1 * safeR1;
1321 safsq += safeR2 * safeR2;
1326 safsq += safeZ * safeZ;
1329 if (count == 1)
return safe;
1330 return std::sqrt(safsq);
1355 double snxt, srd, sphi, pdist;
1360 double t1, t2, t3, rout, rin, nt1, nt2, nt3;
1361 double b, c, d, sr2, sr3;
1370 double pDistS, compS, pDistE, compE, sphi2, xi, yi, risec, vphi;
1371 double zi, ri, deltaRoi2;
1377 pdist =
fDz - p.
z();
1379 if (pdist > halfCarTolerance)
1381 snxt = pdist / v.
z();
1391 else if (v.
z() < 0.0)
1393 pdist =
fDz + p.
z();
1395 if (pdist > halfCarTolerance)
1397 snxt = -pdist / v.
z();
1402 aNormalVector =
UVector3(0, 0, -1);
1432 t1 = 1.0 - v.
z() * v.
z();
1433 t2 = p.
x() * v.
x() + p.
y() * v.
y();
1434 t3 = p.
x() * p.
x() + p.
y() * p.
y();
1439 nt3 = t3 - rout * rout;
1443 deltaRoi2 = snxt * snxt * t1 + 2 * snxt * t2 + t3
1446 else if (v.
z() < 0.0)
1448 deltaRoi2 = snxt * snxt * t1 + 2 * snxt * t2 + t3
1456 if (nt1 && (deltaRoi2 > 0.0))
1469 if (nt3 > -halfRadTolerance && nt2 >= 0)
1471 risec = std::sqrt(t3) *
secRMax;
1481 srd = -b - std::sqrt(d);
1485 srd = c / (-b + std::sqrt(d));
1488 zi = p.
z() + srd * v.
z();
1491 if ((ri >= 0) && (-halfRadTolerance <= srd) && (srd <= halfRadTolerance))
1499 if ((ri < 0) || (srd < halfRadTolerance))
1506 sr2 = c / (-b - std::sqrt(d));
1510 sr2 = -b + std::sqrt(d);
1512 zi = p.
z() + sr2 * v.
z();
1515 if ((ri >= 0) && (sr2 > halfRadTolerance))
1523 if ((-halfRadTolerance <= sr2) && (sr2 <= halfRadTolerance))
1540 risec = std::sqrt(t3) *
secRMax;
1546 else if (nt2 && (deltaRoi2 > 0.0))
1550 risec = std::sqrt(t3) *
secRMax;
1565 if (slentol <= halfCarTolerance)
1576 xi = p.
x() + slentol * v.
x();
1577 yi = p.
y() + slentol * v.
y();
1578 risec = std::sqrt(xi * xi + yi * yi) *
secRMax;
1581 if (norm.
Dot(v) > 0)
1583 aNormalVector = norm.
Unit();
1605 nt3 = t3 - rin * rin;
1623 risec = std::sqrt(p.
x() * p.
x() + p.
y() * p.
y()) *
secRMin;
1632 sr2 = -b - std::sqrt(d);
1636 sr2 = c / (-b + std::sqrt(d));
1638 zi = p.
z() + sr2 * v.
z();
1641 if ((ri >= 0.0) && (-halfRadTolerance <= sr2) && (sr2 <= halfRadTolerance))
1649 if ((ri < 0) || (sr2 < halfRadTolerance))
1653 sr3 = c / (-b - std::sqrt(d));
1657 sr3 = -b + std::sqrt(d);
1663 if (sr3 > halfRadTolerance)
1667 zi = p.
z() + sr3 * v.
z();
1677 else if (sr3 > -halfRadTolerance)
1685 else if ((sr2 < srd) && (sr2 > halfCarTolerance))
1690 else if (sr2 > -halfCarTolerance)
1697 if (slentol <= halfCarTolerance)
1706 xi = p.
x() + slentol * v.
x();
1707 yi = p.
y() + slentol * v.
y();
1708 if (sidetol ==
kRMax)
1710 risec = std::sqrt(xi * xi + yi * yi) *
secRMax;
1715 risec = std::sqrt(xi * xi + yi * yi) *
secRMin;
1718 if (norm.
Dot(v) > 0)
1722 aNormalVector = norm.
Unit();
1748 vphi = std::atan2(v.
y(), v.
x());
1750 if (vphi <
fSPhi - halfAngTolerance)
1754 else if (vphi >
fSPhi +
fDPhi + halfAngTolerance)
1774 && (pDistE <= halfCarTolerance)))
1776 && (pDistE > halfCarTolerance))))
1781 sphi = pDistS / compS;
1782 if (sphi >= -halfCarTolerance)
1784 xi = p.
x() + sphi * v.
x();
1785 yi = p.
y() + sphi * v.
y();
1794 if ((
fSPhi - halfAngTolerance <= vphi)
1795 && (
fSPhi +
fDPhi + halfAngTolerance >= vphi))
1807 if (pDistS > -halfCarTolerance)
1825 sphi2 = pDistE / compE;
1829 if ((sphi2 > -halfCarTolerance) && (sphi2 < sphi))
1831 xi = p.
x() + sphi2 * v.
x();
1832 yi = p.
y() + sphi2 * v.
y();
1841 if (!((
fSPhi - halfAngTolerance <= vphi)
1842 && (
fSPhi +
fDPhi + halfAngTolerance >= vphi)))
1845 if (pDistE <= -halfCarTolerance)
1861 if (pDistE <= -halfCarTolerance)
1883 if ((
fSPhi - halfAngTolerance <= vphi)
1884 && (vphi <=
fSPhi +
fDPhi + halfAngTolerance))
1910 xi = p.
x() + snxt * v.
x();
1911 yi = p.
y() + snxt * v.
y();
1912 risec = std::sqrt(xi * xi + yi * yi) *
secRMax;
1917 xi = p.
x() + snxt * v.
x();
1918 yi = p.
y() + snxt * v.
y();
1919 risec = std::sqrt(xi * xi + yi * yi) *
secRMin;
1952 aNormalVector =
UVector3(0, 0, -1);
1958 std::ostringstream message;
1959 int oldprc = message.precision(16);
1960 message <<
"Undefined side for valid surface normal to solid."
1962 <<
"Position:" << std::endl << std::endl
1963 <<
"p.x = " << p.
x() <<
" mm" << std::endl
1964 <<
"p.y = " << p.
y() <<
" mm" << std::endl
1965 <<
"p.z = " << p.
z() <<
" mm" << std::endl << std::endl
1966 <<
"pho at z = " << std::sqrt(p.
x() * p.
x() + p.
y() * p.
y())
1967 <<
" mm" << std::endl << std::endl;
1968 if (p.
x() != 0. || p.
y() != 0.)
1970 message <<
"point phi = " << std::atan2(p.
y(), p.
x()) / (
UUtils::kPi / 180.0)
1971 <<
" degree" << std::endl << std::endl;
1973 message <<
"Direction:" << std::endl << std::endl
1974 <<
"v.x = " << v.
x() << std::endl
1975 <<
"v.y = " << v.
y() << std::endl
1976 <<
"v.z = " << v.
z() << std::endl << std::endl
1977 <<
"Proposed distance :" << std::endl << std::endl
1978 <<
"snxt = " << snxt <<
" mm" << std::endl;
1979 message.precision(oldprc);
1983 if (snxt < halfCarTolerance)
1997 double safe = 0.0, rho, safeZ;
2002 int oldprc = cout.precision(16);
2005 cout <<
"Position:" << std::endl << std::endl;
2006 cout <<
"p.x = " << p.
x() <<
" mm" << std::endl;
2007 cout <<
"p.y = " << p.
y() <<
" mm" << std::endl;
2008 cout <<
"p.z = " << p.
z() <<
" mm" << std::endl << std::endl;
2009 cout <<
"pho at z = " << std::sqrt(p.
x() * p.
x() + p.
y() * p.
y())
2010 <<
" mm" << std::endl << std::endl;
2011 if ((p.
x() != 0.) || (p.
x() != 0.))
2013 cout <<
"point phi = " << std::atan2(p.
y(), p.
x()) /
degree
2014 <<
" degree" << std::endl << std::endl;
2016 cout.precision(oldprc);
2022 rho = std::sqrt(p.
x() * p.
x() + p.
y() * p.
y());
2025 safeZ =
fDz - std::fabs(p.
z());
2046 return std::string(
"Cons");
2056 return new UCons(*
this);
2065 int oldprc = os.precision(16);
2066 os <<
"-----------------------------------------------------------\n"
2067 <<
" *** Dump for solid - " <<
GetName() <<
" ***\n"
2068 <<
" ===================================================\n"
2069 <<
" Solid type: UCons\n"
2070 <<
" Parameters: \n"
2071 <<
" inside -fDz radius : " <<
fRmin1 <<
" mm \n"
2072 <<
" outside -fDz radius: " <<
fRmax1 <<
" mm \n"
2073 <<
" inside +fDz radius : " <<
fRmin2 <<
" mm \n"
2074 <<
" outside +fDz radius: " <<
fRmax2 <<
" mm \n"
2075 <<
" half length in Z : " <<
fDz <<
" mm \n"
2076 <<
" starting angle of segment: " <<
fSPhi / (
UUtils::kPi / 180.0) <<
" degrees \n"
2077 <<
" delta angle of segment : " <<
fDPhi / (
UUtils::kPi / 180.0) <<
" degrees \n"
2078 <<
"-----------------------------------------------------------\n";
2079 os.precision(oldprc);
2094 double Aone, Atwo, Athree, Afour, Afive, slin, slout, phi;
2095 double zRand, cosu, sinu, rRand1, rRand2, chose, rone, rtwo, qone, qtwo;
2117 cosu = std::cos(phi);
2118 sinu = std::sin(phi);
2126 chose =
UUtils::Random(0., Aone + Atwo + Athree + Afour + 2.*Afive);
2128 if ((chose >= 0.) && (chose < Aone))
2133 return UVector3(rtwo * cosu * (qtwo - zRand),
2134 rtwo * sinu * (qtwo - zRand), zRand);
2142 else if ((chose >= Aone) && (chose <= Aone + Atwo))
2147 return UVector3(rone * cosu * (qone - zRand),
2148 rone * sinu * (qone - zRand), zRand);
2156 else if ((chose >= Aone + Atwo) && (chose < Aone + Atwo + Athree))
2158 return UVector3(rRand1 * cosu, rRand1 * sinu, -1 *
fDz);
2160 else if ((chose >= Aone + Atwo + Athree)
2161 && (chose < Aone + Atwo + Athree + Afour))
2163 return UVector3(rRand2 * cosu, rRand2 * sinu,
fDz);
2165 else if ((chose >= Aone + Atwo + Athree + Afour)
2166 && (chose < Aone + Atwo + Athree + Afour + Afive))
2172 rRand1 * std::sin(
fSPhi), zRand);
2209 std::ostringstream message;
2210 message <<
"Invalid dphi." << std::endl
2211 <<
"Negative or zero delta-Phi (" << dPhi <<
") in solid: "
double SafetyToPhi(const UVector3 &p, const double rho, bool &outside) const
static double frTolerance
VUSolid::EnumInside Inside(const UVector3 &p) const
UGeometryType GetEntityType() const
std::ostream & StreamInfo(std::ostream &os) const
double DistanceToIn(const UVector3 &p, const UVector3 &v, double aPstep=UUtils::kInfinity) const
UCons & operator=(const UCons &rhs)
const std::string & GetName() const
double SafetyFromInsideR(const UVector3 &p, const double rho, bool) const
double GetOuterRadiusPlusZ() const
static double Tolerance()
double SafetyFromInside(const UVector3 &p, bool precise=false) const
static const double kInfinity
double GetStartPhiAngle() const
bool Normal(const UVector3 &p, UVector3 &n) const
double GetZHalfLength() const
static double faTolerance
double Dot(const UVector3 &) const
double GetInnerRadiusPlusZ() const
double GetRadiusInRing(double rmin, double rmax)
void Exception(const char *originOfException, const char *exceptionCode, UExceptionSeverity severity, int level, const char *description)
double GetOuterRadiusMinusZ() const
void Extent(UVector3 &aMin, UVector3 &aMax) const
virtual void GetParametersList(int, double *) const
T max(const T t1, const T t2)
brief Return the largest of the two arguments
double SafetyFromOutside(const UVector3 &p, bool precise=false) const
void CheckPhiAngles(double sPhi, double dPhi)
double GetDeltaPhiAngle() const
static const double degree
std::string UGeometryType
double GetInnerRadiusMinusZ() const
UVector3 GetPointOnSurface() const
UVector3 ApproxSurfaceNormal(const UVector3 &p) const
void CheckDPhiAngle(double dPhi)
double Random(double min=0.0, double max=1.0)
double DistanceToOut(const UVector3 &aPoint, const UVector3 &aDirection, UVector3 &aNormalVector, bool &aConvex, double aPstep=UUtils::kInfinity) const