#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;
}