//坑爹,因为一个符号调试了好久
#include<stdio.h> #include<math.h> double Xa,Ya,Za,Xb,Yb,Zb,Xc,Yc,Zc,Xd,Yd,Zd; double d,fix[2],fiy[2],fiz[2]; void dist() { double H,I,J,K,L,M,N,O,P,Q; double t; H=Xb-Xa; I=Yb-Ya; J=Zb-Za; K=Xd-Xc; L=Yd-Yc; M=Zd-Zc; N=(H*L-K*I)*I-(J*K-M*H)*J; O=(I*M-J*L)*J-H*(H*L-K*I); P=H*(J*K-M*H)-(I*M-J*L)*I; Q=-(N*Xa+O*Ya+P*Za);//N O P Q是直线L1与公垂线方向向量组成平面的方程的系数 t=-(N*Xc+O*Yc+P*Zc+Q)/(N*K+O*L+P*M);//t为直线L2的参数 fix[1]=K*t+Xc; fiy[1]=L*t+Yc; fiz[1]=M*t+Zc; N=(H*L-K*I)*L-(J*K-M*H)*M; O=(I*M-J*L)*M-K*(H*L-K*I); P=K*(J*K-M*H)-(I*M-J*L)*L; Q=-(N*Xc+O*Yc+P*Zc);//N O P Q是直线L2与公垂线方向向量组成平面的方程的系数 t=-(N*Xa+O*Ya+P*Za+Q)/(N*H+O*I+P*J);//t为直线L1的参数 fix[0]=H*t+Xa; fiy[0]=I*t+Ya; fiz[0]=J*t+Za; d=sqrt((fix[1]-fix[0])*(fix[1]-fix[0])+(fiy[1]-fiy[0])*(fiy[1]-fiy[0])+(fiz[1]-fiz[0])*(fiz[1]-fiz[0])); } main() { int t; scanf("%d",&t); while(t--) { scanf("%lf%lf%lf",&Xa,&Ya,&Za); scanf("%lf%lf%lf",&Xb,&Yb,&Zb); scanf("%lf%lf%lf",&Xc,&Yc,&Zc); scanf("%lf%lf%lf",&Xd,&Yd,&Zd); dist(); printf("%.6lf\n",d); printf("%.6lf %.6lf %.6lf %.6lf %.6lf %.6lf\n",fix[0],fiy[0],fiz[0],fix[1],fiy[1],fiz[1]); } return 0; }