intersectsCircle method

List<Point> intersectsCircle(
  1. Circle circle
)

Get intersection points of this ray with a Circle.

Returns a list of 0, 1, or 2 intersection points.

Implementation

List<Point> intersectsCircle(Circle circle) {
  final nd = normalizedDirection;
  final dx = origin.x - circle.center.x;
  final dy = origin.y - circle.center.y;

  final a = nd.x * nd.x + nd.y * nd.y;
  final b = 2 * (dx * nd.x + dy * nd.y);
  final c = dx * dx + dy * dy - circle.radius * circle.radius;

  final discriminant = b * b - 4 * a * c;

  if (discriminant < 0) return [];

  final results = <Point>[];
  if (discriminant == 0) {
    final t = -b / (2 * a);
    if (t >= 0) results.add(pointAt(t));
  } else {
    final sqrtD = sqrt(discriminant);
    final t1 = (-b - sqrtD) / (2 * a);
    final t2 = (-b + sqrtD) / (2 * a);
    if (t1 >= 0) results.add(pointAt(t1));
    if (t2 >= 0) results.add(pointAt(t2));
  }

  return results;
}