segmentsIntersect function

bool segmentsIntersect(
  1. Offset a1,
  2. Offset a2,
  3. Offset b1,
  4. Offset b2,
)

Returns true if segments a1-a2 and b1-b2 intersect.

Implementation

bool segmentsIntersect(Offset a1, Offset a2, Offset b1, Offset b2) {
  int orientation(Offset p, Offset q, Offset r) {
    final val = (q.dy - p.dy) * (r.dx - q.dx) - (q.dx - p.dx) * (r.dy - q.dy);
    if (val == 0) return 0;
    return val > 0 ? 1 : 2;
  }

  bool onSegment(Offset p, Offset q, Offset r) {
    return q.dx <= math.max(p.dx, r.dx) &&
        q.dx >= math.min(p.dx, r.dx) &&
        q.dy <= math.max(p.dy, r.dy) &&
        q.dy >= math.min(p.dy, r.dy);
  }

  final o1 = orientation(a1, a2, b1);
  final o2 = orientation(a1, a2, b2);
  final o3 = orientation(b1, b2, a1);
  final o4 = orientation(b1, b2, a2);

  if (o1 != o2 && o3 != o4) return true;

  if (o1 == 0 && onSegment(a1, b1, a2)) return true;
  if (o2 == 0 && onSegment(a1, b2, a2)) return true;
  if (o3 == 0 && onSegment(b1, a1, b2)) return true;
  if (o4 == 0 && onSegment(b1, a2, b2)) return true;

  return false;
}