分析:
多边形求重心分为几种情况:
1,质量集中在顶点上。n个顶点坐标为(xi,yi),质量为mi,则重心
X = ∑( xi×mi ) / ∑mi
Y = ∑( yi×mi ) / ∑mi
特殊地,若每个点的质量相同,则
X = ∑xi / n
Y = ∑yi / n
2,质量分布均匀,与上面算法不同
特殊地,质量均匀的三角形重心:
X = ( x0 + x1 + x2 ) / 3
Y = ( y0 + y1 + y2 ) / 3
3,质量分布不均匀。
解法:
以第一个顶点p0为原点,分别连接p1,p2,p3.....
将多边形划分为几个三角形,总面积为三角形面积和
若我们求出了每个三角形的重心和质量,可以构造一个新的多边形,顶点为所有三角形的重心,顶点质量为三角形的质量。这个新多边形的质量和重心与原多边形相同,即可使用第一种类型的公式计算出整个多边形的重心。
由于三角形的面积与质量成正比,所以我们这里用面积代替质量来计算,利用面积间接计算出多面型重心
多边形求重心分为几种情况:
1,质量集中在顶点上。n个顶点坐标为(xi,yi),质量为mi,则重心
X = ∑( xi×mi ) / ∑mi
Y = ∑( yi×mi ) / ∑mi
特殊地,若每个点的质量相同,则
X = ∑xi / n
Y = ∑yi / n
2,质量分布均匀,与上面算法不同
特殊地,质量均匀的三角形重心:
X = ( x0 + x1 + x2 ) / 3
Y = ( y0 + y1 + y2 ) / 3
3,质量分布不均匀。
解法:
以第一个顶点p0为原点,分别连接p1,p2,p3.....
将多边形划分为几个三角形,总面积为三角形面积和
若我们求出了每个三角形的重心和质量,可以构造一个新的多边形,顶点为所有三角形的重心,顶点质量为三角形的质量。这个新多边形的质量和重心与原多边形相同,即可使用第一种类型的公式计算出整个多边形的重心。
由于三角形的面积与质量成正比,所以我们这里用面积代替质量来计算,利用面积间接计算出多面型重心
当然多边形有可能为凹多边形,三角形有可能在多边形之外,因此,我们需要叉积计算三角形面积。
S =(x0*y1+x1*y2+x2*y0-x1*y0-x2*y1-x0*y2)
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=100000+5;
struct Node
{
double x,y;
}node[maxn];
double Area(Node p0,Node p1,Node p2)
{
double area;
area=p0.x*p1.y+p1.x*p2.y+p2.x*p0.y-p1.x*p0.y-p2.x*p1.y-p0.x*p2.y;
return area/2;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
Node p0,p1,p2;
int m;
scanf("%d",&m);
scanf("%lf %lf",&p0.x,&p0.y);
scanf("%lf %lf",&p1.x,&p1.y);
double Sum_Area=0;
double area;
double Gsum_x=0,Gsum_y=0;
for(int i=2;i<m;i++)
{
scanf("%lf %lf",&p2.x,&p2.y);
area=Area(p0,p1,p2);
Sum_Area+=area;
Gsum_x+=(p0.x+p1.x+p2.x)*area;
Gsum_y+=(p0.y+p1.y+p2.y)*area;
p1=p2;
}
if(Sum_Area==0)
printf("0.000 0.000\n");
else
printf("%.3lf %.3lf\n",abs(Sum_Area),Gsum_x/Sum_Area/3+Gsum_y/Sum_Area/3);
}
return 0;
}