2019ACM-ICPC西安邀请赛C. Angel's Journey(计算几何)

    xiaoxiao2025-02-28  54

    题目链接:https://nanti.jisuanke.com/t/39270

    圆参数: x y r;

    点参数: x1 y1;

    分两种情况:一种是x1>=x+r,此时两点距离为  直线加四分之一的圆弧

    另一种就是:从点到圆上的切线距离,加’两段‘圆弧

    具体看代码,画画图,挺容易的。

    #include <bits/stdc++.h> using namespace std; #define int long long #define JD(x) setprecision(x) const double PI = acos(-1.0); const int maxn = 1e5 + 5; const int mod = 1e9 + 7; priority_queue<int, vector<int>, greater<int> >q; int s[maxn]; signed main() { std::ios::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); int t;cin>>t; while(t--){ double x,y,r,x1,y1; cin>>x>>y>>r>>x1>>y1; if(x1<x){ x1=x+x-x1; } double h=0.25*2*PI*r; if(x1>=x+r){ int tempx=x+r; printf("%.4f\n",(h+sqrt((x1-tempx)*(x1-tempx)+(y1-y)*(y1-y)))); } else{ double temp1=atan((x1-x)/(y1-y)); double temp2=acos((r)/sqrt((x1-x)*(x1-x) + (y1-y)*(y1-y))); printf("%.4f\n",h+sqrt( (x1-x)*(x1-x) + (y1-y)*(y1-y)- r*r)+(PI/2.0-temp1-temp2)*r); } } return 0; }

     

    最新回复(0)