https://vjudge.net/problem/HDU-1115
直接找的模板抄上去了
首先划分多个三角形
然后算出每个三角形的质量和重心
再然后就是高中物理竞赛的质心的算法
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
/*==================================================*\
| 求多边形重心
| INIT: pnt[]已按顺时针(或逆时针)排好序;
| CALL: res = bcenter(pnt, n);
\*==================================================*/
struct point
{
double x, y;
}pnt[1000005],res;
point bcenter(point pnt[], int n)//重心
{
point p, s;
double tp, area = 0, tpx = 0, tpy = 0;
p.x = pnt[0].x;
p.y = pnt[0].y;
for (int i = 1; i <= n; ++i)
{
// point: 0 ~ n-1
s.x = pnt[(i == n) ? 0 : i].x;
s.y = pnt[(i == n) ? 0 : i].y;
tp = (p.x * s.y - s.x * p.y);//叉乘
area += tp / 2;
tpx += (p.x + s.x) * tp;
tpy += (p.y + s.y) * tp;
p.x = s.x;
p.y = s.y;
}
s.x = tpx / (6 * area);
s.y = tpy / (6 * area);
return s;
}
int main(){
int T,N,i;
cin>>T;
while(T--){
cin>>N;
for(i=0;i<N;i++){
cin>>pnt[i].x>>pnt[i].y;
}
res=bcenter(pnt, N);
printf("%0.2lf %0.2lf\n",res.x,res.y);
}
}