Rolling The Polygon(几何、余弦定理、PI的定义)

https://nanti.jisuanke.com/t/28402

题意:一个凸多边形内部有一点,求其滚动一周后该点的路径长度

题解:是n段圆弧的累加,用余弦定理求半径长度,acos(x), l/a=r

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<stack>
#include<queue>
#include<set>
#define maxn 55
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define LL long long
#define e 2.71828182
using namespace std;
const double PI=acos(-1.0);
int t;
int n;
struct node
{
   int x,y;
}zb[maxn];
double dis(int x,int y,int a,int b)
{
   double s=abs(x-a)*abs(x-a)+abs(y-b)*abs(y-b);
   return s;
}
int main()
{
    cin>>t;
    int cnt=1;
    while(t--)
    {
       cin>>n;
       for(int i=0;i<n;i++)
       {
          cin>>zb[i].x>>zb[i].y;
       }
       int tx,ty;
       cin>>tx>>ty;
       double d,a,b,c,jd,ans;
       ans=0;
       for(int i=0;i<n;i++)
       {
          d=dis(tx,ty,zb[i].x,zb[i].y);
          d=sqrt(d);
          a=dis(zb[i].x,zb[i].y,zb[(i-1+n)%n].x,zb[(i-1+n)%n].y);
          b=dis(zb[i].x,zb[i].y,zb[(i+1)%n].x,zb[(i+1)%n].y);
          c=dis(zb[(i-1+n)%n].x,zb[(i-1+n)%n].y,zb[(i+1)%n].x,zb[(i+1)%n].y);
          //cout << a << ' ' <<b << ' ' <<c << endl;
          double u=(a+b-c)/(2*sqrt(a)*sqrt(b));
          jd=PI-acos(u);
          jd=abs(jd);
          //cout << u << endl;
          ans+=d*jd;
       }
       cout << "Case #" << cnt++ << ": ";
       printf("%.3lf\n",ans);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/wwwlps/article/details/81280772