#include <cstdio>           // printf(), scanf()
#include <cstdlib>          // abs()

class Point
{
public:
	double x, y;

	Point(double x = 0, double y = 0): 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 a) { return Point(a * x, a * y); }
};

struct Segment
{
	Point p1, p2;
};

typedef Point Vector;

double
cross(Vector a, Vector b)
{
	return a.x * b.y - a.y * b.x;
}

Point
getCrossPoint(Segment s1, Segment s2)
{
	Vector base = s2.p2 - s2.p1;
	double d1 = abs(cross(base, s1.p1 - s2.p1));
	double d2 = abs(cross(base, s1.p2 - s2.p1));
	double t = d1 / (d1 + d2);
	return s1.p1 + (s1.p2 - s1.p1) * t;
}

int
main(int argc, char** argv)
{
	Segment s1, s2;
	Point a;
	int xp0, yp0, xp1, yp1, xp2, yp2, xp3, yp3;
	int q;

	scanf("%d", &q);
	while (q--)
	{
		scanf("%d %d %d %d %d %d %d %d", &xp0, &yp0, &xp1, &yp1, &xp2, &yp2, &xp3, &yp3);
		s1.p1.x = xp0, s1.p1.y = yp0;
		s1.p2.x = xp1, s1.p2.y = yp1;
		s2.p1.x = xp2, s2.p1.y = yp2;
		s2.p2.x = xp3, s2.p2.y = yp3;
		a = getCrossPoint(s1, s2);
		printf("%.10f %.10f\n", a.x, a.y);
	}

	return 0;
}