HDU1115 几何+多边形重心
三角形重心:(x1+x2+x3)/3,(y1+y2+y3)/3 这是特殊情况,各点的质量相等
多边形 x=( sigma )( xi*mi )/sumArea
y=( sigma )( yi*mi )/sumArea
先把多边形变成多个三角形,分别求出mi(有点像面缩点),然后得到新的点的坐标。。。
View Code
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<math.h> 5 const int maxn = 1000005; 6 struct node{ 7 double x,y; 8 }a[ maxn ]; 9 struct node2{ 10 double x,y,s; 11 }b[ maxn ]; 12 double crossProd(node A, node B, node C) { 13 return (B.x-A.x)*(C.y-A.y) - (B.y-A.y)*(C.x-A.x); 14 } 15 int main(){ 16 int T; 17 scanf("%d",&T); 18 while( T-- ){ 19 int n; 20 scanf("%d",&n); 21 for( int i=0;i<n;i++ ){ 22 scanf("%lf%lf",&a[i].x,&a[i].y); 23 } 24 double sumArea=0; 25 double ans_x,ans_y; 26 int cnt=0; 27 ans_x=ans_y=0; 28 for( int i=2;i<n;i++ ){ 29 double tmp=crossProd(a[0], a[i-1], a[i]); 30 b[ cnt ].x=(a[i].x+a[i-1].x+a[0].x); 31 b[ cnt ].y=(a[i].y+a[i-1].y+a[0].y); 32 b[ cnt ].s=tmp; 33 cnt++; 34 //printf("tmp:%lf\n",tmp); 35 sumArea+=tmp; 36 } 37 for( int i=0;i<cnt;i++ ){ 38 ans_x+= b[ i ].x*b[ i ].s; 39 ans_y+= b[ i ].y*b[ i ].s; 40 } 41 ans_x/=(sumArea*3.0); 42 ans_y/=(sumArea*3.0); 43 printf("%.2lf %.2lf\n",ans_x,ans_y); 44 } 45 return 0; 46 }
keep moving...