Вы можете вычислить 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 для этого, он не будет работать правильно
- опасно использовать это на вогнутых объектах; вы рискуете оказаться с отрицательными массами