提供输入格式只是方便您在代码出错时进行调试,你只需要按照题目描述实现函数即可,并不需要关心数据的实际输入格式。
输入包含两行:
第一行包含四个正整数,分别为点
的横纵坐标的点
的横纵坐标。
第二行包含四个正整数,分别为点
的横纵坐标的点
的横纵坐标。
数据保证点
和点
不重合,点
和点
不重合,且若交点
存在则其横纵坐标的绝对值均在
以内。
提供输出格式只是方便您在代码出错时进行调试,你只需要按照题目描述实现函数即可,并不需要关心数据的实际输出格式。
输出一行两个实数,分别为直线
和直线
的交点
的横纵坐标。特别的,如果两直线交点不唯一,则输出
。
注意,只要您的答案与标准答案之差在
以内,就会被认为是正确的。
0 0 1 1 0 2 2 0
1.000000 1.000000
按照输入格式,点为
,点
为
,点
为
,点
为
。
图中绿线表示直线,红线表示直线
,两直线交于点
,此时点
与点
重合。
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 double[] getParam(Line line) {
double[] nums = new double[3];
double A1 = line.point_B.y - line.point_A.y;
double B1 = line.point_A.x - line.point_B.x;
double C1 = -B1 * line.point_A.y + line.point_A.x * (-A1);
nums[0] = A1;
nums[1] = B1;
nums[2] = C1;
return nums;
}
public static Point findMeetingPoint(Line lineA, Line lineB) {
double[] lineab = getParam(lineA);
double[] linecd = getParam(lineB);
//判是否有重合或平行情况d = a1*b2-a2*b1 = 0
if (lineab[0] * linecd[1] == linecd[0] * lineab[1]) {
return new Point(-1.00,-1.00);
}
//x = (b1*c2-b2*c1)/(a1*b2-a2*b1)
double x = (lineab[1] * linecd[2] - linecd[1] * lineab[2]) /
(lineab[0] * linecd[1] - linecd[0] * lineab[1]);
//y = (a2*c1-a1*c2)/(a1*b2-a2*b1)
double y = (linecd[0] * lineab[2] - lineab[0] * linecd[2]) /
(lineab[0] * linecd[1] - linecd[0] * lineab[1]);
return new Point(x, y);
}
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();
}
}