2019-team321/tmp
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
#include <bits/stdc++.h>
using namespace std;
typedef double db;
const db pi=acos(-1);
db sqr(db x){
return x*x;
}
db aacos(db x){
return acos(max(min(x,1.),-1.));
}
int main(){
int T;
scanf("%d",&T);
while(T--){
db ox,oy,oz,r;
db sx,sy,sz;
db tx,ty,tz;
cin >> ox >> oy >> oz >> r;
cin >> sx >> sy >> sz;
cin >> tx >> ty >> tz;
if (fabs(sx-tx)<1e-8 && fabs(sy-ty)<1e-8 && fabs(sz-tz)<1e-8){
printf("0\n");
continue;
}
db os=sqrt(sqr(ox-sx)+sqr(oy-sy)+sqr(oz-sz));
db ot=sqrt(sqr(ox-tx)+sqr(oy-ty)+sqr(oz-tz));
db st=sqrt(sqr(sx-tx)+sqr(sy-ty)+sqr(sz-tz));
if(fabs(fabs(os-ot)-st)<1e-8){
printf("%.8lf\n",st);
continue;
}
db cs1=(sqr(os)+sqr(st)-sqr(ot))/(2*os*st);
db cs2=(sqr(ot)+sqr(st)-sqr(os))/(2*ot*st);
if(cs1<1e-8 || cs2<1e-8){
printf("%.8lf\n",st);
continue;
}
db cs=(sqr(os)+sqr(ot)-sqr(st))/(2*os*ot);
db sn=sqrt(1-sqr(cs));
db theta=aacos(cs);
db h=(os*ot*sn)/st;
if(h>r || fabs(h-r)<1e-8){
printf("%.8lf\n",st);
continue;
}
db a=aacos(r/os),b=aacos(r/ot);
db ans=sqrt(sqr(os)-sqr(r))+sqrt(sqr(ot)-sqr(r))+r*(theta-a-b);
printf("%.8lf\n",ans);
}
return 0;
}
#include
using namespace std;
typedef double db;
const db pi=acos(-1);
db sqr(db x){
return x*x;
}
db aacos(db x){
return acos(max(min(x,1.),-1.));
}
int main(){
int T;
scanf("%d",&T);
while(T--){
db ox,oy,oz,r;
db sx,sy,sz;
db tx,ty,tz;
cin >> ox >> oy >> oz >> r;
cin >> sx >> sy >> sz;
cin >> tx >> ty >> tz;
if (fabs(sx-tx)<1e-8 && fabs(sy-ty)<1e-8 && fabs(sz-tz)<1e-8){
printf("0\n");
continue;
}
db os=sqrt(sqr(ox-sx)+sqr(oy-sy)+sqr(oz-sz));
db ot=sqrt(sqr(ox-tx)+sqr(oy-ty)+sqr(oz-tz));
db st=sqrt(sqr(sx-tx)+sqr(sy-ty)+sqr(sz-tz));
if(fabs(fabs(os-ot)-st)<1e-8){
printf("%.8lf\n",st);
continue;
}
db cs1=(sqr(os)+sqr(st)-sqr(ot))/(2*os*st);
db cs2=(sqr(ot)+sqr(st)-sqr(os))/(2*ot*st);
if(cs1<1e-8 || cs2<1e-8){
printf("%.8lf\n",st);
continue;
}
db cs=(sqr(os)+sqr(ot)-sqr(st))/(2*os*ot);
db sn=sqrt(1-sqr(cs));
db theta=aacos(cs);
db h=(os*ot*sn)/st;
if(h>r || fabs(h-r)<1e-8){
printf("%.8lf\n",st);
continue;
}
db a=aacos(r/os),b=aacos(r/ot);
db ans=sqrt(sqr(os)-sqr(r))+sqrt(sqr(ot)-sqr(r))+r*(theta-a-b);
printf("%.8lf\n",ans);
}
return 0;
}