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

 

#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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值