POJ 3855 計算幾何 多邊形重心

2022-04-30 03:12:07 字數 1221 閱讀 8217

思路:

多邊形面積->任選乙個點,把多邊形拆成三角,叉積一下

三角形重心->(x1+x2+x3)/3,(y1+y2+y3)/3

多邊形重心公式題目中有,套一下就好了

計算多邊形重心方法:

(1)劃分多邊形為三角形:

以多邊形的乙個頂點v為源點(v可取輸入的第乙個頂點),作鏈結v與所有非相鄰頂點的線段,即將原n邊形或分為(n-2)個三角形;

(2)求每個三角形的重心和面積:

設某個三角形的重心為g(cx,cy),頂點座標分別為a1(x1,y1),a2(x2,y2),a3(x3,y3),則有cx = (x1 + x2 + x3)/3.同理求得cy。求面積的方法是s =  ( (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1) ) / 2,當a1,a2,a3順時針排列時取-,否則取正(此定理不證)。事實上,在求每個三角形時不需要辨別正負,之後有方法抵消負號,見下述。

(3)求原多邊形的重心:

公式:cx = (∑ cx[i]*s[i]) / ∑s[i];  cy = (∑ cy[i]*s[i] ) / ∑s[i];其中(cx[i], cy[i]), s[i]分別是所劃分的第i個三角形的重心座標和面積。由題「 connect the points in the given order」知每個s[i]的正負號相同,故而∑ cx[i]*s[i]能與∑s[i]消號,所以根本不需要在第(2)步判斷每個s[i]的正負。另外,在(2)中求每個重心座標時要除以3,實際上不需要在求每個三角形座標時都除以3,只需要求出∑ cx[i]*s[i]後一次性除以3即可。即是多邊形重心座標變為:cx = (∑ cx[i]*s[i]) / (3*∑s[i]);  cy = (∑ cy[i]*s[i] ) / (3*∑s[i]);

//

by siriusren

#include #include

#include

using

namespace

std;

int n,cases;double

s,ts;

struct pp[105

],ans;

p operator-(p a,p b)

double

operator*(p a,p b)

intmain()printf(

"stage #%d: %lf %lf\n

",++cases,ans.x/s,ans.y/s);

}}

計算幾何 多邊形

判定凸多邊形 頂點凹凸性法 判斷點在凸多邊形內外 與判定凸多邊形差不多,用判斷點與多邊形兩頂點叉乘,都大於0,點在多邊形內,小於0,點在多邊形外。水平 垂直交叉點數判別法 適用於任意多邊形包括凹凸邊形 注意到如果從p作水平向左的射線的話,如果p在多邊形內部,那麼這條射線與多邊形的交點必為奇數,如果p...

計算幾何 多邊形筆記

計算下乙個前後所組成向量的階乘,如果在計算時,出現負值,則此多邊形是凹多邊形,如果所有頂點計算完 畢,其結果都大於0,則多邊形是凸多邊形。判斷點在凸多邊形內外 與判定凸多邊形差不多,用判斷點與多邊形兩頂點叉乘,都大於0,點在多邊形內,小於0,點在多邊 形外。水平 垂直交叉點數判別法 適用於任意多邊形...

計算幾何 多邊形面積

彙總篇 計算幾何彙總 規定頂點逆時針方向的多邊形面積為正 取原點0 0,0 s a,b,c,d s o,a,b s o,b,c s o,c,d s o,d,a 圖中o在外部,obc,ocd,oda 全部是正的,加起來構成了5變形 obcda 的面積,但 oab是負面積,因此最後剛好等於 abcd 的...