raycastCircle static method

RaycastHit<Circle>? raycastCircle(
  1. Ray ray,
  2. Circle circle
)

Implementation

static RaycastHit<Circle>? raycastCircle(Ray ray, Circle circle) {
  final ocX = ray.origin.x - circle.position.x;
  final ocY = ray.origin.y - circle.position.y;

  final b = 2 * (ocX * ray.direction.x + ocY * ray.direction.y);
  final c = ocX * ocX + ocY * ocY - circle.radius * circle.radius;
  final disc = b * b - 4 * c;

  if (disc < 0) return null;

  final sqrtDisc = math.sqrt(disc);
  final t1 = (-b - sqrtDisc) / 2;
  final t2 = (-b + sqrtDisc) / 2;

  final t = t1 >= 0 ? t1 : (t2 >= 0 ? t2 : null);
  if (t == null) return null;

  return RaycastHit<Circle>(
    object: circle,
    point: Vec2(
      ray.origin.x + ray.direction.x * t,
      ray.origin.y + ray.direction.y * t,
    ),
    normal: Vec2(
      (ray.origin.x + ray.direction.x * t - circle.position.x) / circle.radius,
      (ray.origin.y + ray.direction.y * t - circle.position.y) / circle.radius,
    ),
    distance: t,
  );
}