900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > hdu 4741 Save Labman No.004

hdu 4741 Save Labman No.004

时间:2023-12-12 09:05:59

相关推荐

hdu 4741 Save Labman No.004

题目大意:求空间两条直线的最短距离及最近的点坐标

题目链接:http://acm./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;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。