背景知识:
三角形重心坐标为:
算多边形的重心,由于多边形的质量可以看作是平均分布到内部的任何一个区域上,即面积。
所以可以把多边形划分为多个三角形,然后计算每个三角形的重心坐标,在通过质量加权平均即可
ps:对于浮点数最后统一除,精度损失会比较小。
加权平均公式(mi即面积)
ac代码
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=1e6+10;
struct point{
double x,y;
}p[maxn];
double cross(point a,point b,point c){//ab ac
return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
double area(point p0,point p1,point p2){
return (cross(p0,p1,p2))/2;//加绝对值错
}
int main(){
int t,n;
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++){
cin>>p[i].x>>p[i].y;
}
double sumx=0,sumy=0,sumarea=0,carea;
point ptem = p[2];
for(int i=3;i<=n;i++){
carea=area(p[1],ptem,p[i]);
sumarea+=carea;
sumx+=(p[1].x+ptem.x+p[i].x) * carea;
sumy+=(p[1].y+ptem.y+p[i].y) * carea;
ptem = p[i];
}
printf("%.2lf %.2lf\n",sumx/sumarea/3.0,sumy/sumarea/3.0);
}
return 0;
}