#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) {
double Ax = line_A.point_A.x, Ay = line_A.point_A.y;
double Bx = line_A.point_B.x, By = line_A.point_B.y;
double Cx = line_B.point_A.x, Cy = line_B.point_A.y;
double Dx = line_B.point_B.x, Dy = line_B.point_B.y;
double x = 0, y = 0;
double kAB = 0, kCD = 0;
if (0 == (Ax - Bx) &&
0 == (Cx - Dx))//AB斜率、CD斜率都不存在,交点不唯一
return point(-1, -1);
else if (0 == (Ax - Bx)) { //AB斜率不存在,CD斜率存在
x = Ax;
kCD = (Cy - Dy) / (Cx - Dx);
y = kCD * (x - Cx) + Cy;
return point(x, y);
}
else if (0 == (Cx - Dx)) { //CD斜率不存在时AB斜率存在
x = Cx;
kAB = (Ay - By) / (Ax - Bx);
y = kAB * (x - Ax) + Ay;
return point(x, y);
}
else { //AB斜率、 CD斜率都存在
kAB = (Ay - By) / (Ax - Bx);
kCD = (Cy - Dy) / (Cx - Dx);
if (kAB == kCD)//AB,CD平行,交点不唯一
return point(-1, -1);
else { //不平行,不重合
x = (kAB * Ax - Ay - kCD * Cx + Cy) / (kAB - kCD);
y = kAB * (x - Ax) + Ay;
cout << fixed << setprecision(6);
return point(x, y);
}
}
}
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 << ans.x << " " << ans.y;
return 0;
}