多边形重心问题

多边形重心问题

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 5
描述
在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接),所有线段不和其他线段相交,但是可以重合,可得到一个多边形或一条线段或一个多边形和一个线段的连接后的图形; 
如果是一条线段,我们定义面积为0,重心坐标为(0,0).现在求给出的点集组成的图形的面积和重心横纵坐标的和;
输入
第一行有一个整数0<n<11,表示有n组数据;
每组数据第一行有一个整数m<10000,表示有这个多边形有m个顶点;
输出
输出每个多边形的面积、重心横纵坐标的和,小数点后保留三位;
样例输入
3
3
0 1
0 2
0 3
3
1 1
0 0
0 1
4
1 1
0 0
0 0.5
0 1
样例输出
0.000 0.000
0.500 1.000
0.500 1.000

思路:

向量叉乘求多边形面积及重心。

计算几何中:
三角形的重心: 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 <stdio.h>
#include <math.h>

typedef struct Node
{
	double x;
	double y;
}pos;

pos pt[10001];

double det(pos b, pos c)          //第三个点默认为0,0
{
	return c.x*b.y - c.y*b.x;
}

int main()
{
	int t, n, i;
	double sum, area, temp;
	pos ans;                      //存储面积与x, y乘积之和
	scanf("%d", &t);
	while(t--)
	{
		scanf("%d", &n);
		for(i = 0; i < n; i++)
		{
			scanf("%lf%lf", &pt[i].x, &pt[i].y);
		}
		ans.x = ans.y = sum = area = 0.0;
		for(i = 1; i <= n; i++)
		{
			temp = det(pt[i%n], pt[i-1])/2;67
			sum += temp;                       //记录多边形面积
			ans.x += temp * (pt[i%n].x+pt[i-1].x)/3;
			ans.y += temp * (pt[i%n].y+pt[i-1].y)/3;
		}
		if(fabs(sum) < 0.000001)         //考虑除零情况
		{
			printf("0.000 0.000\n");
		}
		else
		{
			printf("%.3lf %.3lf\n", fabs(sum), (ans.x+ans.y)/sum);
		}
	}
	return 0;
}


你可能感兴趣的:(计算几何)