虽然知道知道是个水题,不过由于线代学的不好···解不出方程。。。后面参考了下http://blog.sina.com.cn/s/blog_648868460100h1sf.html博主写的很详细,最后过了。平常学校课堂上教的那些知识还是很重要啊。
#include<cstdio>
#include<cstdlib>
#include<math.h>
double x1,x2,x3,x4,yy,y2,y3,y4,z1,z2,z3,z4,a,b,c,x,y,z;
void find(){
double H=x2-x1, I=y2-yy, J=z2-z1;
double K=x4-x3, L=y4-y3, M=z4-z3;
double N=H*I*L-I*I*K-J*J*K+H*J*M;
double O=H*H*L-H*I*K-I*J*M+J*J*L;
double P=H*J*K-H*H*M-I*I*M+I*J*L;
double Q=-x1*N+yy*O-z1*P;
double k=(O*y3-N*x3-P*z3-Q)/(N*K-O*L+P*M);
x=K*k+x3;
y=L*k+y3;
z=M*k+z3;
H=x4-x3, I=y4-y3, J=z4-z3;
K=x2-x1, L=y2-yy, M=z2-z1;
N=H*I*L-I*I*K-J*J*K+H*J*M;
O=H*H*L-H*I*K-I*J*M+J*J*L;
P=H*J*K-H*H*M-I*I*M+I*J*L;
Q=-x3*N+y3*O-z3*P;
k=(O*yy-N*x1-P*z1-Q)/(N*K-O*L+P*M);
a=K*k+x1;
b=L*k+yy;
c=M*k+z1;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf",&x1,&yy,&z1,&x2,&y2,&z2,&x3,&y3,&z3,&x4,&y4,&z4);
find();
double dis = sqrt((x-a)*(x-a)+(y-b)*(y-b)+(z-c)*(z-c));
printf("%lf\n",dis);
printf("%lf %lf %lf ",a,b,c);
printf("%lf %lf %lf\n",x,y,z);
}
return 0;
}