分析:
将多边形进行三角形划分,计算每个三角形的重心,再将重心以每个三角形的面积为权重进行加权平均即可得到多边形的重心。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std ;
struct node{
double x,y;
}p[1000001];
double cx,cy;
int n;
double cross(node a,node b,node c){
return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
}
void bcenter()
{
double s=0,S=0;
cx=0,cy=0;
p[n]=p[0];
for(int i=0;i<n;i++){
s=cross(p[0],p[i],p[i+1]);
S+=s;
cx+=s*(p[0].x+p[i].x+p[i+1].x);
cy+=s*(p[0].y+p[i].y+p[i+1].y);
}
cx=cx/(3*S);
cy=cy/(3*S);
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%lf %lf",&p[i].x,&p[i].y);
bcenter();
printf("%.2f %.2f\n",cx,cy);
}
return 0 ;
}