第一行输入测试样例个数 t
第二行输入凸多边形点的个数 n
接下来的n行输入n个顶点坐标
再输入目标点坐标
将凸多边形沿着他的边转一圈,输出目标点的运动轨迹长度
思路:
观察发现,目标点每段轨迹都是一个圆弧,以第i个点为圆心,以两点之间距离为半径,转过的角度是第i个顶角的补角。
弧长=弧度*半径
弧度用cosA=(b*b+c*c-a*a)/(2*b*c)来求A
acos(-1.0)-p[j].radian :acos(-1)=180°
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
struct Point{
int x;
int y;
double radian; //该顶角的弧度
double distance; //半径
} ;
double rad(Point p1,Point p2){ //算两点间距
return double(sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)));
}
int main(){
int t;
cin>>t;
for(int i=1;i<=t;i++){
int n;
cin>>n;
Point p[50];
for(int j=0;j<n;j++){
cin>>p[j].x>>p[j].y;
}
Point aim;
cin>>aim.x>>aim.y;
for(int j=0;j<n;j++){
double a,b,c;
a=rad(p[(j+n+1)%n],p[(j+n-1)%n]);
b=rad(p[(j+n+1)%n],p[j]);
c=rad(p[j],p[(j+n-1)%n]);
p[j].radian=acos((b*b+c*c-a*a)/(2*b*c)); //顶角的弧度
p[j].distance=rad(p[j],aim);
}
double l=0;
for(int j=0;j<n;j++)
{
l+=(p[j].distance)*(acos(-1.0)-p[j].radian);//acos(-1.0)180度弧度制
}
printf("Case #%d: %.3lf\n",i,l);
}
return 0;
}