raycastLine static method
Implementation
static RaycastHit<Line>? raycastLine(Ray ray, Line line) {
final lx = line.p2.x - line.p1.x;
final ly = line.p2.y - line.p1.y;
final dx = line.p1.x - ray.origin.x;
final dy = line.p1.y - ray.origin.y;
final denom = ray.direction.x * ly - ray.direction.y * lx;
if (denom.abs() < 1e-10) return null;
final t = (dx * ly - dy * lx) / denom;
final s = (dx * ray.direction.y - dy * ray.direction.x) / denom;
if (t < 0 || s < 0 || s > 1) return null;
final lineLen = math.sqrt(lx * lx + ly * ly);
double nx = -ly / lineLen;
double ny = lx / lineLen;
// flip normal to face the ray origin
final toOriginX = ray.origin.x - (ray.origin.x + ray.direction.x * t);
final toOriginY = ray.origin.y - (ray.origin.y + ray.direction.y * t);
if (nx * toOriginX + ny * toOriginY < 0) {
nx = -nx;
ny = -ny;
}
return RaycastHit<Line>(
object: line,
point: Vec2(
ray.origin.x + ray.direction.x * t,
ray.origin.y + ray.direction.y * t,
),
normal: Vec2(nx, ny),
distance: t,
);
}