在前端开发,特别是在游戏前端开发过程中,很多场景下需要求一个多边形的质心。比如在构建由多边形组成的地图时,为了美观我们需要把地名标注在地图的质心处,游戏重力场中的多边形物体需要根据质心来计算其运动规律。本文详述了求解多边形质心的思考过程。

一、从一个简单的系统开始

上图是一个由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. 多边形三角化

求解凹多边形质心,需要把多边形转为多个三角形,相关算法大家可以自行搜素,以后我也会专门写文章讨论。

 

版权声明:本文为snsart原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/snsart/p/10939524.html