8#ifndef model_SegmentSegmentDistance_CPP_
9#define model_SegmentSegmentDistance_CPP_
59 const long double U = (T *
R -
S2) /
D2;
60 if (U < 0.0 || U > 1.0)
66 return std::make_pair(T, U);
86 else if (D1 < tol && D2 >=
tol)
113 const double& degeneracyValue_in) :
114 A(A0.template cast<long double>()),
115 B(B0.template cast<long double>()),
116 C(C0.template cast<long double>()),
117 D(D0.template cast<long double>()),
125 D1(
d1.squaredNorm()),
126 D2(
d2.squaredNorm()),
132 x0((
A+
t*
d1).template cast<double>()),
133 x1((
C+
u*
d2).template cast<double>())
156 if (
dMin < FLT_EPSILON)
173 const long double tC = (
C -
A).dot(
d1) /
D1;
174 const long double tD = (
D -
A).dot(
d1) /
D1;
176 std::multimap<long double, VectorDimLD> ms;
182 auto iter1 = ms.begin();
183 std::advance(iter1, 1);
184 auto iter2 = ms.begin();
185 std::advance(iter2, 2);
187 if ((iter1->second - iter2->second).norm() > FLT_EPSILON)
189 temp.emplace_back(iter1->second.template cast<double>(), iter1->first, (iter1->second -
C).dot(
d2) /
D2);
190 temp.emplace_back(iter2->second.template cast<double>(), iter2->first, (iter2->second -
C).dot(
d2) /
D2);
194 temp.emplace_back((0.5 * (iter1->second + iter2->second)).template cast<double>(),
195 0.5 * (iter1->first + iter2->first),
196 0.5 * ((iter1->second -
C).dot(
d2) /
D2 + (iter2->second -
C).dot(
d2) /
D2));
208 return (
dMin < tolerance);
const std::pair< long double, long double > tu
IntersectionContainerType intersectionSegment() const
std::pair< long double, long double > step4U(const long double &T) const
const double degeneracyValue
static long double limitRange(const long double &v)
std::pair< long double, long double > step2() const
bool isIntersecting(const double tolerance=FLT_EPSILON) const
Eigen::Matrix< double, dim, 1 > VectorDim
static constexpr double tol
std::pair< long double, long double > step3(const long double &T) const
std::pair< long double, long double > getTU() const
SegmentSegmentDistance(const VectorDim &A0, const VectorDim &B0, const VectorDim &C0, const VectorDim &D0, const double °eneracyValue_in=0.0)
std::pair< long double, long double > step4(const long double &U) const
std::deque< IntersectionPointType > IntersectionContainerType