hdu 4741 Save Labman No.004

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

题目链接: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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值