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




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

多边形重心问题

时间限制:3000 ms  |  内存限制:65535 KB

难度:5

描述在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接),所有线段不和其他线段相交,但是可以重合,可得到一个多边形或一条线段或一个多边形和一个线段的连接后的图形;
如果是一条线段,我们定义面积为0,重心坐标为(0,0).现在求给出的点集组成的图形的面积和重心横纵坐标的和;
输入第一行有一个整数0每组数据第一行有一个整数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 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


原理
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.不规则多边形面积,可以把他分成若干个小三角形,依次求和

求任意多边形面积与重心的算法_第1张图片
当多边形为凸多边形,显然成立

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

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


你可能感兴趣的:(数据结构和算法)