8#ifndef model_LineLineIntersection_CPP_
9#define model_LineLineIntersection_CPP_
47 const double normD0(D0.norm());
48 const double normD1(D1.norm());
49 if(normD0<FLT_EPSILON)
51 throw std::runtime_error(
"Norm of line direction D0 is close to singular. norm(D0)="+std::to_string(normD0)+
"\n");
53 if(normD1<FLT_EPSILON)
55 throw std::runtime_error(
"Norm of line direction D1 is close to singular. norm(D1)="+std::to_string(normD1)+
"\n");
62 if(normD0<FLT_EPSILON && normD1<FLT_EPSILON)
64 if(A0A1.squaredNorm()<FLT_EPSILON)
66 return std::make_tuple(INCIDENT,0.5*(A0+A1),0.5*(A0+A1),0.0,0.0);
70 return std::make_tuple(SKEW,A0,A1,0.0,0.0);
73 else if(normD0<FLT_EPSILON && normD1>=FLT_EPSILON)
75 const double u1 = -A0A1.dot(d1);
77 if((
x-A0).squaredNorm()<FLT_EPSILON)
79 return std::make_tuple(INCIDENT,0.5*(A0+
x),0.5*(A0+
x),0.0,u1);
83 return std::make_tuple(SKEW,A0,
x,0.0,u1);
86 else if(normD0>=FLT_EPSILON && normD1<FLT_EPSILON)
88 const double u0 = A0A1.dot(d0);
90 if((
x-A1).squaredNorm()<FLT_EPSILON)
92 return std::make_tuple(INCIDENT,0.5*(A1+
x),0.5*(A1+
x),u0,0.0);
96 return std::make_tuple(SKEW,
x,A1,u0,0.0);
107 const double d0d1(d0.dot(d1));
108 const double det(1.0-d0d1*d0d1);
109 const double num0=d0.dot(A0A1)-d0d1*d1.dot(A0A1);
110 const double num1=d0d1*d0.dot(A0A1)-d1.dot(A0A1);
111 if(fabs(
det)>FLT_EPSILON)
113 const double u0=num0/
det;
114 const double u1=num1/
det;
117 if((x0-x1).squaredNorm()<FLT_EPSILON)
119 return std::make_tuple(INCIDENT,x0,x1,u0,u1);
123 return std::make_tuple(SKEW,x0,x1,u0,u1);
128 const double A0A1norm(A0A1.norm());
129 if(A0A1norm<FLT_EPSILON)
131 return std::make_tuple(COINCIDENT,A0,A1,0.0,0.0);
133 else if(fabs(fabs(d0.dot(A0A1))-A0A1norm)<FLT_EPSILON)
135 return std::make_tuple(COINCIDENT,A0,A1,0.0,0.0);
139 return std::make_tuple(PARALLEL,A0,A1,0.0,0.0);
161 sol(findIntersections(A0,D0,A1,D1))
162 ,
type(std::get<0>(sol))
163 ,
x0(std::get<1>(sol))
164 ,
x1(std::get<2>(sol))
165 ,
u0(std::get<3>(sol))
166 ,
u1(std::get<4>(sol))
Eigen::Matrix< double, dim, 1 > VectorDimD
LineLineIntersection(const VectorDimD &A0, const VectorDimD &D0, const VectorDimD &A1, const VectorDimD &D1)
std::tuple< IntersectionType, VectorDimD, VectorDimD, double, double > SolutionType
const IntersectionType & type