您的位置:首页 > 其它

hdu4741

2013-09-17 17:17 316 查看
//坑爹,因为一个符号调试了好久

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息