多边形重心问题

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


//前提知识:

1. 1 累加和求重心

设平面上有N 个离散数据点( xi , yi ) ( i = 1, 2, ., n) , 其
多边形重心G( . x1, . y1) 为:

  

  这是求多边形最简单直观的方法。可以直接利用离散数
据点的x, y坐标就能求图形重心。但是缺陷在于没有对离散
数据点所围图形做任何处理和分析,精度不够。

1. 2 算法一:在讲该算法时,先要明白下面几个定理。
定理1 已知三角形△A1A2A3的顶点坐标Ai ( xi , yi ) ( i =1, 2, 3) 。它的重心坐标为:

  xg = (x1+x2+x3) / 3 ;                       yg = (y1+y2+y3) / 3 ;

定理2 已知三角形△A1A2A3的顶点坐标Ai ( xi , yi ) ( i =1, 2, 3) 。该三角形的面积为:

  S =  ( (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1) ) / 2 ;

  △A1A2A3 边界构成逆时针回路时取+ , 顺时针时取 -。

  另外在求解的过程中,不需要考虑点的输入顺序是顺时针还是逆时针,相除后就抵消了。

  原理:将多边形划分成n个小区域, 每个小区域面积为σi ,重心为Gi ( . xi , . yi ) ,利用求平面薄板重心公式把积分变
  成累加和:

    

                           

                  

    由前面所提出的原理和数学定理可以得出求离散数据点所围多边形的一般重心公式:以Ai ( xi , yi ) ( i = 1, 2, ., n) 为顶点的任意N边形A1A2 .An ,将它划    分成N - 2个三角形(如图1) 。每个三角形的重心为Gi ( . xi , . yi ) ,面积为σi。那么多边形的重心坐标G( .x2, .y2) 为:

  

                图1  多边形分解

原文地址:https://www.cnblogs.com/guxuanqing/p/5586121.html