| 13 | namespace m2 |
| 14 | { |
| 15 | bool IsPointInsideTriangle(PointD const & pt, PointD const & p1, PointD const & p2, PointD const & p3) |
| 16 | { |
| 17 | double const s1 = robust::OrientedS(p1, p2, pt); |
| 18 | double const s2 = robust::OrientedS(p2, p3, pt); |
| 19 | double const s3 = robust::OrientedS(p3, p1, pt); |
| 20 | |
| 21 | // In the case of degenerate triangles we need to check that pt lies |
| 22 | // on (p1, p2), (p2, p3) or (p3, p1). |
| 23 | if (s1 == 0.0 && s2 == 0.0 && s3 == 0.0) |
| 24 | return IsPointOnSegment(pt, p1, p2) || IsPointOnSegment(pt, p2, p3) || IsPointOnSegment(pt, p3, p1); |
| 25 | |
| 26 | return ((s1 >= 0.0 && s2 >= 0.0 && s3 >= 0.0) || (s1 <= 0.0 && s2 <= 0.0 && s3 <= 0.0)); |
| 27 | } |
| 28 | |
| 29 | bool IsPointStrictlyInsideTriangle(PointD const & pt, PointD const & p1, PointD const & p2, PointD const & p3) |
| 30 | { |