hdu_1115_Lifting the Stone(求多边形重心)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1115

题意:给你N个点围成的一个多边形,让你求这个多边形的重心。

题解:

将多边形划分为若干个三角形。
若我们求出了每个三角形的重心和质量,可以构造一个新的多边形,顶点为所有三角形的重心,顶点质量为三角形的质量。这个新多边形的质量和重心与原多边形相同,即可使用第一种类型的公式计算出整个多边形的重心。
由于三角形的面积与质量成正比,所以我们这里用面积代替质量来计算。

多边形有可能为凹多边形,三角形有可能在多边形之外。如何处理这种情况呢?
很简单,我们使用叉积来计算三角形面积,当三角形在多边形之外时,得到“负面积”就抵消掉了
(注意的是精度问题,将所有的除法最后算,这样能防止精度丢失)
 1 #include<cstdio>
 2 
 3 struct node{int x,y;}a,b,c;
 4 int t,n;double s1,s2,s3,s4;
 5 
 6 double s(node x,node y,node z){return (double)(x.x*y.y+y.x*z.y+z.x*x.y-y.x*x.y-z.x*y.y-x.x*z.y)/2;}
 7 
 8 int main(){
 9     scanf("%d",&t);
10     while(t--){
11         s1=s2=s3=s4=0;
12         scanf("%d",&n),scanf("%d%d",&a.x,&a.y),scanf("%d%d",&b.x,&b.y);
13         for(int i=2;i<n;i++)
14         scanf("%d%d",&c.x,&c.y),s1=s(a,b,c),s2+=s1,s3+=(a.x+b.x+c.x)*s1,s4+=(a.y+b.y+c.y)*s1,b=c;
15         printf("%.2lf %.2lf\n",s3/s2/3,s4/s2/3);
16     }
17     return 0;
18 }
View Code

 


 

posted @ 2016-05-26 08:41  bin_gege  阅读(139)  评论(0编辑  收藏  举报