double intersectsWithQuad(Quad other)

Return the distance from the origin of this to the intersection with other if this intersects with other, or null if the don't intersect.

Source

double intersectsWithQuad(Quad other) {
  const double EPSILON = 10e-6;

  // First triangle
  var point0 = other._point0;
  var point1 = other._point1;
  var point2 = other._point2;

  _e1
    ..setFrom(point1)
    ..sub(point0);
  _e2
    ..setFrom(point2)
    ..sub(point0);

  _direction.crossInto(_e2, _q);
  final a0 = _e1.dot(_q);

  if (!(a0 > -EPSILON && a0 < EPSILON)) {
    final f = 1 / a0;
    _s
      ..setFrom(_origin)
      ..sub(point0);
    final u = f * (_s.dot(_q));

    if (u >= 0.0) {
      _s.crossInto(_e1, _r);
      final v = f * (_direction.dot(_r));

      if (!(v < -EPSILON || u + v > 1.0 + EPSILON)) {
        final t = f * (_e2.dot(_r));

        return t;
      }
    }
  }

  // Second triangle
  point0 = other._point3;
  point1 = other._point0;
  point2 = other._point2;

  _e1
    ..setFrom(point1)
    ..sub(point0);
  _e2
    ..setFrom(point2)
    ..sub(point0);

  _direction.crossInto(_e2, _q);
  final a1 = _e1.dot(_q);

  if (!(a1 > -EPSILON && a1 < EPSILON)) {
    final f = 1 / a1;
    _s
      ..setFrom(_origin)
      ..sub(point0);
    final u = f * (_s.dot(_q));

    if (u >= 0.0) {
      _s.crossInto(_e1, _r);
      final v = f * (_direction.dot(_r));

      if (!(v < -EPSILON || u + v > 1.0 + EPSILON)) {
        final t = f * (_e2.dot(_r));

        return t;
      }
    }
  }

  return null;
}