三角形的重心公式是 x=(x1+x2+x3)/3 y=(y1+y2+y3)/3;
错误的推广公式是“质点系重心公式”,即如果认为多边形的质量仅分布在其顶点上,且均匀分布,则这个公式是对的。
l但是,现在多边形的质量是均匀分布在其内部区域上的,也就是说,是与面积有关的!
求解方法
l剖分成N个三角形,分别求出其重心和面积,这时可以想象,原来质量均匀分布在内部区域上,而现在质量仅仅分布在这N个重心点上(等假变换),这时候就可以利用刚才的质点系重心公式了。
l不过,要稍微改一改,改成加权平均数,因为质量不是均匀分布的,每个质点代表其所在三角形,其质量就是该三角形的面积(有向面积!),——这就是权!
lC=sigma(Ai * Ci) / A (i=1…N)
本题目要注意精度的问题,除法无疑是最坏精度的所以尽量把除法运算放到最后。
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
struct point
{
double x,y;
}p[1000005];
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%lf %lf",&p[i].x,&p[i].y);
p[n].x=p[0].x;p[n].y=p[0].y;
double ansarea=0,ansx=0,ansy=0;
for(i=0;i<n;i++){
double temparea;
temparea=(p[i].x*p[i+1].y-p[i].y*p[i+1].x);
double tempx=((p[i].x+p[i+1].x+0)*1.0);
double tempy=((p[i].y+p[i+1].y+0)*1.0);
ansx+=tempx*temparea;
ansy+=tempy*temparea;
ansarea+=temparea;
}
printf("%.2lf %.2lf\n",ansx/ansarea/3.0,ansy/ansarea/3.0);
}
}