任意多边形的重心

http://acm.hdu.edu.cn/showproblem.php?pid=1115

思路:转换为求三角形的重心。从第一个顶点出发,分别链接i,i+1形成三角形,分别求出每个三角形的面积,总面积之和为各部分之和。根据物理公式n个点的质量是mi,则重心是:X=(x1*m1+x2*m2+...xn*mn)/(m1+m2+...+mn);Y=(y1*m1+y2*m2+...yn*mn)/(m1+m2+...+mn);三角形的重心是x=(x1+x2+x3)/3,y=(y1+y2+y3)/3。

#include<stdio.h>
#include<string.h>
#include<math.h>
#define maxn 105
typedef struct
{
    double x,y;
}node;
double get_area(node a,node b,node c)
{
   return (a.x*b.y+c.x*a.y+b.x*c.y-c.x*b.y-b.x*a.y-a.x*c.y)/2;
}
int main()
{
    //freopen("in.txt","r",stdin);
    int t,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        node a,b,c;
        scanf("%lf%lf",&a.x,&a.y);
        scanf("%lf%lf",&b.x,&b.y);
        double X=0,Y=0;
        double Area=0,area;
        for(int i=2;i<n;i++)
        {
            scanf("%lf%lf",&c.x,&c.y);
            double x=a.x+b.x+c.x;
            double y=a.y+b.y+c.y;
            area=get_area(a,b,c);
            Area+=area;
            X+=x*area;
            Y+=y*area;
            b=c;
        }
        printf("%.2lf %.2lf\n",X/Area/3,Y/Area/3);
    }
    return 0;
}

 

posted @ 2014-05-24 09:58  清风旋叶  阅读(879)  评论(0编辑  收藏  举报