这一题的恶心之处在于直线L的A,B两点只是直线上普通的两点,我一开始把它错以为是与圆的交点。
我们应该通过前面某一题的方法求出点到直线的距离,然后再通过勾股定理,求出AB的距离,记得要乘二
import java.util.Scanner; class Point { double x, y; Point(double A, double B) { x = A; y = B; } } class Line { Point point_A, point_B; Line(Point A, Point B) { point_A = A; point_B = B; } } class Circle { Point O; int r; Circle(Point A, int B) { O = A; r = B; } } public class Main { static double distance(Point a,Point b) { double d=Math.sqrt(Math.pow(a.x-b.x, 2)+Math.pow(a.y-b.y, 2)); return d; } public static double getDistance(Circle circle, Line l) { // 请在这里实现你的代码 double ao=distance(l.point_A, circle.O); double ab=distance(l.point_A, l.point_B); double ob=distance(circle.O, l.point_B); double cosA=(ao*ao+ab*ab-ob*ob)/(2*ao*ab); double sinA=Math.sqrt(1-cosA*cosA); double d=ao*sinA; if(d>=circle.r) { return 0; } return 2*Math.sqrt(circle.r*circle.r-d*d); } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); double ox = scanner.nextDouble(); double oy = scanner.nextDouble(); int r = scanner.nextInt(); double x1 = scanner.nextDouble(); double y1 = scanner.nextDouble(); double x2 = scanner.nextDouble(); double y2 = scanner.nextDouble(); Point center = new Point(ox, oy); Circle circle = new Circle(center, r); Point p1 = new Point(x1, y1); Point p2 = new Point(x2, y2); Line l = new Line(p1, p2); double result = getDistance(circle, l); System.out.printf("%.6f\n", result); scanner.close(); } }