一个均匀的多边形重心为 横纵坐标和分别除以六倍的面积。
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<map> #include<set> using namespace std; struct point { double x,y; void input() { scanf("%lf%lf",&x,&y); } void print() { printf("%.2f %.2f\n",x,y); } }; double cross(point i,point j,point k) { return (j.x-i.x)*(k.y-i.y)-(k.x-i.x)*(j.y-i.y); } point Gravity(point p[],int n) { point O,t; O.x = O.y = 0; t.x = t.y = 0; p[n] = p[0]; double A = 0; for(int i=0; i<n; i++) A += cross(O,p[i],p[i+1]); A /= 2.0; for(int i=0; i<n; i++) { t.x += (p[i].x + p[i+1].x) * cross(O,p[i],p[i+1]); t.y += (p[i].y + p[i+1].y) * cross(O,p[i],p[i+1]); } t.x /= 6*A; t.y /= 6*A; return t; } point data[1000005]; int main() { int t; int n; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=0; i<n; i++)data[i].input(); point t=Gravity(data,n); t.print(); } return 0; }