题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1115
参考来源:http://www.cnblogs.com/try86/archive/2012/04/21/2462458.html(作者:Try86)
题意: 求一个任意多边形的重心
摘自:KIDxの博客 求多边形重心的题目大致有这么几种:
1、质量集中在顶点上 n个顶点坐标为(xi,yi),质量为mi,则重心
X = ∑( xi×mi ) / ∑mi
Y = ∑( yi×mi ) / ∑mi
特殊地,若每个点的质量相同,则
X = ∑xi / n
Y = ∑yi / n
2、质量分布均匀
特殊地,质量均匀的三角形重心:
X = ( x0 + x1 + x2 ) / 3
Y = ( y0 + y1 + y2 ) / 3
3、质量分布不均匀 只能用函数多重积分来算,不太会
这题的做法: 将n边形分成多个三角形,分别求出重心坐标以及质量m【因为质量分布均匀,所以可以设密度为1,则面积就是质量】 因为质量都集中在重心 所以把所有求出来的重心按逆时针连接起来又是一个多边形 但是这个多边形的质量集中在顶点上 所以可以利用上面公式进行计算
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cctype>
#include<iomanip>
using namespace std;
const int maxn=1000000;
double x[maxn],y[maxn];
double gx,gy;
void Gravity(int n){
double Sares=0;
gx=gy=0;
for(int i=2;i<n;++i){
double ares=(x[i-1]-x[0])*(y[i]-y[0])-(y[i-1]-y[0])*(x[i]-x[0]);
Sares+=ares;
double xx=x[0]+x[i]+x[i-1];
double yy=y[0]+y[i]+y[i-1];
gx+=xx*ares;
gy+=yy*ares;
}
gx/=Sares*3.0;
gy/=Sares*3.0;
}
int main(){
int T; cin>>T;
while(T--){
int n; cin>>n;
for(int i=0;i<n;++i)
cin>>x[i]>>y[i];
Gravity(n);
cout<<setiosflags(ios::fixed)<<setprecision(2)<<gx<<' '<<gy<<endl;
}
return 0;
}