在前端开发,特别是在游戏前端开发过程当中,不少场景下须要求一个多边形的质心。好比在构建由多边形组成的地图时,为了美观咱们须要把地名标注在地图的质心处,游戏重力场中的多边形物体须要根据质心来计算其运动规律。本文详述了求解多边形质心的思考过程。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...为三角形的面积。
固然此公式也能够求凸多边形的质心。
能够用三角形其中两条边构成的向量的叉积进行计算,参考:点积与叉积
求解凹多边形质心,须要把多边形转为多个三角形,相关算法你们能够自行搜素,之后我也会专门写文章讨论。