1 #ifndef SimTK_SIMMATH_GEO_H_
2 #define SimTK_SIMMATH_GEO_H_
55 template <
class P>
class Point_;
56 template <
class P>
class Sphere_;
58 template <
class P>
class Line_;
59 template <
class P>
class Plane_;
60 template <
class P>
class Circle_;
61 template <
class P>
class Box_;
115 template <
class RealP,
int S>
static bool
117 {
return Pu.
normSqr() < getDefaultTolSqr<RealP>(); }
132 template <
class RealP,
int S>
static bool
134 {
return (Pu % Puu).normSqr() < getDefaultTolSqr<RealP>(); }
141 const RealP dsdu = Pu.
norm();
143 "Geo::calcUnitTangent()",
"Unit tangent undefined at a cusp.");
172 const RealP Pu2 = Pu.
normSqr();
174 "Geo::calcCurvatureVector()",
"Curvature undefined at a cusp.");
175 const RealP PuPuu =
dot(Pu,Puu);
176 const RealP uPrimeSqr = 1/Pu2;
177 const RealP u2Prime = -PuPuu *
square(uPrimeSqr);
178 return uPrimeSqr*Puu + u2Prime*Pu;
195 const RealP Pu2 = Pu.
normSqr();
197 "Geo::calcUnitNormal()",
"The normal is undefined at a cusp.");
202 const RealP Puu2 = Puu.
normSqr();
203 const RealP PuPuu =
dot(Pu,Puu);
204 const RealP PuXPuu2 = Pu2*Puu2 -
square(PuPuu);
205 if (PuXPuu2 < getDefaultTolSqr<RealP>())
206 return UnitVec3P(Pu).perp();
208 const RealP uPrimeSqr = 1/Pu2;
209 const RealP u2Prime = -PuPuu *
square(uPrimeSqr);
211 return UnitVec3P(-c);
223 template <
class RealP,
int S>
static RealP
230 const RealP Pu2 = Pu.
normSqr();
232 "Geo::calcCurveFrame()",
"Curve frame is undefined at a cusp.");
238 const RealP uPrimeSqr = 1/Pu2;
239 const RealP uPrime = std::sqrt(uPrimeSqr);
240 const UnitVec3P t(uPrime*Pu,
true);
244 const RealP Puu2 = Puu.
normSqr();
245 const RealP PuPuu =
dot(Pu,Puu);
246 const RealP PuXPuu2 = Pu2*Puu2 -
square(PuPuu);
249 if (PuXPuu2 < getDefaultTolSqr<RealP>()) {
254 const RealP u2Prime = -PuPuu *
square(uPrimeSqr);
257 n = UnitVec3P((-1/k)*c,
true);
262 const UnitVec3P b(n % t,
true);
265 X_FP.
updR().setRotationFromUnitVecsTrustMe(n,t,b);
282 template <
class RealP,
int S>
static RealP
284 const RealP Pu2 = Pu.
normSqr();
286 "Geo::calcCurvatureSqr()",
"Curvature is undefined at a cusp.");
287 const RealP num =
cross(Pu,Puu).normSqr();
288 const RealP den =
cube(Pu2);
305 template <
class RealP,
int S>
static RealP
309 const RealP PuXPuu2 = PuXPuu.
normSqr();
310 SimTK_ERRCHK(PuXPuu2 >= getDefaultTolSqr<RealP>(),
"Geo::calcTorsion()",
311 "Torsion is undefined at a cusp or inflection point.");
312 const RealP num =
dot(PuXPuu, Puuu);
338 template <
class RealP>
static void
339 findClosestPointsOfTwoLines
345 const RealP s2Theta = (d0 % d1).normSqr();
346 const RealP d =
dot(w,d0);
347 const RealP e = -
dot(w,d1);
353 linesAreParallel =
true;
356 linesAreParallel =
false;
357 const RealP cTheta =
dot(d0,d1);
358 const RealP oos2Theta = 1/s2Theta;
359 t0 = (e*cTheta + d) * oos2Theta;
360 t1 = (d*cTheta + e) * oos2Theta;
376 template <
class RealP>
static RealP getDefaultTol()
380 template <
class RealP>
static RealP getDefaultTolSqr()
381 {
return square(getDefaultTol<RealP>()); }
385 template <
class RealP>
static RealP getEps()
388 template <
class RealP>
static RealP getNaN()
391 template <
class RealP>
static RealP getInfinity()
398 template <
class RealP>
static RealP
stretchBy(RealP length, RealP tol) {
400 "The supplied tolerance %g is too small; must be at least %g"
401 " for significance at this precision.",
402 (
double)tol, (
double)getEps<RealP>());
404 return length +
std::max(length*tol, tol);
409 template <
class RealP>
static RealP stretch(RealP length)
410 {
return stretchBy(length, getDefaultTol<RealP>()); }
419 #endif // SimTK_SIMMATH_GEO_H_