这题纯恶心人,要考虑的情况非常多,包括两条直线都是铅垂线,然后重合,这个时候斜率是不存在的,需要注意,然后测试案例里面还有平行的情况,我一开始以为没有的,调试了一段时间才发现是平行的问题,还有就是应当学到,如果返回的结果中有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();
}
}



京公网安备 11010502036488号