任意多边形求重心

2009-03-03 11:56

任意多边形求重心

1058. Lifting the Stone
线垂法,具体方法是:用细线提起该物体,在该物体上画细线的延长线,再移位用细线提起该物体,在该物体上画细线的延长线,两线的交叉点就是这一物体在这平面上的重心,其它面同理.

1:由两个图形A,B合并而成的一个图形C,则C的重心必在A的重心与B的重心连接的线段上。(注意,也适用于A B彼此分开,没有公共点的情形)
2:由两个A,B合并而成的一个图形C,A的重心为点a, B的重心为点b, C的重心为点c, A的面积为Sa, B的面积为Sb,则下面条件成立:
(1)点c 必在线段 ab 上
(2) ac * Sa = bc * Sb

计算几何中:
三角形的重心: x = (xa+xb+xc)/3, y = (ya+yb+yc)/3;
四边形的重心:作一对角线,将它分成两个三角形分别求出重心与面积 (x1,y1) ,s1 ; (x2, y2), s2 则该四边形的重心为: x = (x1*s1+x2*s2)/(s1+s2), y = (y1*s1+y2*s2)/(s1+s2);
五边形则分为一个三角形与一个四边形……

任意多边形中直接取任一点(一般为原点)把多边形分为n-2个三角形 分别求重心
x=∑si*xi/∑si
y=∑si*yi/∑si
si为每块三角形的有向面积

 

 

 

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
 
struct point{
	int x, y;
};
 
point p[1000001];
 
double cal(int i, int j)
{
	double res;
	
	res = p[i].x*p[j].y - p[j].x*p[i].y;
	return res;
}
 
int main()
{
	int T, N;
	double cx, cy;
	
	scanf("%d", &T);
	for (int t = 0; t < T; t++)
	{
		scanf("%d", &N);
		for (int i = 0; i < N; i++)
			scanf("%d %d", &p[i].x, &p[i].y);
		p[N].x = p[0].x;
		p[N].y = p[0].y;
		
		double A = 0;
		for (i = 0; i < N; i++)
		{
			A += cal(i, i+1);
		}
		A /= 2;
		
		cx = cy = 0;
		for (i = 0; i < N; i++)
		{
			cx += (p[i].x + p[i+1].x)*cal(i, i+1);
			cy += (p[i].y + p[i+1].y)*cal(i, i+1);
		}
		cx /= 6*A;
		cy /= 6*A;
		
		printf("%.2lf %.2lf/n", cx, cy);
	}
	return 0;
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值