您可以按如下方式计算均匀密集多边形的 CM:将 N 个顶点从 0..N-1 编号,并循环处理它们,以便顶点 N 环绕到顶点 0:
total_area = sum[i=0..N-1]( X(p[i],p[i+1])/2 )
CM = sum[i=0..N-1]( (p[i]+p[i+1])*X(p[i],p[i+1])/6 ) / total_area
where X(p,q)= p.x*q.y - q.x*p.y [basically, a 2D cross product]
如果多边形是凸的,则 CM 将在多边形内部,因此您可以合理地开始将区域切成三角形,如馅饼,CM 位于中心。您应该能够在不更改 CM 的情况下用其质量的三分之一来加权三角形的每个顶点——但是,这仍然会在整个多边形的 CM 处留下三分之一的总质量。尽管如此,将质量传递缩放 3/2 应该可以让您在两个“外部”顶点之间分割每个三角形的质量。因此,
area[i] = X( (p[i]-CM), (p[i+1]-CM) ) / 2
(this is the area of the triangle between the CM and vertices i and i+1)
mass[i] = (total_mass/total_area) * (area[i-1] + area[i])/2
请注意,这种质量传递是非常“非物理的”——如果没有别的,如果从字面上看,它会严重破坏惯性矩。但是,如果您需要在顶点之间分配质量(例如某种俗气的爆炸),并且您不想在这样做时破坏 CM,那么这应该可以解决问题。
最后,有几个警告:
- 如果您不为此使用实际的 CM,它将无法正常工作
- 在凹面物体上使用它是危险的;你有可能以负质量结束