在前端開發,特別是在游戲前端開發過程中,很多場景下需要求一個多邊形的質心。比如在構建由多邊形組成的地圖時,為了美觀我們需要把地名標注在地圖的質心處,游戲重力場中的多邊形物體需要根據質心來計算其運動規律。本文詳述了求解多邊形質心的思考過程。
一、從一個簡單的系統開始
上圖是一個由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)
二、多個點的系統
1.三個點的情況
加入c點,設c點處質量為mc,我們把a,b當成一個子系統,令子系統質量為mk,則mk=(ma+mb)。設系統質點坐標點為l,用同樣的方式可推導出:
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);
2.多個點的情況
推而廣之,我們可以求出有n個點的系統的質心,其中p1,p2...為多個點的坐標點,m1,m2...為對應點的質量:
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,套用上面的公式,可得:
x=(x1+x2+x3)/3; y=(y1+y2+y3)/3;
四、求凸多邊形質心
先考慮四邊形的情況,我們設每個頂點質量為m,然后把其中3個點歸為系統1,另外一點歸為系統2。則系統1和系統2的質量和質心已知,根據杠桿平衡原理,可求得四邊形質心為:
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。
根據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...為三角形的面積。
當然此公式也可以求凸多邊形的質心。
六、相關技術知識
1. 已知三角形頂點求三角形面積
可以用三角形其中兩條邊構成的向量的叉積進行計算,參考:點積與叉積
2. 多邊形三角化
求解凹多邊形質心,需要把多邊形轉為多個三角形,相關算法大家可以自行搜素,以后我也會專門寫文章討論。