MCPcopy Create free account
hub / github.com/alicevision/AliceVision / isLineSegmentInTriangle

Function isLineSegmentInTriangle

src/aliceVision/mvsData/geometry.cpp:348–378  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

346}
347
348bool isLineSegmentInTriangle(Point3d& lpi, const Point3d& A, const Point3d& B, const Point3d& C, const Point3d& linePoint1, const Point3d& linePoint2)
349{
350 Point3d v0 = C - A;
351 Point3d v1 = B - A;
352
353 Point3d n = cross(v0.normalize(), v1.normalize()).normalize();
354
355 Point3d lineVect = linePoint2 - linePoint1;
356
357 // linePlaneIntersect(&P, linePoint, lineVect, A, &n);
358 const double k = (dot(A, n) - dot(n, linePoint1)) / dot(n, lineVect);
359 lpi = linePoint1 + lineVect * k;
360
361 // Compute vectors
362 const Point3d v2 = lpi - A;
363
364 // Compute dot products
365 const double dot00 = dot(v0, v0);
366 const double dot01 = dot(v0, v1);
367 const double dot02 = dot(v0, v2);
368 const double dot11 = dot(v1, v1);
369 const double dot12 = dot(v1, v2);
370
371 // Compute barycentric coordinates
372 const double invDenom = 1.0 / (dot00 * dot11 - dot01 * dot01);
373 const double u = (dot11 * dot02 - dot01 * dot12) * invDenom;
374 const double v = (dot00 * dot12 - dot01 * dot02) * invDenom;
375
376 // Check if point is in triangle
377 return (k >= 0.0) && (k <= 1.0) && (u > 0.0) && (v > 0.0) && (u + v < 1.0);
378}
379
380// P = A + u * (C - A) + v * (B - A)
381Point2d computeBarycentricCoordinates(const Point2d& A, const Point2d& B, const Point2d& C, const Point2d& P)

Callers 1

Calls 3

crossFunction · 0.85
dotFunction · 0.70
normalizeMethod · 0.45

Tested by

no test coverage detected