Angel's Journey(圆外一点到圆上一点的距离,不经过圆内)

    xiaoxiao2025-01-27  48

     

    #include<bits/stdc++.h> using namespace std; typedef long long ll; const double pi=acos(-1.0); double rx,ry,r,x,y; double s; double len1(double a,double b,double c,double d) { return sqrt((a-c)*(a-c)+(b-d)*(b-d)); } double len2(double a,double b,double c,double d,double rr) { return sqrt((a-c)*(a-c)+(b-d)*(b-d)-rr*rr); } double jd(double k) { return asin(k)*180/pi; } int main() { int T;scanf("%d",&T); while(T--) { scanf("%lf %lf %lf %lf %lf",&rx,&ry,&r,&x,&y); s=0; if(x<=rx-r) { s=pi*r/2+len1(x,y,rx-r,ry); } else if(x>=rx+r) { s=pi*r/2+len1(x,y,rx+r,ry); } else { double d1,d2,d3,sina,sinb,a,b; d1=len1(x,y,rx,ry); d2=len2(x,y,rx,ry,r); d3=len1(x,y,x,ry); sina=d2/d1; sinb=d3/d1; s=d2+(jd(sinb)-jd(sina))*pi*r/180+pi*r/2; } printf("%.4f\n",s); } return 0; }

    记一条数学公式 

    求角度

    sina=对面/斜边;

    角度=asin(sina)*180/pi;

    弧长度=角度*pi*r/180;

    最新回复(0)