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,则面积就是质量】
因为质量都集中在重心
所以把所有求出来的重心按逆时针连接起来又是一个多边形
但是这个多边形的质量集中在顶点上
所以可以利用上面公式进行计算
/*
*content:寻找重心
*/
#include <stdio.h>
#define N 1000001
struct point {
double x, y;
}buf[N];
double calcProportion(point a, point b, point c) {
return ((b.x-a.x)*(c.y-a.y) - (b.y-a.y)*(c.x-a.x)) / 2;
}
point cal(int n) {
point p, temp;
p.x = 0.0;
p.y = 0.0;
double area, sumArea;
sumArea = 0.0;
for(int i=2; i<n; i++) {
area = calcProportion(buf[0], buf[i-1], buf[i]);
sumArea += area;
temp.x = buf[0].x + buf[i-1].x + buf[i].x;//为什么不在这里除以3.0?
temp.y = buf[0].y + buf[i-1].y + buf[i].y;
p.x += temp.x * area;
p.y += temp.y * area;
}
p.x /= sumArea * 3.0;//而是在这里乘以3.0,想不通
p.y /= sumArea * 3.0;
return p;
}
int main() {
int x, y, t, n, i;
point ans;
scanf("%d", &t);
while(t--) {
scanf("%d", &n);
for(i=0; i<n; i++)
scanf("%lf%lf", &buf[i].x, &buf[i].y);
ans = cal(n);
printf("%.2f %.2f\n", ans.x, ans.y);
}
return 0;
}