16 #ifndef SURGSIM_MATH_GEOMETRY_H 17 #define SURGSIM_MATH_GEOMETRY_H 19 #include <boost/container/static_vector.hpp> 21 #include <Eigen/Geometry> 24 #include "SurgSim/Math/Polynomial.h" 48 static const double DistanceEpsilon = 1e-10;
51 static const double SquaredDistanceEpsilon = 1e-10;
54 static const double AngularEpsilon = 1e-10;
57 static const double ScalarEpsilon = 1e-10;
67 template <
class T,
int MOpt>
inline 69 const Eigen::Matrix<T, 2, 1, MOpt>& s0v1,
70 const Eigen::Matrix<T, 2, 1, MOpt>& s1v0,
71 const Eigen::Matrix<T, 2, 1, MOpt>& s1v1,
74 using SurgSim::Math::Geometry::DistanceEpsilon;
76 SURGSIM_ASSERT(s !=
nullptr) <<
"Null pointers sent in s variable";
77 SURGSIM_ASSERT(t !=
nullptr) <<
"Null pointers sent in t variable";
79 auto u = (s0v1 - s0v0).eval();
80 auto v = (s1v1 - s1v0).eval();
81 T denom = u[0] * v[1] - u[1] * v[0];
82 if (std::abs(denom) <=
static_cast<T
>(DistanceEpsilon))
87 auto w = (s0v0 - s1v0).eval();
88 *s = (v[0] * w[1] - v[1] * w[0]) / denom;
89 *t = (u[0] * w[1] - u[1] * w[0]) / denom;
91 return *s > -DistanceEpsilon && *s < (1.0 + DistanceEpsilon) &&
92 *t > -DistanceEpsilon && *t < (1.0 + DistanceEpsilon);
104 template <
class T,
int MOpt>
inline 106 const Eigen::Matrix<T, 3, 1, MOpt>& sv0,
107 const Eigen::Matrix<T, 3, 1, MOpt>& sv1,
108 Eigen::Matrix<T, 2, 1, MOpt>* coordinates)
110 const Eigen::Matrix<T, 3, 1, MOpt> line = sv1 - sv0;
111 const T length2 = line.squaredNorm();
112 if (length2 < Geometry::SquaredDistanceEpsilon)
114 coordinates->setConstant((std::numeric_limits<double>::quiet_NaN()));
117 (*coordinates)[1] = (pt - sv0).dot(line) / length2;
118 (*coordinates)[0] =
static_cast<T
>(1) - (*coordinates)[1];
132 template <
class T,
int MOpt>
inline 134 const Eigen::Matrix<T, 3, 1, MOpt>& tv0,
135 const Eigen::Matrix<T, 3, 1, MOpt>& tv1,
136 const Eigen::Matrix<T, 3, 1, MOpt>& tv2,
137 const Eigen::Matrix<T, 3, 1, MOpt>& tn,
138 Eigen::Matrix<T, 3, 1, MOpt>* coordinates)
140 const T signedTriAreaX2 = ((tv1 - tv0).cross(tv2 - tv0)).dot(tn);
141 if (signedTriAreaX2 < Geometry::SquaredDistanceEpsilon)
144 coordinates->setConstant((std::numeric_limits<double>::quiet_NaN()));
147 (*coordinates)[0] = ((tv1 - pt).cross(tv2 - pt)).dot(tn) / signedTriAreaX2;
148 (*coordinates)[1] = ((tv2 - pt).cross(tv0 - pt)).dot(tn) / signedTriAreaX2;
149 (*coordinates)[2] = 1 - (*coordinates)[0] - (*coordinates)[1];
163 template <
class T,
int MOpt>
inline 165 const Eigen::Matrix<T, 3, 1, MOpt>& pt,
166 const Eigen::Matrix<T, 3, 1, MOpt>& tv0,
167 const Eigen::Matrix<T, 3, 1, MOpt>& tv1,
168 const Eigen::Matrix<T, 3, 1, MOpt>& tv2,
169 Eigen::Matrix<T, 3, 1, MOpt>* coordinates)
171 Eigen::Matrix<T, 3, 1, MOpt> tn = (tv1 - tv0).cross(tv2 - tv0);
172 double norm = tn.norm();
173 if (norm < Geometry::DistanceEpsilon)
175 coordinates->setConstant((std::numeric_limits<double>::quiet_NaN()));
192 template <
class T,
int MOpt>
inline 194 const Eigen::Matrix<T, 3, 1, MOpt>& pt,
195 const Eigen::Matrix<T, 3, 1, MOpt>& tv0,
196 const Eigen::Matrix<T, 3, 1, MOpt>& tv1,
197 const Eigen::Matrix<T, 3, 1, MOpt>& tv2,
198 const Eigen::Matrix<T, 3, 1, MOpt>& tn)
200 Eigen::Matrix<T, 3, 1, MOpt> baryCoords;
202 baryCoords[0] * (tv0 - (tv2 * static_cast<T>(0.5) + tv1 * static_cast<T>(0.5))).norm() >=
203 -Geometry::ScalarEpsilon &&
204 baryCoords[1] * (tv1 - (tv0 * static_cast<T>(0.5) + tv2 * static_cast<T>(0.5))).norm() >=
205 -Geometry::ScalarEpsilon &&
206 baryCoords[2] * (tv2 - (tv1 * static_cast<T>(0.5) + tv0 * static_cast<T>(0.5))).norm() >=
207 -Geometry::ScalarEpsilon);
219 template <
class T,
int MOpt>
inline 221 const Eigen::Matrix<T, 3, 1, MOpt>& pt,
222 const Eigen::Matrix<T, 3, 1, MOpt>& tv0,
223 const Eigen::Matrix<T, 3, 1, MOpt>& tv1,
224 const Eigen::Matrix<T, 3, 1, MOpt>& tv2)
226 Eigen::Matrix<T, 3, 1, MOpt> baryCoords;
229 baryCoords[0] * (tv0 - (tv2 * static_cast<T>(0.5) + tv1 * static_cast<T>(0.5))).norm() >=
230 -Geometry::ScalarEpsilon &&
231 baryCoords[1] * (tv1 - (tv0 * static_cast<T>(0.5) + tv2 * static_cast<T>(0.5))).norm() >=
232 -Geometry::ScalarEpsilon &&
233 baryCoords[2] * (tv2 - (tv1 * static_cast<T>(0.5) + tv0 * static_cast<T>(0.5))).norm() >=
234 -Geometry::ScalarEpsilon);
242 template <
class T,
int MOpt>
inline 244 const Eigen::Matrix<T, 3, 1, MOpt>& a,
245 const Eigen::Matrix<T, 3, 1, MOpt>& b,
246 const Eigen::Matrix<T, 3, 1, MOpt>& c,
247 const Eigen::Matrix<T, 3, 1, MOpt>& d)
249 return std::abs((c - a).dot((b - a).cross(d - c))) < Geometry::ScalarEpsilon;
257 template <
class T,
int MOpt>
inline 259 const Eigen::Matrix<T, 3, 1, MOpt>& pt,
260 const Eigen::Matrix<T, 3, 1, MOpt>& v0,
261 const Eigen::Matrix<T, 3, 1, MOpt>& v1,
262 Eigen::Matrix<T, 3, 1, MOpt>* result)
267 Eigen::Matrix<T, 3, 1, MOpt> v01 = v1 - v0;
268 T v01_norm2 = v01.squaredNorm();
269 if (v01_norm2 <= Geometry::SquaredDistanceEpsilon)
272 T pv_norm2 = (pt - v0).squaredNorm();
273 return sqrt(pv_norm2);
275 T lambda = (v01).dot(pt - v0);
276 *result = v0 + lambda * v01 / v01_norm2;
277 return (*result - pt).norm();
288 template <
class T,
int MOpt>
inline 290 const Eigen::Matrix<T, 3, 1, MOpt>& pt,
291 const Eigen::Matrix<T, 3, 1, MOpt>& sv0,
292 const Eigen::Matrix<T, 3, 1, MOpt>& sv1,
293 Eigen::Matrix<T, 3, 1, MOpt>* result)
295 Eigen::Matrix<T, 3, 1, MOpt> v01 = sv1 - sv0;
296 T v01Norm2 = v01.squaredNorm();
297 if (v01Norm2 <= Geometry::SquaredDistanceEpsilon)
300 return (pt - sv0).norm();
302 T lambda = v01.dot(pt - sv0);
307 else if (lambda >= v01Norm2)
313 *result = sv0 + lambda * v01 / v01Norm2;
315 return (*result - pt).norm();
324 template <
class T,
int MOpt>
inline 326 const Eigen::Matrix<T, 3, 1, MOpt>& pt,
327 const Eigen::Matrix<T, 3, 1, MOpt>& tv0,
328 const Eigen::Matrix<T, 3, 1, MOpt>& tv1,
329 const Eigen::Matrix<T, 3, 1, MOpt>& tv2)
331 Eigen::Matrix<T, 3, 1, MOpt> pointOnSegment;
347 template <
class T,
int MOpt>
inline 349 const Eigen::Matrix<T, 3, 1, MOpt>& l0v0,
350 const Eigen::Matrix<T, 3, 1, MOpt>& l0v1,
351 const Eigen::Matrix<T, 3, 1, MOpt>& l1v0,
352 const Eigen::Matrix<T, 3, 1, MOpt>& l1v1,
353 Eigen::Matrix<T, 3, 1, MOpt>* pt0,
354 Eigen::Matrix<T, 3, 1, MOpt>* pt1)
363 Eigen::Matrix<T, 3, 1, MOpt> l0v01 = l0v1 - l0v0;
364 T a = l0v01.squaredNorm();
365 if (a <= Geometry::SquaredDistanceEpsilon)
371 Eigen::Matrix<T, 3, 1, MOpt> l1v01 = l1v1 - l1v0;
372 T b = -l0v01.dot(l1v01);
373 T c = l1v01.squaredNorm();
374 if (c <= Geometry::SquaredDistanceEpsilon)
380 Eigen::Matrix<T, 3, 1, MOpt> l0v0_l1v0 = l0v0 - l1v0;
381 T d = l0v01.dot(l0v0_l1v0);
382 T e = -l1v01.dot(l0v0_l1v0);
383 T ratio = a * c - b * b;
384 if (std::abs(ratio) <= Geometry::ScalarEpsilon)
393 T inv_ratio = T(1) / ratio;
394 lambda0 = (b * e - c * d) * inv_ratio;
395 lambda1 = (b * d - a * e) * inv_ratio;
397 *pt0 = l0v0 + lambda0 * l0v01;
398 *pt1 = l1v0 + lambda1 * l1v01;
399 return ((*pt0) - (*pt1)).norm();
414 template <
class T,
int MOpt>
416 const Eigen::Matrix<T, 3, 1, MOpt>& s0v0,
417 const Eigen::Matrix<T, 3, 1, MOpt>& s0v1,
418 const Eigen::Matrix<T, 3, 1, MOpt>& s1v0,
419 const Eigen::Matrix<T, 3, 1, MOpt>& s1v1,
420 Eigen::Matrix<T, 3, 1, MOpt>* pt0,
421 Eigen::Matrix<T, 3, 1, MOpt>* pt1,
431 Eigen::Matrix<T, 3, 1, MOpt> s0v01 = s0v1 - s0v0;
432 T a = s0v01.squaredNorm();
433 if (a <= Geometry::SquaredDistanceEpsilon)
437 return distancePointSegment<T>(s0v0, s1v0, s1v1, pt1);
439 Eigen::Matrix<T, 3, 1, MOpt> s1v01 = s1v1 - s1v0;
440 T b = -s0v01.dot(s1v01);
441 T c = s1v01.squaredNorm();
442 if (c <= Geometry::SquaredDistanceEpsilon)
446 return distancePointSegment<T>(s1v0, s0v0, s0v1, pt0);
448 Eigen::Matrix<T, 3, 1, MOpt> tempLine = s0v0 - s1v0;
449 T d = s0v01.dot(tempLine);
450 T e = -s1v01.dot(tempLine);
451 T ratio = a * c - b * b;
456 if (1.0 - std::abs(s0v01.normalized().dot(s1v01.normalized())) >= Geometry::SquaredDistanceEpsilon)
531 enum edge_type { s0, s1, t0, t1, edge_skip, edge_invalid };
532 edge_type edge = edge_invalid;
743 *pt0 = s0v0 + s * (s0v01);
744 *pt1 = s1v0 + t * (s1v01);
745 if (s0t !=
nullptr && s1t !=
nullptr)
750 return ((*pt1) - (*pt0)).norm();
762 template <
class T,
int MOpt>
inline 764 const Eigen::Matrix<T, 3, 1, MOpt>& pt,
765 const Eigen::Matrix<T, 3, 1, MOpt>& tv0,
766 const Eigen::Matrix<T, 3, 1, MOpt>& tv1,
767 const Eigen::Matrix<T, 3, 1, MOpt>& tv2,
768 Eigen::Matrix<T, 3, 1, MOpt>* result)
775 Eigen::Matrix<T, 3, 1, MOpt> tv01 = tv1 - tv0;
776 Eigen::Matrix<T, 3, 1, MOpt> tv02 = tv2 - tv0;
777 T a = tv01.squaredNorm();
778 if (a <= Geometry::SquaredDistanceEpsilon)
781 return distancePointSegment<T>(pt, tv0, tv2, result);
783 T b = tv01.dot(tv02);
784 T tCross = tv01.cross(tv02).squaredNorm();
785 if (tCross <= Geometry::SquaredDistanceEpsilon)
788 return distancePointSegment<T>(pt, tv0, tv1, result);
790 T c = tv02.squaredNorm();
791 if (c <= Geometry::SquaredDistanceEpsilon)
794 return distancePointSegment<T>(pt, tv0, tv1, result);
796 Eigen::Matrix<T, 3, 1, MOpt> tv0pv0 = tv0 - pt;
797 T d = tv01.dot(tv0pv0);
798 T e = tv02.dot(tv0pv0);
799 T ratio = a * c - b * b;
856 T numer, denom, tmp0, tmp1;
857 enum edge_type { s0, t0, s1t1, edge_skip, edge_invalid };
858 edge_type edge = edge_invalid;
863 numer = T(1) / ratio;
907 tmp1 = -a - d + b + e;
931 t = (-e >= c ? 1 : -e / c);
943 s = (-d >= a ? 1 : -d / a);
948 numer = c + e - b - d;
955 denom = a - 2 * b + c;
956 s = (numer >= denom ? 1 : numer / denom);
965 *result = tv0 + s * tv01 + t * tv02;
966 return ((*result) - pt).norm();
983 template <
class T,
int MOpt>
inline 985 const Eigen::Matrix<T, 3, 1, MOpt>& sv0,
986 const Eigen::Matrix<T, 3, 1, MOpt>& sv1,
987 const Eigen::Matrix<T, 3, 1, MOpt>& tv0,
988 const Eigen::Matrix<T, 3, 1, MOpt>& tv1,
989 const Eigen::Matrix<T, 3, 1, MOpt>& tv2,
990 const Eigen::Matrix<T, 3, 1, MOpt>& tn,
991 Eigen::Matrix<T, 3, 1, MOpt>* result)
994 Eigen::Matrix<T, 3, 1, MOpt> u = tv1 - tv0;
995 Eigen::Matrix<T, 3, 1, MOpt> v = tv2 - tv0;
998 Eigen::Matrix<T, 3, 1, MOpt> dir = sv1 - sv0;
999 Eigen::Matrix<T, 3, 1, MOpt> w0 = sv0 - tv0;
1003 result->setConstant((std::numeric_limits<double>::quiet_NaN()));
1006 if (std::abs(b) <= Geometry::AngularEpsilon)
1008 if (std::abs(a) <= Geometry::AngularEpsilon)
1011 Eigen::Matrix<T, 3, 1, MOpt> baryCoords;
1012 for (
int i = 0; i < 2; ++i)
1015 if (baryCoords[0] >= 0 && baryCoords[1] >= 0 && baryCoords[2] >= 0)
1017 *result = (i == 0) ? sv0 : sv1;
1034 if (r < -Geometry::DistanceEpsilon)
1039 if (r > 1 + Geometry::DistanceEpsilon)
1045 Eigen::Matrix<T, 3, 1, MOpt> presumedIntersection = sv0 + r * dir;
1050 Eigen::Matrix<T, 3, 1, MOpt> w = presumedIntersection - tv0;
1053 T D = uv * uv - uu * vv;
1055 T s = (uv * wv - vv * wu) / D;
1057 if (s < -Geometry::DistanceEpsilon || s > 1 + Geometry::DistanceEpsilon)
1061 T t = (uv * wu - uu * wv) / D;
1063 if (t < -Geometry::DistanceEpsilon || (s + t) > 1 + Geometry::DistanceEpsilon)
1068 *result = sv0 + r * dir;
1082 template <
class T,
int MOpt>
inline 1084 const Eigen::Matrix<T, 3, 1, MOpt>& pt,
1085 const Eigen::Matrix<T, 3, 1, MOpt>& n,
1087 Eigen::Matrix<T, 3, 1, MOpt>* result)
1089 T dist = n.dot(pt) + d;
1090 *result = pt - n * dist;
1109 template <
class T,
int MOpt>
inline 1111 const Eigen::Matrix<T, 3, 1, MOpt>& sv0,
1112 const Eigen::Matrix<T, 3, 1, MOpt>& sv1,
1113 const Eigen::Matrix<T, 3, 1, MOpt>& n,
1115 Eigen::Matrix<T, 3, 1, MOpt>* closestPointSegment,
1116 Eigen::Matrix<T, 3, 1, MOpt>* planeIntersectionPoint)
1118 T dist0 = n.dot(sv0) + d;
1119 T dist1 = n.dot(sv1) + d;
1121 Eigen::Matrix<T, 3, 1, MOpt> v01 = sv1 - sv0;
1122 if (std::abs(n.dot(v01)) <= Geometry::AngularEpsilon)
1124 *closestPointSegment = (sv0 + sv1) * T(0.5);
1125 dist0 = n.dot(*closestPointSegment) + d;
1126 *planeIntersectionPoint = *closestPointSegment - dist0 * n;
1127 return (std::abs(dist0) < Geometry::DistanceEpsilon ? 0 : dist0);
1130 if ((dist0 > 0 && dist1 > 0) || (dist0 < 0 && dist1 < 0))
1132 if (std::abs(dist0) < std::abs(dist1))
1134 *closestPointSegment = sv0;
1135 *planeIntersectionPoint = sv0 - dist0 * n;
1140 *closestPointSegment = sv1;
1141 *planeIntersectionPoint = sv1 - dist1 * n;
1148 Eigen::Matrix<T, 3, 1, MOpt> v01 = sv1 - sv0;
1149 T lambda = (-d - sv0.dot(n)) / v01.dot(n);
1150 *planeIntersectionPoint = sv0 + lambda * v01;
1151 *closestPointSegment = *planeIntersectionPoint;
1165 template <
class T,
int MOpt>
inline 1167 const Eigen::Matrix<T, 3, 1, MOpt>& v0,
1168 const Eigen::Matrix<T, 3, 1, MOpt>& v1,
1169 const Eigen::Matrix<T, 3, 1, MOpt>& n,
1171 Eigen::Matrix<T, 3, 1, MOpt>* intersectionPoint)
1173 Eigen::Matrix<T, 3, 1, MOpt> v01 = v1 - v0;
1174 T v01dotN = v01.dot(n);
1175 if (std::abs(n.dot(v01.normalized())) > Geometry::AngularEpsilon)
1177 T lambda = (-d - v0.dot(n)) / v01dotN;
1178 *intersectionPoint = v0 + lambda * v01;
1181 T dist = std::abs(v0.dot(n) + d);
1182 if (dist < Geometry::DistanceEpsilon)
1184 *intersectionPoint = v0;
1203 template <
class T,
int MOpt>
inline 1205 const Eigen::Matrix<T, 3, 1, MOpt>& tv0,
1206 const Eigen::Matrix<T, 3, 1, MOpt>& tv1,
1207 const Eigen::Matrix<T, 3, 1, MOpt>& tv2,
1208 const Eigen::Matrix<T, 3, 1, MOpt>& n,
1210 Eigen::Matrix<T, 3, 1, MOpt>* closestPointTriangle,
1211 Eigen::Matrix<T, 3, 1, MOpt>* planeProjectionPoint)
1213 Eigen::Matrix<T, 3, 1, MOpt> distances(n.dot(tv0) + d, n.dot(tv1) + d, n.dot(tv2) + d);
1214 Eigen::Matrix<T, 3, 1, MOpt> t01 = tv1 - tv0;
1215 Eigen::Matrix<T, 3, 1, MOpt> t02 = tv2 - tv0;
1216 Eigen::Matrix<T, 3, 1, MOpt> t12 = tv2 - tv1;
1218 closestPointTriangle->setConstant((std::numeric_limits<double>::quiet_NaN()));
1219 planeProjectionPoint->setConstant((std::numeric_limits<double>::quiet_NaN()));
1224 if (std::abs(n.dot(t01)) <= Geometry::AngularEpsilon && std::abs(n.dot(t02)) <= Geometry::AngularEpsilon)
1226 *closestPointTriangle = (tv0 + tv1 + tv2) / T(3);
1227 *planeProjectionPoint = *closestPointTriangle - n * distances[0];
1228 return distances[0];
1232 if ((distances.array() < -Geometry::DistanceEpsilon).any() &&
1233 (distances.array() > Geometry::DistanceEpsilon).any())
1235 if (distances[0] * distances[1] < 0)
1237 *closestPointTriangle = tv0 + (-d - n.dot(tv0)) / n.dot(t01) * t01;
1238 if (distances[0] * distances[2] < 0)
1240 *planeProjectionPoint = tv0 + (-d - n.dot(tv0)) / n.dot(t02) * t02;
1244 Eigen::Matrix<T, 3, 1, MOpt> t12 = tv2 - tv1;
1245 *planeProjectionPoint = tv1 + (-d - n.dot(tv1)) / n.dot(t12) * t12;
1250 *closestPointTriangle = tv0 + (-d - n.dot(tv0)) / n.dot(t02) * t02;
1251 *planeProjectionPoint = tv1 + (-d - n.dot(tv1)) / n.dot(t12) * t12;
1255 *closestPointTriangle = *planeProjectionPoint = (*closestPointTriangle + *planeProjectionPoint) * T(0.5);
1260 distances.cwiseAbs().minCoeff(&index);
1264 *closestPointTriangle = tv0;
1265 *planeProjectionPoint = tv0 - n * distances[0];
1266 return distances[0];
1268 *closestPointTriangle = tv1;
1269 *planeProjectionPoint = tv1 - n * distances[1];
1270 return distances[1];
1272 *closestPointTriangle = tv2;
1273 *planeProjectionPoint = tv2 - n * distances[2];
1274 return distances[2];
1277 return std::numeric_limits<T>::quiet_NaN();
1287 template <
class T,
int MOpt>
inline 1289 const Eigen::Matrix<T, 3, 1, MOpt>& pn0, T pd0,
1290 const Eigen::Matrix<T, 3, 1, MOpt>& pn1, T pd1,
1291 Eigen::Matrix<T, 3, 1, MOpt>* pt0,
1292 Eigen::Matrix<T, 3, 1, MOpt>* pt1)
1295 const Eigen::Matrix<T, 3, 1, MOpt> lineDir = pn0.cross(pn1);
1296 const T lineDirNorm2 = lineDir.squaredNorm();
1298 pt0->setConstant((std::numeric_limits<double>::quiet_NaN()));
1299 pt1->setConstant((std::numeric_limits<double>::quiet_NaN()));
1302 if (lineDirNorm2 <= Geometry::SquaredDistanceEpsilon)
1307 *pt0 = (pd1 * pn0 - pd0 * pn1).cross(lineDir) / lineDirNorm2;
1308 *pt1 = *pt0 + lineDir;
1322 template <
class T,
int MOpt>
inline 1324 const Eigen::Matrix<T, 3, 1, MOpt>& sv0,
1325 const Eigen::Matrix<T, 3, 1, MOpt>& sv1,
1326 const Eigen::Matrix<T, 3, 1, MOpt>& tv0,
1327 const Eigen::Matrix<T, 3, 1, MOpt>& tv1,
1328 const Eigen::Matrix<T, 3, 1, MOpt>& tv2,
1329 const Eigen::Matrix<T, 3, 1, MOpt>& normal,
1330 Eigen::Matrix<T, 3, 1, MOpt>* segmentPoint,
1331 Eigen::Matrix<T, 3, 1, MOpt>* trianglePoint)
1333 segmentPoint->setConstant((std::numeric_limits<double>::quiet_NaN()));
1334 trianglePoint->setConstant((std::numeric_limits<double>::quiet_NaN()));
1337 const Eigen::Matrix<T, 3, 1, MOpt>& n = normal;
1339 Eigen::Matrix<T, 3, 1, MOpt> baryCoords;
1341 const Eigen::Matrix<T, 3, 1, MOpt> v01 = sv1 - sv0;
1342 const T v01DotTn = n.dot(v01);
1343 if (std::abs(n.dot(v01.normalized())) <= Geometry::AngularEpsilon)
1348 Eigen::Matrix<T, 3, 1, MOpt> baryCoords;
1350 if (baryCoords[0] >= 0 && baryCoords[1] >= 0 && baryCoords[2] >= 0)
1352 *segmentPoint = sv0;
1357 if (baryCoords[0] >= 0 && baryCoords[1] >= 0 && baryCoords[2] >= 0)
1359 *segmentPoint = sv1;
1366 T lambda = -n.dot(sv0 - tv0) / v01DotTn;
1367 if (lambda >= 0 && lambda <= 1)
1369 *segmentPoint = *trianglePoint = sv0 + lambda * v01;
1378 Eigen::Matrix<T, 3, 1, MOpt> segColPt01, segColPt02, segColPt12, triColPt01, triColPt02, triColPt12;
1382 Eigen::Matrix<T, 3, 1, MOpt> ptTriCol0, ptTriCol1;
1386 dstPtTri0 = std::numeric_limits<T>::max();
1391 dstPtTri1 = std::numeric_limits<T>::max();
1395 Eigen::Matrix<double, 5, 1> distances;
1396 (distances << dst01, dst02, dst12, dstPtTri0, dstPtTri1).finished().minCoeff(&minIndex);
1400 *segmentPoint = segColPt01;
1401 *trianglePoint = triColPt01;
1404 *segmentPoint = segColPt02;
1405 *trianglePoint = triColPt02;
1408 *segmentPoint = segColPt12;
1409 *trianglePoint = triColPt12;
1412 *segmentPoint = sv0;
1413 *trianglePoint = ptTriCol0;
1416 *segmentPoint = sv1;
1417 *trianglePoint = ptTriCol1;
1422 return std::numeric_limits<T>::quiet_NaN();
1437 template <
class T,
int MOpt>
inline 1439 const Eigen::Matrix<T, 3, 1, MOpt>& sv0,
1440 const Eigen::Matrix<T, 3, 1, MOpt>& sv1,
1441 const Eigen::Matrix<T, 3, 1, MOpt>& tv0,
1442 const Eigen::Matrix<T, 3, 1, MOpt>& tv1,
1443 const Eigen::Matrix<T, 3, 1, MOpt>& tv2,
1444 Eigen::Matrix<T, 3, 1, MOpt>* segmentPoint,
1445 Eigen::Matrix<T, 3, 1, MOpt>* trianglePoint)
1447 Eigen::Matrix<T, 3, 1, MOpt> n = (tv1 - tv0).cross(tv2 - tv1);
1462 template <
class T,
int MOpt>
inline 1464 const Eigen::Matrix<T, 3, 1, MOpt>& t0v0,
1465 const Eigen::Matrix<T, 3, 1, MOpt>& t0v1,
1466 const Eigen::Matrix<T, 3, 1, MOpt>& t0v2,
1467 const Eigen::Matrix<T, 3, 1, MOpt>& t1v0,
1468 const Eigen::Matrix<T, 3, 1, MOpt>& t1v1,
1469 const Eigen::Matrix<T, 3, 1, MOpt>& t1v2,
1470 Eigen::Matrix<T, 3, 1, MOpt>* closestPoint0,
1471 Eigen::Matrix<T, 3, 1, MOpt>* closestPoint1)
1474 T minDst = std::numeric_limits<T>::max();
1476 Eigen::Matrix<T, 3, 1, MOpt> segPt, triPt;
1477 Eigen::Matrix<T, 3, 1, MOpt> n0 = (t0v1 - t0v0).cross(t0v2 - t0v0);
1479 Eigen::Matrix<T, 3, 1, MOpt> n1 = (t1v1 - t1v0).cross(t1v2 - t1v0);
1482 if (currDst < minDst)
1485 *closestPoint0 = segPt;
1486 *closestPoint1 = triPt;
1489 if (currDst < minDst)
1492 *closestPoint0 = segPt;
1493 *closestPoint1 = triPt;
1496 if (currDst < minDst)
1499 *closestPoint0 = segPt;
1500 *closestPoint1 = triPt;
1504 if (currDst < minDst)
1507 *closestPoint1 = segPt;
1508 *closestPoint0 = triPt;
1511 if (currDst < minDst)
1514 *closestPoint1 = segPt;
1515 *closestPoint0 = triPt;
1518 if (currDst < minDst)
1521 *closestPoint1 = segPt;
1522 *closestPoint0 = triPt;
1533 template <
class T,
int MOpt>
1535 const Eigen::Matrix<T, 3, 1, MOpt>& sv0,
1536 const Eigen::Matrix<T, 3, 1, MOpt>& sv1,
1537 const Eigen::AlignedBox<T, 3>& box,
1538 std::vector<Eigen::Matrix<T, 3, 1, MOpt>>* intersections)
1540 Eigen::Array<T, 3, 1, MOpt> v01 = sv1 - sv0;
1541 Eigen::Array<bool, 3, 1, MOpt> parallelToPlane = (v01.cwiseAbs().array() < Geometry::DistanceEpsilon);
1542 if (parallelToPlane.any())
1544 Eigen::Array<bool, 3, 1, MOpt> beyondMinCorner = (sv0.array() < box.min().array());
1545 Eigen::Array<bool, 3, 1, MOpt> beyondMaxCorner = (sv0.array() > box.max().array());
1546 if ((parallelToPlane && (beyondMinCorner || beyondMaxCorner)).any())
1555 Eigen::Array<T, 3, 2, MOpt> planeIntersectionAbscissas;
1556 planeIntersectionAbscissas.col(0) = (box.min().array() - sv0.array());
1557 planeIntersectionAbscissas.col(1) = (box.max().array() - sv0.array());
1561 planeIntersectionAbscissas.colwise() /= v01;
1563 T entranceAbscissa = planeIntersectionAbscissas.rowwise().minCoeff().maxCoeff();
1564 T exitAbscissa = planeIntersectionAbscissas.rowwise().maxCoeff().minCoeff();
1565 if (entranceAbscissa < exitAbscissa && exitAbscissa > T(0.0))
1567 if (entranceAbscissa >= T(0.0) && entranceAbscissa <= T(1.0))
1569 intersections->push_back(sv0 + v01.matrix() * entranceAbscissa);
1572 if (exitAbscissa >= T(0.0) && exitAbscissa <= T(1.0))
1574 intersections->push_back(sv0 + v01.matrix() * exitAbscissa);
1587 template <
class T,
int MOpt>
1589 const Eigen::Matrix<T, 3, 1, MOpt>& capsuleBottom,
1590 const Eigen::Matrix<T, 3, 1, MOpt>& capsuleTop,
1591 const T capsuleRadius,
1592 const Eigen::AlignedBox<T, 3>& box)
1594 Eigen::AlignedBox<double, 3> dilatedBox(box.min().array() - capsuleRadius, box.max().array() + capsuleRadius);
1595 std::vector<Vector3d> candidates;
1597 if (dilatedBox.contains(capsuleBottom))
1599 candidates.push_back(capsuleBottom);
1601 if (dilatedBox.contains(capsuleTop))
1603 candidates.push_back(capsuleTop);
1606 bool doesIntersect =
false;
1607 ptrdiff_t dimensionsOutsideBox;
1608 Vector3d clampedPosition, segmentPoint;
1609 for (
auto candidate = candidates.cbegin(); candidate != candidates.cend(); ++candidate)
1616 dimensionsOutsideBox = (candidate->array() > box.max().array()).count();
1617 dimensionsOutsideBox += (candidate->array() < box.min().array()).count();
1618 if (dimensionsOutsideBox >= 2)
1620 clampedPosition = (*candidate).array().min(box.max().array()).max(box.min().array());
1621 if (
distancePointSegment(clampedPosition, capsuleBottom, capsuleTop, &segmentPoint) > capsuleRadius)
1627 doesIntersect =
true;
1630 return doesIntersect;
1640 template <
class T,
int VOpt>
1642 const Eigen::Matrix<T, 3, 1, VOpt>& segment0,
const Eigen::Matrix<T, 3, 1, VOpt>& segment1)
1644 auto pointToSegmentStart = segment0 - point;
1645 auto segmentDirection = segment1 - segment0;
1646 auto squaredNorm = segmentDirection.squaredNorm();
1647 SURGSIM_ASSERT(squaredNorm != 0.0) <<
"Line is defined by two collocated points.";
1648 auto distance = -pointToSegmentStart.dot(segmentDirection) / squaredNorm;
1649 auto p0Proj = segment0 + distance * segmentDirection;
1663 template <
class T,
int MOpt>
inline 1665 const Eigen::Matrix<T, 3, 1, MOpt>& t0v0,
1666 const Eigen::Matrix<T, 3, 1, MOpt>& t0v1,
1667 const Eigen::Matrix<T, 3, 1, MOpt>& t0v2,
1668 const Eigen::Matrix<T, 3, 1, MOpt>& t1v0,
1669 const Eigen::Matrix<T, 3, 1, MOpt>& t1v1,
1670 const Eigen::Matrix<T, 3, 1, MOpt>& t1v2,
1671 const Eigen::Matrix<T, 3, 1, MOpt>& t0n,
1672 const Eigen::Matrix<T, 3, 1, MOpt>& t1n);
1680 template <
class T,
int MOpt>
inline 1681 bool doesIntersectTriangleTriangle(
1682 const Eigen::Matrix<T, 3, 1, MOpt>& t0v0,
1683 const Eigen::Matrix<T, 3, 1, MOpt>& t0v1,
1684 const Eigen::Matrix<T, 3, 1, MOpt>& t0v2,
1685 const Eigen::Matrix<T, 3, 1, MOpt>& t1v0,
1686 const Eigen::Matrix<T, 3, 1, MOpt>& t1v1,
1687 const Eigen::Matrix<T, 3, 1, MOpt>& t1v2);
1708 template <
class T,
int MOpt>
inline 1710 const Eigen::Matrix<T, 3, 1, MOpt>& t0v0,
1711 const Eigen::Matrix<T, 3, 1, MOpt>& t0v1,
1712 const Eigen::Matrix<T, 3, 1, MOpt>& t0v2,
1713 const Eigen::Matrix<T, 3, 1, MOpt>& t1v0,
1714 const Eigen::Matrix<T, 3, 1, MOpt>& t1v1,
1715 const Eigen::Matrix<T, 3, 1, MOpt>& t1v2,
1716 const Eigen::Matrix<T, 3, 1, MOpt>& t0n,
1717 const Eigen::Matrix<T, 3, 1, MOpt>& t1n,
1718 T* penetrationDepth,
1719 Eigen::Matrix<T, 3, 1, MOpt>* penetrationPoint0,
1720 Eigen::Matrix<T, 3, 1, MOpt>* penetrationPoint1,
1721 Eigen::Matrix<T, 3, 1, MOpt>* contactNormal);
1740 template <
class T,
int MOpt>
inline 1741 bool calculateContactTriangleTriangle(
1742 const Eigen::Matrix<T, 3, 1, MOpt>& t0v0,
1743 const Eigen::Matrix<T, 3, 1, MOpt>& t0v1,
1744 const Eigen::Matrix<T, 3, 1, MOpt>& t0v2,
1745 const Eigen::Matrix<T, 3, 1, MOpt>& t1v0,
1746 const Eigen::Matrix<T, 3, 1, MOpt>& t1v1,
1747 const Eigen::Matrix<T, 3, 1, MOpt>& t1v2,
1748 T* penetrationDepth,
1749 Eigen::Matrix<T, 3, 1, MOpt>* penetrationPoint0,
1750 Eigen::Matrix<T, 3, 1, MOpt>* penetrationPoint1,
1751 Eigen::Matrix<T, 3, 1, MOpt>* contactNormal);
1770 template <
class T,
int MOpt>
inline 1772 const Eigen::Matrix<T, 3, 1, MOpt>& t0v0,
1773 const Eigen::Matrix<T, 3, 1, MOpt>& t0v1,
1774 const Eigen::Matrix<T, 3, 1, MOpt>& t0v2,
1775 const Eigen::Matrix<T, 3, 1, MOpt>& t1v0,
1776 const Eigen::Matrix<T, 3, 1, MOpt>& t1v1,
1777 const Eigen::Matrix<T, 3, 1, MOpt>& t1v2,
1778 const Eigen::Matrix<T, 3, 1, MOpt>& t0n,
1779 const Eigen::Matrix<T, 3, 1, MOpt>& t1n,
1780 T* penetrationDepth,
1781 Eigen::Matrix<T, 3, 1, MOpt>* penetrationPoint0,
1782 Eigen::Matrix<T, 3, 1, MOpt>* penetrationPoint1,
1783 Eigen::Matrix<T, 3, 1, MOpt>* contactNormal);
1798 template <
class T,
int MOpt>
inline 1799 bool calculateContactTriangleTriangleSeparatingAxis(
1800 const Eigen::Matrix<T, 3, 1, MOpt>& t0v0,
1801 const Eigen::Matrix<T, 3, 1, MOpt>& t0v1,
1802 const Eigen::Matrix<T, 3, 1, MOpt>& t0v2,
1803 const Eigen::Matrix<T, 3, 1, MOpt>& t1v0,
1804 const Eigen::Matrix<T, 3, 1, MOpt>& t1v1,
1805 const Eigen::Matrix<T, 3, 1, MOpt>& t1v2,
1806 T* penetrationDepth,
1807 Eigen::Matrix<T, 3, 1, MOpt>* penetrationPoint0,
1808 Eigen::Matrix<T, 3, 1, MOpt>* penetrationPoint1,
1809 Eigen::Matrix<T, 3, 1, MOpt>* contactNormal);
1828 template <
class T,
int MOpt>
inline 1830 const Eigen::Matrix<T, 3, 1, MOpt>& tv0,
1831 const Eigen::Matrix<T, 3, 1, MOpt>& tv1,
1832 const Eigen::Matrix<T, 3, 1, MOpt>& tv2,
1833 const Eigen::Matrix<T, 3, 1, MOpt>& tn,
1834 const Eigen::Matrix<T, 3, 1, MOpt>& cv0,
1835 const Eigen::Matrix<T, 3, 1, MOpt>& cv1,
1837 T* penetrationDepth,
1838 Eigen::Matrix<T, 3, 1, MOpt>* penetrationPointTriangle,
1839 Eigen::Matrix<T, 3, 1, MOpt>* penetrationPointCapsule,
1840 Eigen::Matrix<T, 3, 1, MOpt>* contactNormal,
1841 Eigen::Matrix<T, 3, 1, MOpt>* penetrationPointCapsuleAxis);
1859 template <
class T,
int MOpt>
inline 1860 bool calculateContactTriangleCapsule(
1861 const Eigen::Matrix<T, 3, 1, MOpt>& tv0,
1862 const Eigen::Matrix<T, 3, 1, MOpt>& tv1,
1863 const Eigen::Matrix<T, 3, 1, MOpt>& tv2,
1864 const Eigen::Matrix<T, 3, 1, MOpt>& cv0,
1865 const Eigen::Matrix<T, 3, 1, MOpt>& cv1,
1867 T* penetrationDepth,
1868 Eigen::Matrix<T, 3, 1, MOpt>* penetrationPointTriangle,
1869 Eigen::Matrix<T, 3, 1, MOpt>* penetrationPointCapsule,
1870 Eigen::Matrix<T, 3, 1, MOpt>* contactNormal,
1871 Eigen::Matrix<T, 3, 1, MOpt>* penetrationPointCapsuleAxis);
1879 template <
class T,
int MOpt>
1881 const std::pair<Eigen::Matrix<T, 3, 1, MOpt>, Eigen::Matrix<T, 3, 1, MOpt>>& A,
1882 const std::pair<Eigen::Matrix<T, 3, 1, MOpt>, Eigen::Matrix<T, 3, 1, MOpt>>& B,
1883 const std::pair<Eigen::Matrix<T, 3, 1, MOpt>, Eigen::Matrix<T, 3, 1, MOpt>>& C,
1884 const std::pair<Eigen::Matrix<T, 3, 1, MOpt>, Eigen::Matrix<T, 3, 1, MOpt>>& D,
1885 std::array<T, 3>* timesOfCoplanarity)
1902 Eigen::Matrix<T, 3, 1, MOpt> AB0 = B.first - A.first;
1903 Eigen::Matrix<T, 3, 1, MOpt> AC0 = C.first - A.first;
1904 Eigen::Matrix<T, 3, 1, MOpt> CD0 = D.first - C.first;
1905 Eigen::Matrix<T, 3, 1, MOpt> VA = (A.second - A.first);
1906 Eigen::Matrix<T, 3, 1, MOpt> VC = (C.second - C.first);
1907 Eigen::Matrix<T, 3, 1, MOpt> VAB = (B.second - B.first) - VA;
1908 Eigen::Matrix<T, 3, 1, MOpt> VAC = VC - VA;
1909 Eigen::Matrix<T, 3, 1, MOpt> VCD = (D.second - D.first) - VC;
1910 T a0 = AB0.cross(CD0).dot(AC0);
1911 T a1 = AB0.cross(CD0).dot(VAC) + (AB0.cross(VCD) + VAB.cross(CD0)).dot(AC0);
1912 T a2 = (AB0.cross(VCD) + VAB.cross(CD0)).dot(VAC) + VAB.cross(VCD).dot(AC0);
1913 T a3 = VAB.cross(VCD).dot(VAC);
1915 return findRootsInRange01(
Polynomial<T, 3>(a0, a1, a2, a3), timesOfCoplanarity);
1922 #include "SurgSim/Math/PointTriangleCcdContactCalculation-inl.h" 1923 #include "SurgSim/Math/SegmentSegmentCcdContactCalculation-inl.h" 1924 #include "SurgSim/Math/TriangleCapsuleContactCalculation-inl.h" 1925 #include "SurgSim/Math/TriangleTriangleIntersection-inl.h" 1926 #include "SurgSim/Math/TriangleTriangleContactCalculation-inl.h" T distancePointSegment(const Eigen::Matrix< T, 3, 1, MOpt > &pt, const Eigen::Matrix< T, 3, 1, MOpt > &sv0, const Eigen::Matrix< T, 3, 1, MOpt > &sv1, Eigen::Matrix< T, 3, 1, MOpt > *result)
Point segment distance, if the projection of the closest point is not within the segments, the closest segment point is used for the distance calculation.
Definition: Geometry.h:289
Wraps glewInit() to separate the glew opengl definitions from the osg opengl definitions only imgui n...
Definition: AddRandomSphereBehavior.cpp:36
int timesOfCoplanarityInRange01(const std::pair< Eigen::Matrix< T, 3, 1, MOpt >, Eigen::Matrix< T, 3, 1, MOpt >> &A, const std::pair< Eigen::Matrix< T, 3, 1, MOpt >, Eigen::Matrix< T, 3, 1, MOpt >> &B, const std::pair< Eigen::Matrix< T, 3, 1, MOpt >, Eigen::Matrix< T, 3, 1, MOpt >> &C, const std::pair< Eigen::Matrix< T, 3, 1, MOpt >, Eigen::Matrix< T, 3, 1, MOpt >> &D, std::array< T, 3 > *timesOfCoplanarity)
Test when 4 points are coplanar in the range [0..1] given their linear motion.
Definition: Geometry.h:1880
T distanceTrianglePlane(const Eigen::Matrix< T, 3, 1, MOpt > &tv0, const Eigen::Matrix< T, 3, 1, MOpt > &tv1, const Eigen::Matrix< T, 3, 1, MOpt > &tv2, const Eigen::Matrix< T, 3, 1, MOpt > &n, T d, Eigen::Matrix< T, 3, 1, MOpt > *closestPointTriangle, Eigen::Matrix< T, 3, 1, MOpt > *planeProjectionPoint)
Calculate the distance of a triangle to a plane.
Definition: Geometry.h:1204
bool isCoplanar(const Eigen::Matrix< T, 3, 1, MOpt > &a, const Eigen::Matrix< T, 3, 1, MOpt > &b, const Eigen::Matrix< T, 3, 1, MOpt > &c, const Eigen::Matrix< T, 3, 1, MOpt > &d)
Check whether the points are coplanar.
Definition: Geometry.h:243
bool doesIntersectPlanePlane(const Eigen::Matrix< T, 3, 1, MOpt > &pn0, T pd0, const Eigen::Matrix< T, 3, 1, MOpt > &pn1, T pd1, Eigen::Matrix< T, 3, 1, MOpt > *pt0, Eigen::Matrix< T, 3, 1, MOpt > *pt1)
Test if two planes are intersecting, if yes also calculate the intersection line. ...
Definition: Geometry.h:1288
bool calculateContactTriangleCapsule(const Eigen::Matrix< T, 3, 1, MOpt > &tv0, const Eigen::Matrix< T, 3, 1, MOpt > &tv1, const Eigen::Matrix< T, 3, 1, MOpt > &tv2, const Eigen::Matrix< T, 3, 1, MOpt > &tn, const Eigen::Matrix< T, 3, 1, MOpt > &cv0, const Eigen::Matrix< T, 3, 1, MOpt > &cv1, double cr, T *penetrationDepth, Eigen::Matrix< T, 3, 1, MOpt > *penetrationPointTriangle, Eigen::Matrix< T, 3, 1, MOpt > *penetrationPointCapsule, Eigen::Matrix< T, 3, 1, MOpt > *contactNormal, Eigen::Matrix< T, 3, 1, MOpt > *penetrationPointCapsuleAxis)
Calculate the contact between a capsule and a triangle.
Definition: TriangleCapsuleContactCalculation-inl.h:920
bool calculateContactTriangleTriangleSeparatingAxis(const Eigen::Matrix< T, 3, 1, MOpt > &t0v0, const Eigen::Matrix< T, 3, 1, MOpt > &t0v1, const Eigen::Matrix< T, 3, 1, MOpt > &t0v2, const Eigen::Matrix< T, 3, 1, MOpt > &t1v0, const Eigen::Matrix< T, 3, 1, MOpt > &t1v1, const Eigen::Matrix< T, 3, 1, MOpt > &t1v2, const Eigen::Matrix< T, 3, 1, MOpt > &t0n, const Eigen::Matrix< T, 3, 1, MOpt > &t1n, T *penetrationDepth, Eigen::Matrix< T, 3, 1, MOpt > *penetrationPoint0, Eigen::Matrix< T, 3, 1, MOpt > *penetrationPoint1, Eigen::Matrix< T, 3, 1, MOpt > *contactNormal)
Calculate the contact between two triangles.
Definition: TriangleTriangleContactCalculation-inl.h:302
#define SURGSIM_ASSERT(condition)
Assert that condition is true.
Definition: Assert.h:77
T distanceTriangleTriangle(const Eigen::Matrix< T, 3, 1, MOpt > &t0v0, const Eigen::Matrix< T, 3, 1, MOpt > &t0v1, const Eigen::Matrix< T, 3, 1, MOpt > &t0v2, const Eigen::Matrix< T, 3, 1, MOpt > &t1v0, const Eigen::Matrix< T, 3, 1, MOpt > &t1v1, const Eigen::Matrix< T, 3, 1, MOpt > &t1v2, Eigen::Matrix< T, 3, 1, MOpt > *closestPoint0, Eigen::Matrix< T, 3, 1, MOpt > *closestPoint1)
Calculate the distance between two triangles.
Definition: Geometry.h:1463
Eigen::Matrix< double, 3, 1 > Vector3d
A 3D vector of doubles.
Definition: Vector.h:57
T distanceSegmentTriangle(const Eigen::Matrix< T, 3, 1, MOpt > &sv0, const Eigen::Matrix< T, 3, 1, MOpt > &sv1, const Eigen::Matrix< T, 3, 1, MOpt > &tv0, const Eigen::Matrix< T, 3, 1, MOpt > &tv1, const Eigen::Matrix< T, 3, 1, MOpt > &tv2, const Eigen::Matrix< T, 3, 1, MOpt > &normal, Eigen::Matrix< T, 3, 1, MOpt > *segmentPoint, Eigen::Matrix< T, 3, 1, MOpt > *trianglePoint)
Calculate the distance of a line segment to a triangle.
Definition: Geometry.h:1323
Eigen::Matrix< T, 3, 1, VOpt > nearestPointOnLine(const Eigen::Matrix< T, 3, 1, VOpt > &point, const Eigen::Matrix< T, 3, 1, VOpt > &segment0, const Eigen::Matrix< T, 3, 1, VOpt > &segment1)
Helper method to determine the nearest point between a point and a line.
Definition: Geometry.h:1641
The convenience header that provides the entirety of the logging API.
Polynomial<T, 3> specializes the Polynomial class for degree 3 (cubic polynomials) ...
Definition: Polynomial.h:255
bool barycentricCoordinates(const Eigen::Matrix< T, 3, 1, MOpt > &pt, const Eigen::Matrix< T, 3, 1, MOpt > &sv0, const Eigen::Matrix< T, 3, 1, MOpt > &sv1, Eigen::Matrix< T, 2, 1, MOpt > *coordinates)
Calculate the barycentric coordinates of a point with respect to a line segment.
Definition: Geometry.h:105
T distanceSegmentPlane(const Eigen::Matrix< T, 3, 1, MOpt > &sv0, const Eigen::Matrix< T, 3, 1, MOpt > &sv1, const Eigen::Matrix< T, 3, 1, MOpt > &n, T d, Eigen::Matrix< T, 3, 1, MOpt > *closestPointSegment, Eigen::Matrix< T, 3, 1, MOpt > *planeIntersectionPoint)
Calculate the distance between a segment and a plane.
Definition: Geometry.h:1110
T distancePointPlane(const Eigen::Matrix< T, 3, 1, MOpt > &pt, const Eigen::Matrix< T, 3, 1, MOpt > &n, T d, Eigen::Matrix< T, 3, 1, MOpt > *result)
Calculate the distance of a point to a plane.
Definition: Geometry.h:1083
bool doesIntersectTriangleTriangle(const Eigen::Matrix< T, 3, 1, MOpt > &t0v0, const Eigen::Matrix< T, 3, 1, MOpt > &t0v1, const Eigen::Matrix< T, 3, 1, MOpt > &t0v2, const Eigen::Matrix< T, 3, 1, MOpt > &t1v0, const Eigen::Matrix< T, 3, 1, MOpt > &t1v1, const Eigen::Matrix< T, 3, 1, MOpt > &t1v2, const Eigen::Matrix< T, 3, 1, MOpt > &t0n, const Eigen::Matrix< T, 3, 1, MOpt > &t1n)
Check if the two triangles intersect using separating axis test.
Definition: TriangleTriangleIntersection-inl.h:70
T distanceLinePlane(const Eigen::Matrix< T, 3, 1, MOpt > &v0, const Eigen::Matrix< T, 3, 1, MOpt > &v1, const Eigen::Matrix< T, 3, 1, MOpt > &n, T d, Eigen::Matrix< T, 3, 1, MOpt > *intersectionPoint)
Calculate the distance between a line and a plane.
Definition: Geometry.h:1166
bool doesCollideSegmentTriangle(const Eigen::Matrix< T, 3, 1, MOpt > &sv0, const Eigen::Matrix< T, 3, 1, MOpt > &sv1, const Eigen::Matrix< T, 3, 1, MOpt > &tv0, const Eigen::Matrix< T, 3, 1, MOpt > &tv1, const Eigen::Matrix< T, 3, 1, MOpt > &tv2, const Eigen::Matrix< T, 3, 1, MOpt > &tn, Eigen::Matrix< T, 3, 1, MOpt > *result)
Calculate the intersection of a line segment with a triangle See http://geomalgorithms.com/a06-_intersect-2.html#intersect_RayTriangle for the algorithm.
Definition: Geometry.h:984
bool calculateContactTriangleTriangle(const Eigen::Matrix< T, 3, 1, MOpt > &t0v0, const Eigen::Matrix< T, 3, 1, MOpt > &t0v1, const Eigen::Matrix< T, 3, 1, MOpt > &t0v2, const Eigen::Matrix< T, 3, 1, MOpt > &t1v0, const Eigen::Matrix< T, 3, 1, MOpt > &t1v1, const Eigen::Matrix< T, 3, 1, MOpt > &t1v2, const Eigen::Matrix< T, 3, 1, MOpt > &t0n, const Eigen::Matrix< T, 3, 1, MOpt > &t1n, T *penetrationDepth, Eigen::Matrix< T, 3, 1, MOpt > *penetrationPoint0, Eigen::Matrix< T, 3, 1, MOpt > *penetrationPoint1, Eigen::Matrix< T, 3, 1, MOpt > *contactNormal)
Calculate the contact between two triangles.
Definition: TriangleTriangleContactCalculation-inl.h:216
T distancePointLine(const Eigen::Matrix< T, 3, 1, MOpt > &pt, const Eigen::Matrix< T, 3, 1, MOpt > &v0, const Eigen::Matrix< T, 3, 1, MOpt > &v1, Eigen::Matrix< T, 3, 1, MOpt > *result)
Calculate the normal distance between a point and a line.
Definition: Geometry.h:258
T distancePointTriangle(const Eigen::Matrix< T, 3, 1, MOpt > &pt, const Eigen::Matrix< T, 3, 1, MOpt > &tv0, const Eigen::Matrix< T, 3, 1, MOpt > &tv1, const Eigen::Matrix< T, 3, 1, MOpt > &tv2, Eigen::Matrix< T, 3, 1, MOpt > *result)
Calculate the normal distance of a point from a triangle, the resulting point will be on the edge of ...
Definition: Geometry.h:763
bool doesIntersectBoxCapsule(const Eigen::Matrix< T, 3, 1, MOpt > &capsuleBottom, const Eigen::Matrix< T, 3, 1, MOpt > &capsuleTop, const T capsuleRadius, const Eigen::AlignedBox< T, 3 > &box)
Test if an axis aligned box intersects with a capsule.
Definition: Geometry.h:1588
Definitions of small fixed-size vector types.
bool isPointOnTriangleEdge(const Eigen::Matrix< T, 3, 1, MOpt > &pt, const Eigen::Matrix< T, 3, 1, MOpt > &tv0, const Eigen::Matrix< T, 3, 1, MOpt > &tv1, const Eigen::Matrix< T, 3, 1, MOpt > &tv2)
Check if a point is on the edge of a triangle.
Definition: Geometry.h:325
void intersectionsSegmentBox(const Eigen::Matrix< T, 3, 1, MOpt > &sv0, const Eigen::Matrix< T, 3, 1, MOpt > &sv1, const Eigen::AlignedBox< T, 3 > &box, std::vector< Eigen::Matrix< T, 3, 1, MOpt >> *intersections)
Calculate the intersections between a line segment and an axis aligned box.
Definition: Geometry.h:1534
T distanceSegmentSegment(const Eigen::Matrix< T, 3, 1, MOpt > &s0v0, const Eigen::Matrix< T, 3, 1, MOpt > &s0v1, const Eigen::Matrix< T, 3, 1, MOpt > &s1v0, const Eigen::Matrix< T, 3, 1, MOpt > &s1v1, Eigen::Matrix< T, 3, 1, MOpt > *pt0, Eigen::Matrix< T, 3, 1, MOpt > *pt1, T *s0t=nullptr, T *s1t=nullptr)
Distance between two segments, if the project of the closest point is not on the opposing segment...
Definition: Geometry.h:415
T distanceLineLine(const Eigen::Matrix< T, 3, 1, MOpt > &l0v0, const Eigen::Matrix< T, 3, 1, MOpt > &l0v1, const Eigen::Matrix< T, 3, 1, MOpt > &l1v0, const Eigen::Matrix< T, 3, 1, MOpt > &l1v1, Eigen::Matrix< T, 3, 1, MOpt > *pt0, Eigen::Matrix< T, 3, 1, MOpt > *pt1)
Determine the distance between two lines.
Definition: Geometry.h:348
bool isPointInsideTriangle(const Eigen::Matrix< T, 3, 1, MOpt > &pt, const Eigen::Matrix< T, 3, 1, MOpt > &tv0, const Eigen::Matrix< T, 3, 1, MOpt > &tv1, const Eigen::Matrix< T, 3, 1, MOpt > &tv2, const Eigen::Matrix< T, 3, 1, MOpt > &tn)
Check if a point projected into the plane of a triangle, is inside that triangle. ...
Definition: Geometry.h:193
bool doesIntersectSegmentSegment(const Eigen::Matrix< T, 2, 1, MOpt > &s0v0, const Eigen::Matrix< T, 2, 1, MOpt > &s0v1, const Eigen::Matrix< T, 2, 1, MOpt > &s1v0, const Eigen::Matrix< T, 2, 1, MOpt > &s1v1, T *s, T *t)
Calculate the intersection between the two 2D segments.
Definition: Geometry.h:68