这题纯恶心人,要考虑的情况非常多,包括两条直线都是铅垂线,然后重合,这个时候斜率是不存在的,需要注意,然后测试案例里面还有平行的情况,我一开始以为没有的,调试了一段时间才发现是平行的问题,还有就是应当学到,如果返回的结果中有NaN,就很有可能是由于做除法的时候分母为零导致
import java.util.*; public class Main { static class Point { public double x, y; public Point(double x, double y) { this.x = x; this.y = y; } public Point() { this(0.0, 0.0); } } static class Line { public Point point_A, point_B; public Line(Point a, Point b) { point_A = a; point_B = b; } public Line() { point_A = new Point(); point_B = new Point(); } } public static Point findMeetingPoint(Line lineA, Line lineB) { // TODO: 求直线 lineA 与 lineB 的交点 // TODO: 求直线 lineA 与 lineB 的交点 Point point=new Point(); if(lineA.point_A.x==lineA.point_B.x) { if(lineB.point_A.x==lineB.point_B.x) { point.x=-1; point.y=-1; return point; }else { double k2=(lineB.point_A.y-lineB.point_B.y)/(lineB.point_A.x-lineB.point_B.x); double b2=lineB.point_A.y-k2*lineB.point_A.x; point.x=lineA.point_A.x; point.y=k2*point.x+b2; return point; } }else { if(lineB.point_A.x==lineB.point_B.x) { double k1=(lineA.point_A.y-lineA.point_B.y)/(lineA.point_A.x-lineA.point_B.x); double b1=lineA.point_A.y-k1*lineA.point_A.x; point.x=lineB.point_A.x; point.y=k1*point.x+b1; return point; }else { double k1=(lineA.point_A.y-lineA.point_B.y)/(lineA.point_A.x-lineA.point_B.x); double b1=lineA.point_A.y-k1*lineA.point_A.x; double k2=(lineB.point_A.y-lineB.point_B.y)/(lineB.point_A.x-lineB.point_B.x); double b2=lineB.point_A.y-k2*lineB.point_A.x; if(k1==k2&&b1==b2||k1==k2&&k1==0) { point.x=-1; point.y=-1; return point; } double x=(b2-b1)/(k1-k2); double y=k1*x+b1; point.x=x; point.y=y; return point; } } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Point A = new Point(); A.x = scanner.nextDouble(); A.y = scanner.nextDouble(); Point B = new Point(); B.x = scanner.nextDouble(); B.y = scanner.nextDouble(); Point C = new Point(); C.x = scanner.nextDouble(); C.y = scanner.nextDouble(); Point D = new Point(); D.x = scanner.nextDouble(); D.y = scanner.nextDouble(); Line AB = new Line(A, B); Line CD = new Line(C, D); Point ans = findMeetingPoint(AB, CD); System.out.println(ans.x + " " + ans.y); scanner.close(); } }