getLineIntersections method

List<Point> getLineIntersections(
  1. Line line
)

Get intersection points of a line segment with this circle

Returns 0, 1, or 2 points.

Implementation

List<Point> getLineIntersections(Line line) {
  final dx = line.b.x - line.a.x;
  final dy = line.b.y - line.a.y;
  final fx = line.a.x - center.x;
  final fy = line.a.y - center.y;

  final a = dx * dx + dy * dy;
  final b = 2 * (fx * dx + fy * dy);
  final c = fx * fx + fy * fy - radius * radius;

  final discriminant = b * b - 4 * a * c;
  if (discriminant < 0) return [];

  final results = <Point>[];
  final sqrtD = sqrt(max(0, discriminant));

  final t1 = (-b - sqrtD) / (2 * a);
  final t2 = (-b + sqrtD) / (2 * a);

  if (t1 >= 0 && t1 <= 1) {
    results.add(Point(line.a.x + t1 * dx, line.a.y + t1 * dy));
  }
  if (discriminant > 0 && t2 >= 0 && t2 <= 1) {
    results.add(Point(line.a.x + t2 * dx, line.a.y + t2 * dy));
  }

  return results;
}