计算几何,已知多边形的各个顶点的坐标,求多边形的重心坐标。
先贴一篇详解
一开始以为直接用坐标相加然后除以n即可。看了题解才知道和面积有关。
首先要在已知三角形三个顶点的情况下,求三角形的面积,有公式。
原理是向量的叉乘求三角形面积。
s=(x1y2-x2y1+x2y3-x3y2+x3y1-x1y3)/2;
大概步骤:
1.可以把多边形分成n-2个三角形,由于凸性,分成的三角形一定在内部。
2.求出每个三角形的面积,和重心(坐标向加然后除以3)。
3.每个三角形的面积比上总面积,相当于加权,然后乘以三角形的重心,最后依次相加。
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
struct node
{
double x,y;
}p1,p2,p3;
double area(node a,node b,node c)//已知三角形的三个顶点的坐标,求三角形的面积
{
double res=a.x*b.y-b.x*a.y+b.x*c.y-c.x*b.y+c.x*a.y-a.x*c.y;
return res/2;
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
scanf("%lf%lf",&p1.x,&p1.y);
scanf("%lf%lf",&p2.x,&p2.y);
double sum=0,xx,yy,sumx=0,sumy=0;
for(int i=3;i<=n;i++)
{
scanf("%lf%lf",&p3.x,&p3.y);
double ta=area(p1,p2,p3);
sum+=ta;//总面积
xx=p1.x+p2.x+p3.x;//除3放在最后
yy=p1.y+p2.y+p3.y;
sumx+=xx*ta;
sumy+=yy*ta;
p2=p3;
}
printf("%.2lf %.2lf\n",sumx/sum/3,sumy/sum/3);
}
return 0;
}