天天看點

HDU 1115 計算幾何MB

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define N 1000005
struct point
{
    double x,y;
}p[N];
int T,n;
double cal(point a,point b)
{
    return (a.x-p[0].x)*(b.y-p[0].y)-(a.y-p[0].y)*(b.x-p[0].x);
}
//叉積計算三角形面積

int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        int i,j,k;
        for(i=0;i
            scanf("%lf%lf",&p[i].x,&p[i].y);
        double S=0,x=0,y=0;
        for(i=1;i
        {
            double tmp=cal(p[i],p[i+1]);
            S+=tmp;
            x+=(p[i].x+p[i+1].x+p[0].x)/3*tmp;
            y+=(p[i].y+p[i+1].y+p[0].y)/3*tmp;
/*把每個三角形看作一個品質為面積的點,然後求出這個三角形X坐标平均值,相乘後得到這個點将所有點同樣處理後相加,最終結果除以多邊形面積就是多邊形重心的X坐标。Y坐标同理。*/
        }
        printf("%.2lf %.2lf\n",x/S,y/S);
    }
    return 0;
}
           

計算幾何參考了  http://www.cnblogs.com/cpoint/archive/2011/06/09/2076405.html

題意求多邊形重心

繼續閱讀