HDU 1115 Lifting the Stone(计算几何)

Description
顺次给出一个简单多边形的n个顶点坐标,求这个多边形的重心坐标
Input
第一行为一个整数T表示用例组数,每组用例第一行为一个整数n表示多边形顶点个数,之后n行每行两个整数表示顶点横纵坐标(3<=n<=1000000)
Output
输出多边形重心坐标,结果保留小数点后三位
Sample Input
2
4
5 0
0 5
-5 0
0 -5
4
1 1
11 1
11 11
1 11
Sample Output
0.00 0.00
6.00 6.00
Solution
求多边形重心,首先将多边形分成n-2个三角形,即(1,2,3),(1,3,4),…(1,n-1,n),分别求出这n-2的三角形的重心坐标然后按面积加权平均即可
Code

#include<stdio.h>
#include<stdlib.h>
#define maxn 1111111
int t,n;
double x[maxn],y[maxn],area,ansx,ansy;
double get_area(double x1,double y1,double x2,double y2)
{
    return y2*x1-y1*x2;
}
int main()
{
    scanf("%d",&t); 
    while(t--)
    {
        scanf("%d",&n);
        area=ansx=ansy=0;
        for(int i=1;i<=n;i++)
            scanf("%lf%lf",&x[i],&y[i]);
        for(int i=2;i<n;i++)
        {
            double temp=get_area(x[i]-x[1],y[i]-y[1],x[i+1]-x[1],y[i+1]-y[1]);
            area+=temp;
            ansx+=(x[1]+x[i]+x[i+1])*temp;
            ansy+=(y[1]+y[i]+y[i+1])*temp;  
        }
        printf("%.2lf %.2lf\n",ansx/3.0/area,ansy/3.0/area);
    }
    return 0;
}

你可能感兴趣的:(HDU 1115 Lifting the Stone(计算几何))