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)