1 include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <algorithm> 6 #include <utility> 7 #include <vector> 8 #include <map> 9 #include <queue> 10 #include <stack> 11 #include <cstdlib> 12 #include <cmath> 13 typedef long long ll; 14 #define lowbit(x) (x&(-x)) 15 #define ls l,m,rt<<1 16 #define rs m+1,r,rt<<1|1 17 using namespace std; 18 #define pi acos(-1) 19 const int N=60; 20 struct Node{ 21 int x,y; 22 }node[N]; 23 int main() 24 { 25 int t,n; 26 double tx,ty; 27 scanf("%d",&t); 28 for(int i=1;i<=t;i++) 29 { 30 scanf("%d",&n); 31 for(int i=0;i<n;i++){ 32 scanf("%lf%lf",&node[i].x,&node[i].y);//lf 33 } 34 scanf("%lf%lf",&tx,&ty); 35 // 为了下面的第n次旋转 36 node[n].x=node[0].x,node[n].y=node[0].y; 37 node[n+1].x=node[1].x,node[n+1].y=node[1].y; 38 double ans=0; 39 for(int i=0;i<n;i++)//要转n次 40 { 41 double a=sqrt(pow(node[i].x-node[i+1].x,2)+pow(node[i].y-node[i+1].y,2)); 42 double b=sqrt(pow(node[i+1].x-node[i+2].x,2)+pow(node[i+1].y-node[i+2].y,2)); 43 double c=sqrt(pow(node[i].x-node[i+2].x,2)+pow(node[i].y-node[i+2].y,2)); 44 //利用余弦定理求角度 45 // pi-acos((a*a+b*b-c*c)/(2*a*b)) 为node[i+1]转过的角度,也就是(tx,ty)转过的角度 46 double l=pi-acos((a*a+b*b-c*c)/(2*a*b));//一个小数,因为最后也以小数形式输出。 47 //弧长=半径*弧度 48 double r=sqrt(pow(node[i+1].x-tx,2)+pow(node[i+1].y-ty,2)); 49 ans+=l*r; 50 } 51 printf("Case #%d: %.3f ",i,ans); 52 } 53 return 0; 54 }