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;

}