注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

fudq's AC Road

何以解忧,唯有AC!

 
 
 

日志

 
 

hdu 4741 Save Labman No.004  

2013-09-18 20:23:39|  分类: ACM-hdu |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
http://acm.hdu.edu.cn/showproblem.php?pid=4741
球空间两条直线的最短距离以及公垂线与两条直线的交点。
参考了下一篇很好的博客:http://blog.sina.com.cn/s/blog_648868460100h1sf.html
用博客里的公式套下即可求出。

/*
* pro.cpp
*
* Created on: 2013-09-18
* Author: fudq
*/
#include <functional>
#include <algorithm>
#include <iostream>
//#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cstring>
#include <cassert>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,102400000")

#define FOR(i,a) for((i)=0;i<(a);(i)++)
#define MEM(a) (memset((a),0,sizeof(a)))
#define LL __int64

const int N=1010;
const int M=32010;
const int MOD=1000000007ll;
const int INF=0x7fffffff;
const int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
//const int dir[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,1},{1,-1},{-1,-1},{1,1}};
const double eps=1e-7;
const double PI=acos(-1.0);

inline int sign(double x){return (x>eps)-(x<-eps);}
template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
template<class T> inline T Min(T a,T b){return a<b?a:b;}
template<class T> inline T Max(T a,T b){return a>b?a:b;}
template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
/*************************/

struct Point{
double x,y,z;
};

int tt;
Point aa,bb,cc,dd;
Point diana,dianb;

double fun(double a,double b,double c,double d){
return(a*d-b*c);
}

Point jiaodian(Point A,Point B,Point C,Point D)
{
double xa,ya,za,xb,yb,zb,xc,yc,zc,xd,yd,zd,e,f,g,h,i,j,k,l,m,n,o,p,q,kk;
Point ss;
xa=A.x;ya=A.y;za=A.z;
xb=B.x;yb=B.y;zb=B.z;
xc=C.x;yc=C.y;zc=C.z;
xd=D.x;yd=D.y;zd=D.z;
e=fun(yb-ya,zb-za,yd-yc,zd-zc);
f=fun(zb-za,xb-xa,zd-zc,xd-xc);
g=fun(xb-xa,yb-ya,xd-xc,yd-yc);
h=xb-xa;i=yb-ya;j=zb-za;
k=xd-xc;l=yd-yc;m=zd-zc;
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=-xa*n+ya*o-za*p;
kk=(o*yc-n*xc-p*zc-q)/(n*k-o*l+p*m);
ss.x=k*kk+xc;
ss.y=l*kk+yc;
ss.z=m*kk+zc;
return(ss);
}

void Print(Point pp){
printf("%.6lf %.6lf %.6lf",pp.x,pp.y,pp.z);
}

double dist(Point p,Point q){
return(sqrt(((p.x-q.x)*(p.x-q.x))+((p.y-q.y)*(p.y-q.y))+((p.z-q.z)*(p.z-q.z))));
}

void solve()
{
scanf("%lf%lf%lf%lf%lf%lf",&aa.x,&aa.y,&aa.z,&bb.x,&bb.y,&bb.z);
scanf("%lf%lf%lf%lf%lf%lf",&cc.x,&cc.y,&cc.z,&dd.x,&dd.y,&dd.z);
diana=jiaodian(cc,dd,aa,bb);
dianb=jiaodian(aa,bb,cc,dd);
printf("%.6lf\n",dist(diana,dianb));
Print(diana);
printf(" ");
Print(dianb);
printf("\n");
}

int main()
{
#ifndef ONLINE_JUDGE
freopen("testin.txt","r",stdin);
//freopen("testout.txt","w",stdout);
#endif
int T;
scanf("%d",&T);
while(T--)
solve();
return 0;
}



  评论这张
 
阅读(74)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017