8    template<
typename Real>
 
   14    template<
typename Real>
 
   20    template<
typename Real>
 
   26    template<
typename Real>
 
   32    template<
typename Real>
 
   38    template<
typename Real>
 
   45    template<
typename Real>
 
   56    template<
typename Real>
 
   70    template<
typename Real>
 
   80        Real t = l.dot(dir) / dir.normSquared();
 
   83        q = t < 0 ? segment.
v0 : q;
 
   84        q = t > 1 ? segment.
v1 : q;
 
 
   89    template<
typename Real>
 
   98    template<
typename Real>
 
  104    template<
typename Real>
 
  110    template<
typename Real>
 
  116    template<
typename Real>
 
  122    template<
typename Real>
 
  128    template<
typename Real>
 
  131        return (origin - pt.
origin).normSquared();
 
  134    template<
typename Real>
 
  140    template<
typename Real>
 
  146    template<
typename Real>
 
  152    template<
typename Real>
 
  158    template<
typename Real>
 
  169    template<
typename Real>
 
  183    template<
typename Real>
 
  193        Real t = offset.dot(dir) / dir.normSquared();
 
 
  198    template<
typename Real>
 
  204    template<
typename Real>
 
  210    template<
typename Real>
 
  217    template<
typename Real>
 
  224    template<
typename Real>
 
  231    template<
typename Real>
 
  240        Real f = u.normSquared();
 
  241        Real det = a * c - b * b;
 
  250            Real invDet = 1 / det;
 
  251            Real s = (b * e - c * d) * invDet;
 
  252            Real t = (a * e - b * d) * invDet;
 
 
  257    template<
typename Real>
 
  266        Real det = a * c - b * b;
 
  276        Real sNum = b * e - c * d;
 
  277        Real tNum = a * e - b * d;
 
  288        Real s = sNum / sDenom;
 
  289        Real t = tNum / tDenom;
 
 
  294    template<
typename Real>
 
  301        Real c = dir1.dot(dir1);
 
  303        Real e = u.dot(dir1);
 
  304        Real det = a * c - b * b;
 
  314        Real sNum = b * e - c * d;
 
  315        Real tNum = a * e - b * d;
 
  326        else if (tNum > tDenom) {
 
  332        Real s = sNum / sDenom;
 
  333        Real t = tNum / tDenom;
 
 
  338    template<
typename Real>
 
  353    template<
typename Real>
 
  359    template<
typename Real>
 
  365    template<
typename Real>
 
  371    template<
typename Real>
 
  377    template<
typename Real>
 
  383    template<
typename Real>
 
  389    template<
typename Real>
 
  395    template<
typename Real>
 
  398        return proximity(segment).lengthSquared();
 
 
  401    template<
typename Real>
 
  409        Real discr = a1 * a1 - a0;
 
  412            Real root = glm::sqrt(discr);
 
  417        else if (discr < (
Real)0)
 
 
  428    template<
typename Real>
 
  437    template<
typename Real>
 
  443    template<
typename Real>
 
  450    template<
typename Real>
 
  457    template<
typename Real>
 
  464    template<
typename Real>
 
  473        Real det = a * c - b * b;
 
  483            return (q0 - p0).lengthSquared() < (q1 - p1).lengthSquared() ? q0 - p0 : p1 - q1;
 
  486        Real sNum = b * e - c * d;
 
  487        Real tNum = a * e - b * d;
 
  509        Real s = sNum / sDenom;
 
  510        Real t = tNum / tDenom;
 
 
  515    template<
typename Real>
 
  524        Real det = a * c - b * b;
 
  531                return p0.
project(segment) - p0;
 
  541                return (p1 - q1).lengthSquared() < (p2 - q2).lengthSquared() ? (p1 - q1) : (p2 - q2);
 
  545        Real sNum = b * e - c * d;
 
  546        Real tNum = a * e - b * d;
 
  568        else if (tNum > tDenom) {
 
  579        Real s = sNum / sDenom;
 
  580        Real t = tNum / tDenom;
 
 
  585    template<
typename Real>
 
  591    template<
typename Real>
 
  597    template<
typename Real>
 
  603    template<
typename Real>
 
  606        return proximity(segment).lengthSquared();
 
 
  609    template<
typename Real>
 
  617        Real discr = a1 * a1 - a0;
 
  620            Real root = glm::sqrt(discr);
 
  622            if (-a1 + root < 
Real(0))
 
  626            else if (-a1 + root < 
Real(0))
 
  638        else if (discr < 
Real(0))
 
 
  653    template<
typename Real>
 
  662    template<
typename Real>
 
  668    template<
typename Real>
 
  675    template<
typename Real>
 
  682    template<
typename Real>
 
  689    template<
typename Real>
 
  695        Real a = dir0.normSquared();
 
  696        Real b = dir0.dot(dir1);
 
  697        Real c = dir1.normSquared();
 
  698        Real d = u.dot(dir0);
 
  699        Real e = u.dot(dir1);
 
  700        Real det = a * c - b * b;
 
  710            bool bOpposite = l0 < l1 ? false : 
true;
 
  714            return bOpposite ? -ret : ret;
 
  723        Real sNum = b * e - c * d;
 
  724        Real tNum = a * e - b * d;
 
  734        else if (sNum > det) {
 
  754        else if (tNum > tDenom) {
 
  759            else if ((-d + b) > a) {
 
  768        Real s = sNum / sDenom;
 
  769        Real t = tNum / tDenom;
 
 
  774    template<
typename Real>
 
  780    template<
typename Real>
 
  783        return proximity(segment).lengthSquared();
 
 
  786    template<
typename Real>
 
  789        return (
v1 - 
v0).norm();
 
 
  792    template<
typename Real>
 
  795        return (
v1 - 
v0).normSquared();
 
 
  798    template<
typename Real>
 
  804        Real a1 = dir.dot(diff);
 
  807        Real discr = a1 * a1 - a0;
 
  810            Real root = glm::sqrt(discr);
 
  829        else if (discr < (
Real)0)
 
 
  845    template<
typename Real>
 
  850        Real d2 = dir.normSquared();
 
 
  855    template<
typename Real>
 
  861    template<
typename Real>
 
  871    template<
typename Real>
 
  879    template<
typename Real>
 
  887    template<
typename Real>
 
  895    template<
typename Real>
 
  902    template<
typename Real>
 
  909    template<
typename Real>
 
  916    template<
typename Real>
 
  922    template<
typename Real>
 
  929    template<
typename Real>
 
  947    template<
typename Real>
 
  961    template<
typename Real>
 
  973    template<
typename Real>
 
  984    template<
typename Real>
 
Vector< Real, 2 > Coord2D
 
Vector< Real, 2 > Coord2D
 
1D geometric primitives in two-dimensional space
 
DYN_FUNC bool isValid() const
 
DYN_FUNC Real distance(const TPoint2D< Real > &pt) const
 
DYN_FUNC Real distanceSquared(const TPoint2D< Real > &pt) const
 
Vector< Real, 2 > Coord2D
 
DYN_FUNC int intersect(const TCircle2D< Real > &circle, TSegment2D< Real > &interSeg) const
 
DYN_FUNC TSegment2D< Real > proximity(const TLine2D< Real > &line) const
 
DYN_FUNC Real parameter(const Coord2D &pos) const
 
0D geometric primitive in two-dimensional space
 
DYN_FUNC TPoint2D< Real > project(const TLine2D< Real > &line) const
project a point onto linear components – lines, rays and segments
 
DYN_FUNC bool inside(const TLine2D< Real > &line) const
check whether a point strictly lies inside (excluding boundary) a 1D geometric primitive
 
DYN_FUNC Real distance(const TPoint2D< Real > &pt) const
 
DYN_FUNC TPoint2D & operator=(const Coord2D &p)
 
Vector< Real, 2 > Coord2D
 
DYN_FUNC Real distanceSquared(const TPoint2D< Real > &pt) const
 
DYN_FUNC const TSegment2D< Real > operator-(const TPoint2D< Real > &pt) const
 
Coord2D _normals[MAX_POLYGON_VERTEX_NUM]
 
TAlignedBox2D< Real > aabb()
 
void setAsLine(const Coord2D &v0, const Coord2D &v1)
 
Vector< Real, 2 > Coord2D
 
void setAsTriangle(const Coord2D &v0, const Coord2D &v1, const Coord2D &v2)
 
void setAsPentagon(const Coord2D &v0, const Coord2D &v1, const Coord2D &v2, const Coord2D &v3, const Coord2D &v4)
 
void setAsBox(Real hx, Real hy)
 
Coord2D _vertices[MAX_POLYGON_VERTEX_NUM]
 
DYN_FUNC TSegment2D< Real > proximity(const TRay2D< Real > &ray) const
 
DYN_FUNC Real parameter(const Coord2D &pos) const
 
Vector< Real, 2 > Coord2D
 
DYN_FUNC Real distance(const TPoint2D< Real > &pt) const
 
DYN_FUNC bool isValid() const
 
DYN_FUNC int intersect(const TCircle2D< Real > &sphere, TSegment2D< Real > &interSeg) const
 
DYN_FUNC Real distanceSquared(const TPoint2D< Real > &pt) const
 
DYN_FUNC Coord2D & startPoint()
 
DYN_FUNC Real parameter(const Coord2D &pos) const
 
DYN_FUNC Coord2D direction() const
 
DYN_FUNC Real length() const
 
DYN_FUNC bool isValid() const
 
DYN_FUNC TSegment2D< Real > proximity(const TSegment2D< Real > &segment) const
 
DYN_FUNC int intersect(const TCircle2D< Real > &circle, TSegment2D< Real > &interSeg) const
 
DYN_FUNC Coord2D & endPoint()
 
DYN_FUNC Real lengthSquared() const
 
DYN_FUNC Real distanceSquared(const TSegment2D< Real > &segment) const
 
DYN_FUNC TSegment2D< Real > operator-(void) const
 
DYN_FUNC Real distance(const TSegment2D< Real > &segment) const
 
Vector< Real, 2 > Coord2D
 
This is an implementation of AdditiveCCD based on peridyno.
 
constexpr Real REAL_EPSILON_SQUARED
 
DYN_FUNC T minimum(const T &v0, const T &v1)
 
constexpr Real REAL_EPSILON
 
DYN_FUNC T maximum(const T &v0, const T &v1)