解析几何,注意除数为零的时候特殊处理,即平行于x轴或y轴:
import java.util.*; public class Main { public static void main(String[] args) throws Exception{ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); for(int i = 0; i < n; ++i){ double a = sc.nextDouble(), b = sc.nextDouble(), c = sc.nextDouble(), d = sc.nextDouble(); double t1 = a, t2 = b; //记录(a, b)的初值 c = c - a; //把(a, b)平移到(0, 0),当然(c, d)也跟着平移 d = d - b; a = 0; b = 0; if(d == 0){ //除数为零的时候特殊处理 double x1 = c/2, x2 = c/2, y1 = x1*Math.sqrt(3), y2 = -y1; x1 += t1; //最后把答案都平移回来 x2 += t1; y1 += t2; y2 += t2; f(x1, y1, x2, y2); continue; } double k = c*c/(2*d) + d/2.0; double A = 1 + c*c/(d*d), B = -2*k*c/d, C = k*k-c*c-d*d; double x1 = (-B + Math.sqrt(B*B-4*A*C))/(2*A); //求根公式 double x2 = (-B - Math.sqrt(B*B-4*A*C))/(2*A); double y1 = k - c/d*x1, y2 = k - c/d*x2; x1 += t1; ////最后把答案都平移回来 x2 += t1; y1 += t2; y2 += t2; f(x1, y1, x2, y2); } } static void f(double x1, double y1, double x2, double y2){ //先打印较小坐标 if(x1 < x2) System.out.printf("%.2f %.2f %.2f %.2f\n", x1, y1, x2, y2); if(x1 > x2) System.out.printf("%.2f %.2f %.2f %.2f\n", x2, y2, x1, y1); if(x1 == x2){ if(y1 < y2) System.out.printf("%.2f %.2f %.2f %.2f\n", x1, y1, x2, y2); else System.out.printf("%.2f %.2f %.2f %.2f\n", x2, y2, x1, y1); } } }