#include<bits/stdc++.h>
using namespace std;
struct point {
double x, y;
point(double A, double B) {
x = A, y = B;
}
point() = default;
};
struct line {
point point_A, point_B;
line(point A, point B) {
point_A = A, point_B = B;
}
line() = default;
};
point findMeetingPoint(line line_A, line line_B) {
point p;
double xa = line_A.point_A.x, ya = line_A.point_A.y;
double xb = line_A.point_B.x, yb = line_A.point_B.y;
double xc = line_B.point_A.x, yc = line_B.point_A.y;
double xd = line_B.point_B.x, yd = line_B.point_B.y;
if (fabs((yc - yd) * (xa - xb) - (xc - xd) * (ya - yb)) < 1e-10) {
// 检查是否重合
// 如果AB上的点A到直线CD的距离为0,且CD上的点C到直线AB的距离为0,则重合
double distAtoCD = fabs((xd - xc) * (ya - yc) - (xa - xc) * (yd - yc));
double distCtoAB = fabs((xb - xa) * (yc - ya) - (xc - xa) * (yb - ya));
if (distAtoCD < 1e-10 && distCtoAB < 1e-10) {
// 两直线重合,交点不唯一
return point(-1, -1);
} else {
// 两直线平行但不重合,无交点
// 题目要求:若两直线交点不唯一,则返回点(-1, -1)
// 平行且不重合时,交点不存在,但根据题目要求返回(-1, -1)
return point(-1, -1);
}
}
double x0 = ((xc - xd) * (xb * ya - xa * yb) - (xa - xb) *
(xd * yc - xc * yd)) / (-(yc - yd) * (xa - xb) + (xc - xd) * (ya - yb));
double y0 = ((xa * yb - ya * xb) * (yc - yd) - (ya - yb) *
(xc * yd - yc * xd)) / ((yc - yd) * (xa - xb) - (xc - xd) * (ya - yb));
p.x = x0, p.y = y0;
return p;
}
int main() {
point A, B, C, D;
cin >> A.x >> A.y >> B.x >> B.y >> C.x >> C.y >> D.x >> D.y;
line AB = line(A, B);
line CD = line(C, D);
point ans = findMeetingPoint(AB, CD);
cout << fixed << setprecision(6);
cout << ans.x << " " << ans.y;
return 0;
}