/*注意由于叉积的有向面积,进行剖分累加的时候一定要在最后取绝对值。不能在中间过程取。否则和会变大。*/
#include <iostream>
#include <stdio.h>
#include <cmath>
#define sum(a,b,c) ((b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x))
using namespace std;
struct po
{
int x,y;
} point[105];
int gcd(int n,int m)
{
if(m==0||n==0) return fabs(m-n);
else if(n%m==0) return m;
else return gcd(m,n%m);
}
int main()
{
int t;
scanf("%d",&t);
for(int k=1; k<=t; k++)
{
int n;
int count=0;
scanf("%d",&n);
point[1].x=point[1].y=0;
for(int j=2; j<=n+1; j++)
{
scanf("%d %d",&point[j].x,&point[j].y);
point[j].x=point[j].x+point[j-1].x;
point[j].y=point[j].y+point[j-1].y;
}
for(int i=2; i<=n+1; i++)
count+=gcd(fabs(point[i].x-point[i-1].x),fabs(point[i].y-point[i-1].y));
count+=gcd(fabs(point[n+1].x-point[1].x),fabs(point[1].y-point[n+1].y));
double summ=0;
for(int i=2; i<=n; i++)
summ+=sum(point[1],point[i],point[i+1]);
summ=summ/2;
int ge=summ+1-count/2;
printf("Scenario #%d:\n",k);
printf("%d %d %.1lf\n",ge,count,summ);
printf("\n");
}
return 0;
}
Area Pick定理加叉积三角剖分
最新推荐文章于 2018-07-27 13:25:05 发布