1. 程式人生 > >hdu1115【多邊形求重心模板】

hdu1115【多邊形求重心模板】

dia 集中 logs -a for turn -- 坐標 tdi

1.質量集中在頂點上。n個頂點坐標為(xi,yi),質量為mi,則重心(∑( xi×mi ) / ∑mi, ∑( yi×mi ) / ∑mi)
2.質量分布均勻。這個題就是這一類型,算法和上面的不同。
特殊地,質量均勻的三角形重心:(( x0 + x1 + x2 ) / 3,Y = ( y0 + y1 + y2 ) / 3)
以(0,0)為頂點三角剖分之後求三角形重心,把重心連起來轉換成質量集中在頂點上的情況求解即可

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int
N=1000005; int T,n; double am; struct dian { double x,y,v; dian(double X=0,double Y=0) { x=X,y=Y; } dian operator + (const dian &a) const { return dian(x+a.x,y+a.y); } dian operator - (const dian &a) const { return dian(x-a.x,y-a.y); } dian operator
* (const double &a) const { return dian(x*a,y*a); } dian operator / (const double &a) const { return dian(x/a,y/a); } }p[N],a; int read() { int r=0,f=1; char p=getchar(); while(p>‘9‘||p<‘0‘) { if(p==‘-‘) f=-1; p=getchar(); } while
(p>=‘0‘&&p<=‘9‘) { r=r*10+p-48; p=getchar(); } return r*f; } double cj(dian a,dian b) { return a.x*b.y-a.y*b.x; } int main() { T=read(); while(T--) { n=read();am=0,a.x=0,a.y=0; for(int i=1;i<=n;i++) p[i].x=read(),p[i].y=read(); p[n+1]=p[1]; for(int i=2;i<=n+1;i++) { double mj=cj(p[i-1],p[i]); am+=mj,a=a+(p[i-1]+p[i])*mj; } printf("%.2f %.2f\n",a.x/am/3,a.y/am/3); } return 0; }

hdu1115【多邊形求重心模板】