ZJU2015 Lifting the Stone - 任意多边形重心

 题目描述:

已知一多边形没有边相交,质量分布均匀。顺序给出多边形的顶点坐标,求其重心。

分析:

求多边形重心的题目大致有这么几种:

1,质量集中在顶点上。n个顶点坐标为(xi,yi),质量为mi,则重心
  X = ∑( xi×mi ) / ∑mi
  Y = ∑( yi×mi ) / ∑mi
  特殊地,若每个点的质量相同,则
  X = ∑xi  / n
  Y = ∑yi  / n

2,质量分布均匀。这个题就是这一类型,算法和上面的不同。
  特殊地,质量均匀的三角形重心:
  X = ( x0 + x1 + x2 ) / 3
  Y = ( y0 + y1 + y2 ) / 3

3,质量分布不均匀。只能用积分来算,不会……

下面讨论这个题的解法:

以第一个顶点为基准,分别连接p[i],p[i+1],1<i<n。将多边形划分为若干个三角形。

若我们求出了每个三角形的重心和质量,可以构造一个新的多边形,顶点为所有三角形的重心,顶点质量为三角形的质量。这个新多边形的质量和重心与原多边形相同,即可使用第一种类型的公式计算出整个多边形的重心。

由于三角形的面积与质量成正比,所以我们这里用面积代替质量来计算。

现在有个问题就是,多边形有可能为凹多边形,三角形有可能在多边形之外。如何处理这种情况呢?

很简单,我们使用叉积来计算三角形面积,当三角形在多边形之外时,得到“负面积”就抵消掉了。
S =( x0*y1 + x1*y2 + x2*y0
     - x1*y0  - x2*y1  - x0*y2 ) /2;

贴一下代码,可以整理一个模板出来~:

int main()
{
    int i,j,k,n,T;
    double sumx,sumy,suma;
    int x0,y0,x1,y1,x2,y2;
    double x,y,s;
   
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        scanf("%d%d%d%d",&x0,&y0,&x1,&y1);
        sumx=sumy=suma=0;
        for(i=2;i<n;i++){
            scanf("%d%d",&x2,&y2);
            //center of triangle
            x=x0+x1+x2;
            y=y0+y1+y2;
            //area of triangle
            s=x0*y1 + x1*y2
            + x2*y0 - x1*y0
            - x2*y1 - x0*y2;
            //add
            suma+=s;
            sumx+=s*x;
            sumy+=s*y;
           
            x1=x2;y1=y2;   
        }
        printf("%.2lf %.2lf/n",sumx/suma/3,sumy/suma/3);
    }
   
    //system("pause");
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值