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;
}