题目大意:求空间两条直线的最短距离及最近的点坐标
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4741
拙计的代码,公垂线~~~~~~~~~
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
struct node{
double x,y,z;
}p[20],dir1,dir2,dir3,dir,ans,res;
struct line{
node a,b;
}l1,l2;
int main()
{
int T;
scanf("%d",&T);
while(T--){
for(int i = 0; i < 4; i ++)
scanf("%lf %lf %lf",&p[i].x,&p[i].y,&p[i].z);
l1.a = p[0],l1.b = p[1];
dir1.x = p[0].x - p[1].x, dir1.y = p[0].y - p[1].y, dir1.z = p[0].z - p[1].z;
l2.a = p[2],l2.b = p[3];
dir2.x = p[2].x - p[3].x, dir2.y = p[2].y - p[3].y, dir2.z = p[2].z - p[3].z;
double e,f,g;
e = dir1.y*dir2.z - dir2.y*dir1.z;
f = dir1.z*dir2.x - dir2.z*dir1.x;
g = dir1.x*dir2.y - dir2.x*dir1.y;
dir3.x = p[2].x - p[0].x, dir3.y = p[2].y - p[0].y, dir3.z = p[2].z - p[0].z;
double an = (e*dir3.x + f*dir3.y + g*dir3.z)/(sqrt(e*e + f*f + g*g));
printf("%.6lf\n",fabs(an));
dir.x = e, dir.y = f , dir.z = g;
res.x = dir3.y*dir2.z - dir3.z *dir2.y;
res.y = dir3.z*dir2.x - dir3.x *dir2.z;
res.z = dir3.x*dir2.y - dir3.y *dir2.x;
double t1 = res.x * dir.x + res.y * dir.y + res.z * dir.z;
t1 /= dir.x * dir.x + dir.y *dir.y + dir.z *dir.z;
ans.x = p[0].x + dir1.x * t1;
ans.y = p[0].y + dir1.y * t1;
ans.z = p[0].z + dir1.z * t1;
printf("%.6lf %.6lf %.6lf ",ans.x,ans.y,ans.z);
res.x = dir3.y*dir1.z - dir3.z *dir1.y;
res.y = dir3.z*dir1.x - dir3.x *dir1.z;
res.z = dir3.x*dir1.y - dir3.y *dir1.x;
t1 = res.x * dir.x + res.y * dir.y + res.z * dir.z;
t1 /= dir.x * dir.x + dir.y *dir.y + dir.z *dir.z;
ans.x = p[2].x + dir2.x * t1;
ans.y = p[2].y + dir2.y * t1;
ans.z = p[2].z + dir2.z * t1;
printf("%.6lf %.6lf %.6lf\n",ans.x,ans.y,ans.z);
}
return 0;
}