Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6104 Accepted Submission(s):
2546
算法一:在讲该算法时,先要明白下面几个定理。
定理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 多边形分解
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int main() 5 { 6 int T; 7 double ss,S,SX,SY; 8 double x,y; 9 double x0,y0,X,Y; 10 int n,i; 11 // freopen("in.txt","r",stdin); 12 cin>>T; 13 while(T--) 14 { 15 S=0,SX=0,SY=0; 16 scanf("%d%lf%lf%lf%lf",&n,&x0,&y0,&X,&Y); 17 for(i=2;i<n;i++) 18 { 19 scanf("%lf%lf",&x,&y); 20 ss=( (X - x0) * (y - y0) - (x -x0) * (Y - y0) ) / 2; 21 S+=ss; 22 SX+=ss*(x0+x+X); 23 SY+=ss*(y0+Y+y); 24 X=x,Y=y; 25 } 26 printf("%.2f %.2f\n",SX/S/3,SY/S/3); 27 } 28 return 0; 29 }
原文:http://www.cnblogs.com/a1225234/p/4541221.html