#include <bits/stdc++.h>
#include <cmath>
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 x1=line_A.point_A.x,y1=line_A.point_A.y;
    double x2=line_A.point_B.x,y2=line_A.point_B.y;
    double x3=line_B.point_A.x,y3=line_B.point_A.y;
    double x4=line_B.point_B.x,y4=line_B.point_B.y;
    // 思路是先判断是否平行 只要平行 不管是否重合 一定是-1,-1
    // 然后再特判 如果给出的点就有相同的点 那么直接返回该点即可 这样可以加快速度 还可以避免精度不够的问题
    // 能用乘法不用除法 尽量用乘法进行代替来进行判断 因为乘法的精度会更高
    if(fabs((y2-y1)*(x4-x3)-(y4-y3)*(x2-x1))<0.00001)
    {
        return point(-1.0,-1.0);
    }
    else if(x1==x3&y1==y3)
    {
        return point(x1,y1);
    }
    else if(x2==x3&y2==y3)
    {
        return point(x2,y2);
    }
    else if(x1==x4&y1==y4)
    {
        return point(x1,y1);
    }
    else if(x2==x4&y2==y4)
    {
        return point(x2,y2);
    }
    else
    {
        double x0=((y3-y1)+((y2-y1)*x1/(x2-x1)-(y4-y3)*x3/(x4-x3)))/((y2-y1)/(x2-x1)-(y4-y3)/(x4-x3));
        double y0=(y1*(x2-x1)*(y4-y3)-y3*(x4-x3)*(y2-y1)+(x3-x1)*(y2-y1)*(y4-y3))/((x2-x1)*(y4-y3)-(x4-x3)*(y2-y1));
        return point(x0,y0);
    }
}

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(12) << ans.x << " " << ans.y;
    return 0;
}