hdu_1115_Lifting the Stone(求多边形重心)

时间:2023-03-09 08:28:17
hdu_1115_Lifting the Stone(求多边形重心)

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

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

题解:

将多边形划分为若干个三角形。
若我们求出了每个三角形的重心和质量,可以构造一个新的多边形,顶点为所有三角形的重心,顶点质量为三角形的质量。这个新多边形的质量和重心与原多边形相同,即可使用第一种类型的公式计算出整个多边形的重心。
由于三角形的面积与质量成正比,所以我们这里用面积代替质量来计算。 多边形有可能为凹多边形,三角形有可能在多边形之外。如何处理这种情况呢?
很简单,我们使用叉积来计算三角形面积,当三角形在多边形之外时,得到“负面积”就抵消掉了
(注意的是精度问题,将所有的除法最后算,这样能防止精度丢失)
 #include<cstdio>

 struct node{int x,y;}a,b,c;
int t,n;double s1,s2,s3,s4; 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)/;} int main(){
scanf("%d",&t);
while(t--){
s1=s2=s3=s4=;
scanf("%d",&n),scanf("%d%d",&a.x,&a.y),scanf("%d%d",&b.x,&b.y);
for(int i=;i<n;i++)
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;
printf("%.2lf %.2lf\n",s3/s2/,s4/s2/);
}
return ;
}