多边形重心问题(nyoj 3)

博客内容介绍了如何计算多边形的面积和重心。通过选取多边形内任意一点,将多边形划分为多个三角形,使用叉积求解每个三角形面积并求和得到多边形面积。当质量均匀分布时,多边形的重心可通过顶点坐标平均求得。如果质量分布在内部,重心与面积相关。给出了具体的重心坐标计算公式。

题目传送门:点击打开链接

关于多边形面积和多边形重心的问题 我觉得点击打开链接讲的不错。

多边形面积:取多边形内的任意一点(也可以取原点),将此点与所有的顶点相连,将n顶点的多边形分成n个三角形,分别用叉积求每个三角形的面积 最后求和即多边形面积。

如果所选的点就是某一个顶点,那么就将n顶点的多边形分成n-2个三角形。

s = sum(point( i ) X point(i + 1) / 2)(i = 0 ...n)

多边形重心:三角形的重心是 (x1 + x2 + x3) / 3  (y1 + y2 + y3)/ 3

如果多边形的质量是均匀分布在顶点上的,那么上面公式推广到多边形也是成立的。

如果多边形质量是均匀分布在多边形内部,那么重心就与面积有关。

如果取原点,那么三角形重心就是(point(i) . x + point (i + 1).x) / 3   纵坐标也一样。面积是point( i ) X point(i + 1) / 2

重心:(sum(point(i) . x + point (i + 1).x )/ 3 * (point( i ) X point(i + 1) )/ 2) /  sum_area

纵坐标也是如此。

#include <stdio.h>
#include <math.h>

struct point
{
	double x, y;
}p[10010]; 

double getArea(point a, point b)
{
	return (a.x * b.y - b.x * a.y) / 2;
}

int main (void)
{
	int t, n;
	scanf("%d", &t);
	while(t --)
	{
		scanf("%d", &n);
		for(int i = 0; i < n; i++)
			scanf("%lf %lf", &p[i].x, &p[i].y);
		p[n].x = p[0].x;
		p[n].y = p[0].y;
		double sum_area = 0.0;
		double sum_x = 0.0;
		double sum_y = 0.0;
		for(int i = 0; i < n; i++)
		{
			double area = getArea(p[i], p[i + 1]);
			sum_area += area;
			sum_x += (p[i].x + p[i + 1].x) * area / 3.0;
			sum_y += (p[i].y + p[i + 1].y) * area / 3.0;
		}
		if(sum_area == 0)
			printf("0.000 0.000\n");
		else
			printf("%.3lf %.3lf\n", fabs(sum_area), sum_y / sum_area + sum_x / sum_area);
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值