#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;

struct Point{
    double x;
    double y;
    Point (double x, double y) : x(x), y(y) {}
    Point operator-(Point p){
        return Point(x - p.x, y - p.y);
    }
    Point operator+(Point p){
        return Point(x + p.x, y + p.y);
    }
    Point operator*(double d){
        return Point(x * d, y * d);
    }
};
typedef Point Vector;
double cross(Vector v1, Vector v2){
    return v1.x * v2.y - v1.y * v2.x;
}
double dot(Vector v1, Vector v2){
    return v1.x * v1.x + v2.y * v2.y;
}
struct Segment{
    Point p1;
    Point p2;
    Segment(Point p1, Point p2) : p1(p1), p2(p2) {}
};
double get_d(Segment s, Point p){
    Vector v1 = s.p2 - s.p1;
    Vector v2 = p    - s.p1;
    return fabs(cross(v1, v2)) / sqrt(dot(v1, v1));
}
int main(){
    int q;
    cin >> q;
    for (int i = 0; i < q; i++) {
        int x_p0, y_p0, x_p1, y_p1, x_p2, y_p2, x_p3, y_p3;
        cin >> x_p0 >> y_p0 >> x_p1 >> y_p1;
        cin >> x_p2 >> y_p2 >> x_p3 >> y_p3;
        Point p0(x_p0, y_p0);
        Point p1(x_p1, y_p1);
        Point p2(x_p2, y_p2);
        Point p3(x_p3, y_p3);
        Segment s1(p0, p1);
        Segment s2(p2, p3);
        double d1 = get_d(s2, s1.p1);
        double d2 = get_d(s2, s1.p2);
        double t = d1 / (d1 + d2);
        Point ans = s1.p1 + (s1.p2 - s1.p1) * t;
        cout << fixed << setprecision(10);
        cout << ans.x << " " << ans.y << endl;
    }
    return 0;
}

