計算幾何-多邊形的重心

本文轉載自:https://www.cnblogs.com/jbelial/archive/2011/08/08/2131165.html 作者:jbelial 轉載請註明該聲明。

1. 1 累加和求重心
設平面上有N 個離散數據點( xi , yi ) ( i = 1, 2, ., n) , 其
多邊形重心G( . x1, . y1) 爲:

  

  這是求多邊形最簡單直觀的方法。可以直接利用離散數
據點的x, y座標就能求圖形重心。但是缺陷在於沒有對離散
數據點所圍圖形做任何處理和分析,精度不夠。

1. 2 算法一:在講該算法時,先要明白下面幾個定理。
定理1 已知三角形△A1A2A3的頂點座標Ai ( xi , yi ) ( i =1, 2, 3) 。它的重心座標爲:

  xg = (x1+x2+x3) / 3 ;                       yg = (y1+y2+y3) / 3 ;

定理2 已知三角形△A1A2A3的頂點座標Ai ( xi , yi ) ( i =1, 2, 3) 。該三角形的面積爲:

  S =  ( (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1) ) / 2 ;

  △A1A2A3 邊界構成逆時針迴路時取+ , 順時針時取 -

  另外在求解的過程中,不需要考慮點的輸入順序是順時針還是逆時針,相除後就抵消了。

  原理:將多邊形劃分成n個小區域, 每個小區域面積爲σi ,重心爲Gi ( . xi , . yi ) ,利用求平面薄板重心公式把積分變
  成累加和:

    

                           

                  

    由前面所提出的原理和數學定理可以得出求離散數據點所圍多邊形的一般重心公式:以Ai ( xi , yi ) ( i = 1, 2, ., n) 爲頂點的任意N邊形A1A2 .An ,將它劃    分成N - 2個三角形(如圖1) 。每個三角形的重心爲Gi ( . xi , . yi ) ,面積爲σi。那麼多邊形的重心座標G( .x2, .y2) 爲:

  

                圖1  多邊形分解

   例題:HDU 1115 Lifting the Stone

  代碼:如下。

 

 1 #include<stdio.h>
2 #include<math.h>
3 #include<stdlib.h>
4 struct centre
5 {
6 double x , y ;
7 };
8 int cas , n ;
9 double Area( centre p0 , centre p1 , centre p2 )
10 {
11 double area = 0 ;
12 area = p0.x * p1.y + p1.x * p2.y + p2.x * p0.y - p1.x * p0.y - p2.x * p1.y - p0.x * p2.y;
13 return area / 2 ; // 另外在求解的過程中,不需要考慮點的輸入順序是順時針還是逆時針,相除後就抵消了。
14 }
15 int main ()
16 {
17 centre p0 , p1 , p2 ;
18 double sum_x , sum_y , sum_area , area;
19 scanf ( "%d" , &cas ) ;
20 while ( cas -- )
21 {
22 sum_x = sum_y = sum_area = 0 ;
23 scanf ( "%d" , &n ) ;
24 scanf ( "%lf%lf" , &p0.x , &p0.y ) ;
25 scanf ( "%lf%lf" , &p1.x , &p1.y ) ;
26 for ( int i = 2 ; i < n ; ++ i )
27 {
28 scanf ( "%lf%lf" , &p2.x , &p2.y ) ;
29 area = Area(p0,p1,p2) ;
30 sum_area += area ;
31 sum_x += (p0.x + p1.x + p2.x) * area ;
32 sum_y += (p0.y + p1.y + p2.y) * area ;
33 p1 = p2 ;
34 }
35 printf ( "%.2lf %.2lf\n" , sum_x / sum_area / 3 , sum_y / sum_area / 3 ) ;
36 }
37 return 0 ;
38 }

  


  

 

發佈了0 篇原創文章 · 獲贊 170 · 訪問量 155萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章