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

所以可以利用上面公式进行计算

/*
*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;
}


转载于:https://www.cnblogs.com/StevenL/p/6818491.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值