南阳理工acm

多边形重心问题

时间限制: 3000 ms  |            内存限制: 65535 KB
难度: 5
 

描述

在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接),所有线段不和其他线段相交,但是可以重合,可得到一个多边形或一条线段或一个多边形和一个线段的连接后的图形;
如果是一条线段,我们定义面积为0,重心坐标为(0,0).现在求给出的点集组成的图形的面积和重心横纵坐标的和;
输入
第一行有一个整数0 每组数据第一行有一个整数m<10000,表示有这个多边形有m个顶点;
输出
输出每个多边形的面积、重心横纵坐标的和,小数点后保留三位;
样例输入
3
3
0 1
0 2
0 3
3
1 1
0 0
0 1
4
1 1
0 0
0 0.5
0 1
样例输出
0.000 0.000
0.500 1.000
0.500 1.000
 
此题其实不难,但是如果不知道一些数学知识或者算法知识那么就此题就变得非常难,还有一点就是最后一个坐标和第一个坐标相等,利用下面给出的公式 

南阳理工acm_第1张图片

 

 

其中A代表面积利用

#include
#include
#include
using namespace std;
struct point
{
  double x,y;
}p[10010];
double getarea(point p1,point p2)
{
    return p1.x*p2.y-p1.y*p2.x;
}
int main()
{
      int n,i,test;
      double x,y,s,temp;
      scanf("%d",&test);
      while(test--)
      {
       scanf("%d",&n);
       for(i=0;i             scanf("%lf %lf",&p[i].x,&p[i].y);
       p[n]=p[0];
       for(i=0,s=x=y=0;i         {
            temp=getarea(p[i],p[i+1])/2.0;
            s+=temp;
            x+=temp*(p[i].x+p[i+1].x)/3.0;
            y+=temp*(p[i].y+p[i+1].y)/3.0;
        }
        if(fabs(s)<1e-6)
             cout<<"0.000 0.000"<         else
             printf("%.3lf %.3lf\n",fabs(s),(x/s+y/s));
     }
        return 0;
}

你可能感兴趣的:(南阳理工acm)