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;
}