多边形的重心的计算方法:
类型1:质量集中在端点上 n个顶点坐标为(xi,yi),质量为mi,则重心
X = ∑( xi×mi ) / ∑mi
Y = ∑( yi×mi ) / ∑mi
特殊地,若每个点的质量相同,则
X = ∑xi / n
Y = ∑yi / n
类型2:质量分布均匀。
我们可以将其中的n个点分割成(n-2)个三角形,然后,这个三角形的重心当做这个点,每一块三角形的面积为其质量
X=∑(xi*si)/∑si; (2<=i<n); (其中的(xi,yi)为这n-2个三角形的重心)
Y=∑(yi*si)/∑si; (2<=i<n);
特殊地,质量均匀的三角形重心:
X = ( x0 + x1 + x2 ) / 3
Y = ( y0 + y1 + y2 ) / 3
类型3:质量分布不均匀 积分(目前不会)
例题
HDU1115 Lifting the Stone http://acm.hdu.edu.cn/showproblem.php?pid=1115
分析: 对应上面的类型二
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct point{
double x,y;
};
double cross( point A,point B,point C)
{
return (C.x-A.x)*(B.y-A.y)-(C.y-A.y)*(B.x-A.x);
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--){
double tmpx,tmpy,tmps,sx,sy;
scanf("%d",&n);
tmpx=0,tmpy=0,tmps=0;
sx=sy=0;
point a,b,c;
scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);
for(int i=2;i<n;i++){
scanf("%lf%lf",&c.x,&c.y);
double s = cross(a,b,c);
sx=a.x+b.x+c.x;
sy=a.y+b.y+c.y;
tmps+=s;
tmpx+=s*sx;
tmpy+=s*sy;
b=c;
}
printf("%.2lf %.2lf\n",tmpx/tmps/3.0,tmpy/tmps/3.0);
}
return 0;
}