首页 > 其他 > 详细

hdu 1115 计算多边形重心

时间:2014-03-18 13:17:44      阅读:455      评论:0      收藏:0      [点我收藏+]
三角形的重心公式是 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);
    }
}


hdu 1115 计算多边形重心,布布扣,bubuko.com

hdu 1115 计算多边形重心

原文:http://blog.csdn.net/cnh294141800/article/details/21448343

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!