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