一道計算幾何求多邊形重心問題,
題意:已知一多邊形沒有邊相交,品質分布均勻。順序給出多邊形的頂點座標,求其重心。
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
這一題這兩種方法都用到了,首先是把該多邊形劃分成多個三角形,並求出每個三角形的面積和重心,然後以每個三角形的重心為頂點,構造出一個新的多邊形,而該多邊形和原多邊形的重心相同,只是該多邊形的品質都集中在頂點上了,因此可以用第一種方法來求,又因為品質和面積成正比,因此可以轉化為求三角形面積,至於如何求三角形面積可以用叉積,注意當三角形在多邊形外邊時為負,這裡判斷三角形面積為正還是負的方法還可以用右手螺旋定則,如果是順時針這位負,逆時針為正
AC代碼:
#include<cstdio>#include<cmath>#include<string>#define exp 1e-7using namespace std;typedef struct str{ double x; double y; str():x(0.0),y(0.0){}}point;point s[10005];int main(){int T;scanf("%d",&T);while(T--){int n;scanf("%d",&n);for(int i=0;i<n;++i)scanf("%lf%lf",&s[i].x,&s[i].y);double sum=0.0;point cur;for(int i=1;i<=n;++i ){double temp=(s[i%n].x*s[i-1].y-s[i-1].x*s[i%n].y)/2;//以原點為基準點sum+=temp;cur.x+=temp*(s[i%n].x+s[i-1].x)/3.0;cur.y+=temp*(s[i%n].y+s[i-1].y)/3.0;}if(fabs(sum-0.0)<exp) printf("0.000 0.000\n");else printf("%.3lf %.3lf\n",sum,(cur.x+cur.y)/sum);}return 0;}