#include<bits/stdc++.h>
#include <iomanip>
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;
};

// Ax+By+C = 0
// 直线一般式适用平面上任意直线
// 根据两点求解一般式的系数
// 设两个点为 (x1, y1) , (x2, y2),则有:
// A = y2 - y1
// B = x1 - x2
// C = x2y1-x1y2

// 首先设交点坐标为 (x, y),两线段对应直线的一般式为:

// a1x + b1y + c1 = 0
// a2x + b2y + c2 = 0

// 那么对 1 式乘 a2,对 2 式乘 a1 得:
// a2*a1x + a2*b1y + a2*c1 = 0
// a1*a2x + a1*b2y + a1*c2 = 0
// 两式相减得:
// y = (c1 * a2 - c2 * a1) / (a1 * b2 - a2 * b1)

// 同样可以推得:
// x = (c2 * b1 - c1 * b2) / (a1 * b2 - a2 * b1)

// 如果(x,y)在两线段上,则(x,y)即为答案,否则交点不存在。


point findMeetingPoint(line line_A,line line_B){
    // TODO:求直线 line_A 与 line_B 的交点
    // 先求直线一般式的表示方法
    double a1 = line_A.point_B.y - line_A.point_A.y;
    double b1 = line_A.point_A.x - line_A.point_B.x;
    double c1 = line_A.point_B.x * line_A.point_A.y - line_A.point_A.x * line_A.point_B.y;
    double a2 = line_B.point_B.y - line_B.point_A.y;
    double b2 = line_B.point_A.x - line_B.point_B.x;
    double c2 = line_B.point_B.x * line_B.point_A.y - line_B.point_A.x * line_B.point_B.y;

    double y = - ( a2*c1-a1*c2 )/( a2*b1-a1*b2 );
    double x = - ( b2*c1-b1*c2 )/( b2*a1-b1*a2 );
    point re = point(x,y);
    if (a2*b1-a1*b2==0|| b2*a1-b1*a2==0) {
        re.x =-1;
        re.y =-1;
    }
    return re;
}

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