题目要求我们给出按顺序给出的N点组成的多边形的面积和重心横纵坐标的和,考查计算几何。
我们有任意N边形的有向面积计算公式:
S′=∑i=1n−1(xi−x0)(yi+1−y0)−(yi−y0)(xi+1−x0)2
记按顺序排列的连续两点与选取某一点的三角形的有向面积:
Si,i+1=(xi−x0)(yi+1−y0)−(yi−y0)(xi+1−x0)2,i=1,2,...,n-1
重心的X坐标:
Xi,i+1=x0+xi+xi+13
重心的Y坐标:
Yi,i+1=y0+yi+yi+13
则任意N边形的重心计算公式:
X=∑i=1n−1[Si,i+1S′Xi,i+1],Y=∑i=1n−1[Si,i+1S′Yi,i+1]
根据题意,我们变形方便计算:
S′=∑i=1n−1Si,i+1
sgm=∑i=1n−1Si,i+1(x0+xi+xi+1+y0+yi+yi+1)
则:
S=|S′|,X+Y=sgm3S′
在题目定义中,如果S=0,则重心公式的分母为0,并且题目规定这种情况为(0,0),这是需要注意的。
#include <cstdio>
#include <cmath>
using namespace std;
const double eps=1e-7;
int main(){
int n,m,j;
double s,x0,y0,x1,y1,x2,y2,sgm,tems;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&m);
if(m<3){
for(j=0;j<m;j++)scanf("%lf%lf",&x1,&y1);
printf("0.000 0.000\n");
}
else{s=0;sgm=0;
scanf("%lf%lf%lf%lf",&x0,&y0,&x1,&y1);
for(j=2;j<m;j++){scanf("%lf%lf",&x2,&y2);
s+=(tems=(x1-x0)*(y2-y0)-(x2-x0)*(y1-y0));
sgm+=tems*(x0+x1+x2+y0+y1+y2);
x1=x2;y1=y2;
}
if(fabs(s)<eps)printf("0.000 0.000\n");
else{
printf("%.3lf %.3lf\n",fabs(s)/2,sgm/(3*s));
}
}
}
}