hdu 1115 计算多边形重心

三角形的重心公式是 x=(x1+x2+x3)/3  y=(y1+y2+y3)/3;

错误的推广公式是“质点系重心公式”,即如果认为多边形的质量仅分布在其顶点上,且均匀分布,则这个公式是对的。
l但是,现在多边形的质量是均匀分布在其内部区域上的,也就是说,是与面积有关的!

求解方法
l剖分成N个三角形,分别求出其重心和面积,这时可以想象,原来质量均匀分布在内部区域上,而现在质量仅仅分布在这N个重心点上(等假变换),这时候就可以利用刚才的质点系重心公式了。
l不过,要稍微改一改,改成加权平均数,因为质量不是均匀分布的,每个质点代表其所在三角形,其质量就是该三角形的面积(有向面),——这就是权!

lC=sigma(Ai * Ci) / A     (i=1…N)

本题目要注意精度的问题,除法无疑是最坏精度的所以尽量把除法运算放到最后。


#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
struct point
{
    double x,y;
}p[1000005];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        int n,i;
        scanf("%d",&n);
        for(i=0;i<n;i++) scanf("%lf %lf",&p[i].x,&p[i].y);
        p[n].x=p[0].x;p[n].y=p[0].y;
        double ansarea=0,ansx=0,ansy=0;
        for(i=0;i<n;i++){
            double temparea;
            temparea=(p[i].x*p[i+1].y-p[i].y*p[i+1].x);
            double tempx=((p[i].x+p[i+1].x+0)*1.0);
            double tempy=((p[i].y+p[i+1].y+0)*1.0);
            ansx+=tempx*temparea;
            ansy+=tempy*temparea;
            ansarea+=temparea;
        }
        printf("%.2lf %.2lf\n",ansx/ansarea/3.0,ansy/ansarea/3.0);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值