raycastLine static method

RaycastHit<Line>? raycastLine(
  1. Ray ray,
  2. Line line
)

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,
  );
}