思想是分割成三角形,然后求三角形的重心。那么多边形重心就是若干个三角形的重心带权求中心,可以用质点质心公式。
#include <cstdio> #include <iostream> #include <algorithm> #include <vector> #include <cstring> #define LL int const LL mod=1000000000; const LL N=1000006; LL dp[N]; LL bit[22]; using namespace std; struct Point { double x,y; };//约定传入点的vector包含n+1个点,最后一个点与第一个点等值(模拟闭合圈) int n; double Area(vector<Point> va) { double rec=0; for(int i=0;i<va.size()-1;i++) rec+=va[i].x*va[i+1].y-va[i+1].x*va[i].y; rec*=0.5; return rec; } Point GrvCenter(vector<Point> va) { Point rec; rec.x=0,rec.y=0; double area=Area(va);//每个三角形在总面积中的权重 for(int i=0;i<va.size()-1;i++) rec.x+=(va[i].x+va[i+1].x)*(va[i].x*va[i+1].y-va[i+1].x*va[i].y); for(int i=0;i<va.size()-1;i++) rec.y+=(va[i].y+va[i+1].y)*(va[i].x*va[i+1].y-va[i+1].x*va[i].y); rec.x/=area*6; rec.y/=area*6; return rec; } int main() { cin.sync_with_stdio(false); int t; int n; scanf("%d",&t); while(t--) { vector<Point> va; scanf("%d",&n); for(int i=0;i<n;i++) { Point x; scanf("%lf %lf",&x.x,&x.y); va.push_back(x); } va.push_back(*va.begin()); printf("%.2f %.2f\n",GrvCenter(va).x,GrvCenter(va).y); } }