intersectsWithQuad method
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
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;
}