均一な密度のポリゴンの 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 を変更せずに、三角形の各頂点にその質量の 3 分の 1 の重みを付けることができるはずですが、それでも、ポリゴン全体の CM に総質量の 3 分の 1 が残ることになります。それにもかかわらず、物質移動を 3/2 でスケーリングすると、各三角形の質量を 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を使わないとうまくいきません
- これを凹状のオブジェクトに使用するのは危険です。負の質量になるリスクがあります