杭电acm1115
求多边形重心的题目大致有这么几种:
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,则面积就是质量】
因为质量都集中在重心
所以把所有求出来的重心按逆时针连接起来又是一个多边形
但是这个多边形的质量集中在顶点上
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; }