求任意多边形面积与重心的算法

本文介绍了一种计算不规则多边形面积及其重心的方法,包括三角形面积的向量叉乘运算、三角形重心坐标公式,并通过将多边形拆分为多个三角形来求解整体的面积和重心。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >




题目地址http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=3

多边形重心问题

时间限制: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


//给出一个程序

#include<stdio.h> double abs(double x){ if(x<0) return -x; else return x; } int main(){ int n,m; int i; double x0,y0,x1,y1,x2,y2; double s,si,sx,sy; scanf("%d",&n); while(n--){ s = 0; sx = 0; sy = 0; scanf("%d",&m); scanf("%lf %lf",&x0,&y0); scanf("%lf %lf",&x1,&y1); m -= 2; for(i=0;i<m;i++){ scanf("%lf %lf",&x2,&y2); si = ((x1-x0)*(y2-y0)-(x2-x0)*(y1-y0))/2; s += si; sx += (x0+x1+x2)*si/3; sy += (y0+y1+y2)*si/3; x1=x2; y1=y2; } s = abs(s); printf("%.3lf ",s); if(s==0) printf("0.000\n"); else printf("%.3lf\n",abs(sx+sy)/s); } return 0; }


原理
1.三角形重心公式
     ym=(y1+y2+y3)/3
证明:
设三点为A(x1.y1)B(x2,y2)C(x3,y3)
重心坐标(xm,ym)
考虑xm
任取两点(不妨设为A和B),则重心在以AB为底的中线上.
AB中点横坐标为(x1+x2)/2
重心在中线距AB中点1/3处
故重心横坐标为
xm=1/3*(x3-(x1+x2)/2)+(x1+x2)/2
=(x1+x2+x3)/3
同理,ym=(y1+y2+y3)/3
来源:https://www.zybang.com/question/ca313a8ed35fca221061c144089c70b1.html

2.三角形面积
    用向量叉乘运算
S=AB叉乘AC/2
正负由给出坐标是顺时针还是逆时针决定
坐标式((x1-x0)*(y2-y0)-(x2-x0)*(y1-y0))/2

3.不规则多边形面积,可以把他分成若干个小三角形,依次求和


当多边形为凸多边形,显然成立


当多边形为凹多边形,则多边形点给出的顺序,一定会相反(有的是顺时针,有的是逆时针),用该公式求出的面积为负,正好抵消,由此可知该方法对所有多边形都成立

https://blog.youkuaiyun.com/qq_24451605/article/details/450413714.求重心坐标
对每个小三角形,求出其重心与面积,则重心坐标与总面积的积,等于每个 小三角形重心与面积的积的和。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值