在前端開發,特別是在遊戲前端開發過程當中,不少場景下須要求一個多邊形的質心。好比在構建由多邊形組成的地圖時,爲了美觀咱們須要把地名標註在地圖的質心處,遊戲重力場中的多邊形物體須要根據質心來計算其運動規律。本文詳述了求解多邊形質心的思考過程。html
上圖是一個由a,b兩個點組成的系統,其中a的質量爲ma,b的質量爲mb。咱們能夠根據槓桿的平衡原理,求得這兩點的重心(設爲k)。即:前端
(k.x-a.x)mag1=(b.x-k.x)mbg2
k.x=(a.x*mag1+b.x*mbg2)/(mag1+mbg2)
在均勻的重力場中,即g1=g2等狀況下,質心和重心重合,所以這個系統的質心爲:算法
k.x=(a.x*ma+b.x*mb)/(ma+mb)
加入c點,設c點處質量爲mc,咱們把a,b當成一個子系統,令子系統質量爲mk,則mk=(ma+mb)。設系統質點座標點爲l,用一樣的方式可推導出:spa
l.x=(k.x*mk+c.x*mc)/(mk+mc) =(a.x*ma+b.x*mb+c.x*mc)/(ma+mb+mc);
l.y=(k.y*mk+c.y*mc)/(mk+mc) =(a.y*ma+b.y*mb+c.y*mc)/(ma+mb+mc);
推而廣之,咱們能夠求出有n個點的系統的質心,其中p1,p2...爲多個點的座標點,m1,m2...爲對應點的質量:code
ln.x=(p1.x*m1+p2.x*m2+p3.x*m3+...+pn.x*mn)/(m1+m2+m3+...+mn); ln.y=(p1.y*m1+p2.y*m2+p3.y*m3+...+pn.y*mn)/(m1+m2+m3+...+mn);
三角形的質心等同於由三角形三個頂點組成的系統的質心,而且三個頂點的質量相同,即ma=mb=mc,套用上面的公式,可得:htm
x=(x1+x2+x3)/3; y=(y1+y2+y3)/3;
先考慮四邊形的狀況,咱們設每一個頂點質量爲m,而後把其中3個點歸爲系統1,另一點歸爲系統2。則系統1和系統2的質量和質心已知,根據槓桿平衡原理,可求得四邊形質心爲:blog
x=(x1+x2+x3+x4)/4; y=(y1+y2+y3+x4)/4;
同理可求得n個頂點的凸多邊形的質心爲:遊戲
x=(x1+x2+x3+...+xn)/n; y=(y1+y2+y3+...+yn)/n;
對於凹多邊形就不能根據上面的方式進行計算了,由於上述方式只考慮了點的狀況,而沒考慮組成的圖形。對於凹多邊形,相同的頂點分佈,可能組成不一樣的多邊形,他們的質心相差很大,以下圖:開發
對於凹邊形,咱們能夠把它分爲多個三角形組成的系統,其中每一個三角形能夠抽象爲一個帶質量的點p,點的位置爲三角形的質心,點的質量和三角形的面積成正比,即m=s*k。get
根據n個點的系統的質心求解公式,可得凹邊形質心求解公式:
x=(p1.x*s1+p2.x*s2+p3.x*s3+...+pn.x*sn)/(s1+s2+s3+...+sn); y=(p1.y*s1+p2.y*s2+p3.y*s3+...+pn.y*sn)/(s1+s2+s3+...+sn);
其中p1,p2,p3...爲三角形的質心,s1,s2,s3...爲三角形的面積。
固然此公式也能夠求凸多邊形的質心。
能夠用三角形其中兩條邊構成的向量的叉積進行計算,參考:點積與叉積
求解凹多邊形質心,須要把多邊形轉爲多個三角形,相關算法你們能夠自行搜素,之後我也會專門寫文章討論。