#include <stdio.h>
#define ll long long
#define zahyoutype double

typedef struct Point{zahyoutype x,y;}P;
typedef struct line{P p1,p2;}L;
int sgn(zahyoutype x){return x<0?-1:x>0;}

int iscross(L s,L t){
	//点(p,q)が直線f(x,y)=ax+by+c=0のどっち側にあるかはf(p,q)を見ればよい
	//点(x1,y1),(x2,y2)を結ぶ直線の式は(y2-y1)*(x-x1)+(x2-x1)*(y1-y)=0
	zahyoutype t1=(s.p2.y-s.p1.y)*(t.p1.x-s.p1.x)+(s.p2.x-s.p1.x)*(s.p1.y-t.p1.y);
	zahyoutype t2=(s.p2.y-s.p1.y)*(t.p2.x-s.p1.x)+(s.p2.x-s.p1.x)*(s.p1.y-t.p2.y);
	zahyoutype t3=(t.p2.y-t.p1.y)*(s.p1.x-t.p1.x)+(t.p2.x-t.p1.x)*(t.p1.y-s.p1.y);
	zahyoutype t4=(t.p2.y-t.p1.y)*(s.p2.x-t.p1.x)+(t.p2.x-t.p1.x)*(t.p1.y-s.p2.y);
	//同一直線上にない
	if(t1 || t2)return sgn(t1)!=sgn(t2) && sgn(t3)!=sgn(t4);
	//同一直線上にある
	zahyoutype c1=(s.p2.x-s.p1.x)*(s.p2.x-s.p1.x)+(s.p2.y-s.p1.y)*(s.p2.y-s.p1.y);
	zahyoutype c2=(t.p1.x-s.p1.x)*(s.p2.x-s.p1.x)+(t.p1.y-s.p1.y)*(s.p2.y-s.p1.y);
	zahyoutype c3=(t.p2.x-s.p1.x)*(s.p2.x-s.p1.x)+(t.p2.y-s.p1.y)*(s.p2.y-s.p1.y);
	if(0<=c2&&c2<=c1 || 0<=c3&&c3<=c1 || c2<=0&&c1<=c3 || c3<=0&&c1<=c2)return 1;
	return 0;
}

P crosspoint(L s,L t){
	double deno=(s.p1.x-s.p2.x)*(t.p1.y-t.p2.y)-(t.p1.x-t.p2.x)*(s.p1.y-s.p2.y);
	zahyoutype xnume=  s.p1.x*t.p1.x*(s.p2.y-t.p2.y)-s.p1.x*t.p2.x*(s.p2.y-t.p1.y)-s.p2.x*t.p1.x*(s.p1.y-t.p2.y)+s.p2.x*t.p2.x*(s.p1.y-t.p1.y);
	zahyoutype ynume=-(s.p1.y*t.p1.y*(s.p2.x-t.p2.x)-s.p1.y*t.p2.y*(s.p2.x-t.p1.x)-s.p2.y*t.p1.y*(s.p1.x-t.p2.x)+s.p2.y*t.p2.y*(s.p1.x-t.p1.x));
	P p={xnume/deno,ynume/deno};
	return p;
}

void readpoint(P*p){
	zahyoutype x=1,y;
	if(x/2)scanf("%lf%lf",&x,&y);
	else scanf("%ld%ld",&x,&y);	
	p->x=x;
	p->y=y;
}
void printpoint(P p){
	zahyoutype x=1;
	if(x/2)printf("%.9lf %.9lf\n",p.x,p.y);
	else printf("%ld %ld\n",p.x,p.y);	
}

int main(){
	int q;
	scanf("%d",&q);
	while(q--){
		L s,t;
		for(int i=0;i<2;i++){
			readpoint(&s.p1);
			readpoint(&s.p2);
			if(!i)t=s;
		}
		printpoint(crosspoint(s,t));
	}
}
