intersectsWithQuad method

double? intersectsWithQuad(
  1. 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.

Implementation

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

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

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

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

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

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

      if (!(v < -epsilon || u + v > 1.0 + epsilon)) {
        final double 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 double a1 = _e1.dot(_q);

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

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

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

        return t;
      }
    }
  }

  return null;
}