任意多边形的重心
http://acm.hdu.edu.cn/showproblem.php?pid=1115
思路:转换为求三角形的重心。从第一个顶点出发,分别链接i,i+1形成三角形,分别求出每个三角形的面积,总面积之和为各部分之和。根据物理公式n个点的质量是mi,则重心是:X=(x1*m1+x2*m2+...xn*mn)/(m1+m2+...+mn);Y=(y1*m1+y2*m2+...yn*mn)/(m1+m2+...+mn);三角形的重心是x=(x1+x2+x3)/3,y=(y1+y2+y3)/3。
#include<stdio.h> #include<string.h> #include<math.h> #define maxn 105 typedef struct { double x,y; }node; double get_area(node a,node b,node c) { return (a.x*b.y+c.x*a.y+b.x*c.y-c.x*b.y-b.x*a.y-a.x*c.y)/2; } int main() { //freopen("in.txt","r",stdin); int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); node a,b,c; scanf("%lf%lf",&a.x,&a.y); scanf("%lf%lf",&b.x,&b.y); double X=0,Y=0; double Area=0,area; for(int i=2;i<n;i++) { scanf("%lf%lf",&c.x,&c.y); double x=a.x+b.x+c.x; double y=a.y+b.y+c.y; area=get_area(a,b,c); Area+=area; X+=x*area; Y+=y*area; b=c; } printf("%.2lf %.2lf\n",X/Area/3,Y/Area/3); } return 0; }