http://acm.nyist.net/JudgeOnline/problem.php?pid=3

來源:互聯網
上載者:User

一道計算幾何求多邊形重心問題,

題意:已知一多邊形沒有邊相交,品質分布均勻。順序給出多邊形的頂點座標,求其重心。

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;}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.