Как я могу рассчитать индивидуальные точечные массы? - PullRequest
3 голосов
/ 24 января 2010

Я работаю над C # 2d физическим движком мягких тел, и мне нужно присвоить массы заданным вершинам объекта: список вершин (x, y позиции), общая масса для объекта и центр масс.

Центр масс задается как:

alt text

, где

R = center of mass
M = total mass
mj = mass of vertex j
rj = position of vertex j

Мне нужен алгоритм, который может аппроксимировать каждое mj с учетом R, M и rj.

edit: Я просто хочу уточнить, что я знаю, что существует бесконечный набор решений. Я ищу быстрый алгоритм, который находит набор mj (такой, что каждый из них достаточно близок к mj = M / [число вершин] и где «достаточно» определяется как небольшой порог с плавающей запятой).

Кроме того, каждый объект будет содержать от 5 до 35 баллов.

Ответы [ 4 ]

2 голосов
/ 25 января 2010

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

Центр масс R будет постоянно меняться при движении вершин. Итак, если у вас есть 10 вершин, сохраните значения из 10 последовательных «кадров» - это даст вам 10 уравнений для ваших 10 неизвестных (при условии, что массы не меняются со временем).

1 голос
/ 24 января 2010

Подсчитайте степени свободы: для точек в D мерном пространстве у вас есть D+1 уравнения [+] и n неизвестные для n отдельных частиц. Если n>D+1, то вы потоплены (если у вас нет больше информации, чем вы нам сообщили: ограничения симметрии, моменты высшего порядка и т. Д.).

edit: В моей предыдущей версии предполагалось, что у вас есть m_i s и вы ищете r_i s. Немного лучше, когда у вас есть r_i s и вы хотите m_i s.

[+] Тот, который вы перечислите выше (это фактическое D отдельное уравнение) и M = \sum m_j


Арриу сказал:

Ой, извините, я неправильно понял ваш вопрос. Я думал, ты спрашиваешь, моделировал ли я такие объекты, как тор, пончик или кольцо (объекты с вырезами ...). Я моделирую тела только с внешними оболочками (как воздушные шары или пузыри). Мне не нужно ничего более сложного, чем это.

Теперь мы куда-то добираемся. Вы делаете знаете что-то еще.

Вы можете аппроксимировать площадь поверхности объекта, разбив его на треугольники между соседними точками. Эта общая площадь дает вам среднюю плотность массы. Теперь найдите дефицит DoF и назначьте столько r_i s (нарисованных случайным образом, я думаю) начальную массу, основанную на средней плотности и 1/3 площади каждого треугольника, участником которого он является. Затем решите оставшуюся систему аналитически. Если проблема плохо обусловлена, вы можете либо нарисовать новый набор назначенных точек, либо попробовать случайный обход масс, о которых вы уже догадались.

0 голосов
/ 25 января 2010

Я бы перевернул проблему. То есть, учитывая плотность и положение объекта (который, естественно, все еще является центром массы объекта и тремя векторами, соответствующими ориентации объекта, см. Углы Эйлера), в каждой вершине ассоциируют объем с этим элемент (который будет изменяться с разрешением и может быть дробным для позиций на краю объекта) и умножать плотность (d_j) на соответствующий объем (v_j), m_j = v_j * d_j. Этот подход должен естественным образом воспроизводить центр массы объекта снова.

Возможно, я не понял вашу проблему, но учтите, что это в конечном итоге даст правильную массу (Mass = sum (m_j) = sum (v_j * d_j)), и в худшем случае этот подход должен привести к проверке вашего результата.

...