| 24 | } |
| 25 | |
| 26 | IntersectionResult Intersect(Line2D const & lhs, Line2D const & rhs, double eps) |
| 27 | { |
| 28 | auto const & a = lhs.m_point; |
| 29 | auto const & ab = lhs.m_direction; |
| 30 | |
| 31 | auto const & c = rhs.m_point; |
| 32 | auto const & cd = rhs.m_direction; |
| 33 | |
| 34 | if (Collinear(ab, cd, eps)) |
| 35 | { |
| 36 | if (Collinear(c - a, cd, eps)) |
| 37 | return IntersectionResult(IntersectionResult::Type::Infinity); |
| 38 | return IntersectionResult(IntersectionResult::Type::Zero); |
| 39 | } |
| 40 | |
| 41 | auto const ac = c - a; |
| 42 | |
| 43 | auto const n = CrossProduct(ac, cd); |
| 44 | auto const d = CrossProduct(ab, cd); |
| 45 | auto const scale = n / d; |
| 46 | |
| 47 | return IntersectionResult(a + ab * scale); |
| 48 | } |
| 49 | } // namespace m2 |