多边形重心问题
- 描述
-
在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接),所有线段不和其他线段相交,但是可以重合,可得到一个多边形或一条线段或一个多边形和一个线段的连接后的图形;
如果是一条线段,我们定义面积为0,重心坐标为(0,0).现在求给出的点集组成的图形的面积和重心横纵坐标的和;
- 输入
-
第一行有一个整数0<n<11,表示有n组数据;
每组数据第一行有一个整数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
#include<cstdio> const int MaxN=10010; int T,N; double area; struct point{ double x,y; point(double a=0,double b=0){ x=a; y=b; } point operator - (const point &b) const{ point c; c.x=x-b.x; c.y=y-b.y; return c; } double operator * (const point &b) const{ return x*b.y-b.x*y; } }G; struct polygon{ int n; point a[MaxN]; }P; double Abs(double x){ return x<0?-x:x; } int main(){ scanf("%d",&T); for (;T--;){ area=0; G.x=G.y=0; scanf("%d",&P.n); for (int i=1;i<=P.n;++i) scanf("%lf%lf",&P.a[i].x,&P.a[i].y); for (int i=2;i<P.n;++i){ double A=(P.a[i]-P.a[1])*(P.a[i+1]-P.a[1]); area+=A; G.x+=A*(P.a[1].x+P.a[i].x+P.a[i+1].x)/3.0; G.y+=A*(P.a[1].y+P.a[i].y+P.a[i+1].y)/3.0; } if (area){ G.x/=area; G.y/=area; } printf("%.3lf %.3lf\n",Abs(area)/2,G.x+G.y); } }