题目连接: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 ",s3/s2/3,s4/s2/3); 16 } 17 return 0; 18 }