#include<stdio.h> //面积=内部点+边上点/2-1
#include<math.h>
struct Point
{
int x,y;
}point[110];
double area;
int gcd(int a,int b)
{
if(b==0) return a;
return gcd(b,a%b);
}
int OnEdge(int n)//,Point P
{
int i,ret=0;
for(i=0;i<n;i++)
ret+=gcd( abs(point[(i+1)%n].x-point[(i)%n].x),abs(point[(i+1)%n].y-point[i%n].y) ); //一条边上的点的数目等于横纵左边的最大公约数
return ret;
}
int InSide(int n)//,Point P 外部点的数目 面积公式反过来求的
{
int i;
area=0.0;
for(i=0;i<n;i++)
{
area+=point[(i+1)%n].y*(point[i].x-point[(i+2)%n].x);
}
return fabs(area)/2+1-OnEdge(n)/2;
}
int main()
{
int t,i,n,m,l,dx[100],dy[100],j=1;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&dx[i],&dy[i]);
}
point[0].x=0;
point[0].y=0;
for(i=1;i<=n;i++)
{
point[i].x=point[i-1].x+dx[i-1];
point[i].y=point[i-1].y+dy[i-1];
}
/*for(i=0;i<n;i++)
printf("%d %d\n",point[i].x,point[i].y);*/
m=OnEdge(n);
l=InSide(n);
printf("Scenario #%d:\n",j++);
printf("%d %d %.1lf\n\n",l,m,area/2);
}
return 0;
}
多边形面积计算
277

被折叠的 条评论
为什么被折叠?



