Как найти центр тяжести или центр массы нерегулярного тела с равномерным распределением массы? - PullRequest
0 голосов
/ 29 января 2010

Недавно я пытался решить небольшую проблему ИИ, но застрял между ними, так как не мог найти центр масс различных тел. Мне было интересно, может ли кто-нибудь из вас помочь мне с этим.

Объяснение проблемы: предположим, что у меня есть двумерное тело, которое имеет очень неправильную форму и равномерное распределение массы по всему телу. Это похоже на то, что тело состоит из «n» крошечных частиц, каждая из которых имеет единичную массу, и, следовательно, хотя тело очень неправильной формы, но распределение массы равномерное. Как я могу найти центр масс или центр тяжести этого тела?

Avanish !!

Ответы [ 3 ]

5 голосов
/ 29 января 2010

Расчет центра масс полигона:

Упростите ваше тело в многоугольник, и найдите его центроид , потому что ( цитирование википедии ):

Если объект имеет однородную плотность, то его центр масс такой же, как центр тяжести его формы.

Этот подход быстрее, если в многоугольнике много частиц, равномерно распределенных.

Расчет среднего местоположения всех частиц:

Если у вас есть n частицы, рассчитайте среднее их координат X и Y; Это центр масс.

Повторное цитирование Википедии :

Центр масс системы частицы определяется как среднее их позиции, взвешенные их массы:

alt text

Ваши частицы имеют одинаковую массу, поэтому ваш знаменатель равен n. Код в ответе @ tkerwin вычисляет эту долю.

Этот подход хорошо работает, если у вас не слишком много частиц.

Edit:

Вероятностный расчет:

Если у вас слишком много точек для эффективного расчета их среднего местоположения, попробуйте подобрать несколько случайных точек. Расчет их среднего местоположения даст вам превосходное приближение ко всему среднему. Чем больше очков вы выберете, тем лучше будет ваше приближение - согласно закону больших чисел .

3 голосов
/ 29 января 2010

Центр масс - это среднее положение каждой частицы, взвешенное по массе этой частицы. Поскольку ваши частицы имеют одинаковую массу, вам нужно только занять среднюю позицию.

То есть:

center_x = 0
center_y = 0
for p in particles:
    center_x += p.x
    center_y += p.y
center_x /= len(particles)
center_y /= len(particles)
1 голос
/ 01 февраля 2010

OK. Я получаю это сейчас. У вас есть огромное количество дискретных частиц для работы. С акцентом на большой номер.

Ну, а почему ты не сказал?

Вы не можете сделать это точно (т.е. без аппроксимации) быстрее, чем итерация по всем пунктам. По крайней мере, без предоставления более актуальной информации.

Предложение Адама о выборке - хороший способ получить приближение, если у вас есть произвольный доступ к данным.

Альтернатива, которая не будет быстрее для одной операции, но может оказаться полезной, если вам придется часто пересчитывать, - это уменьшить рабочий набор до меньшей группы более тяжелых точек. Примерно так:

  1. Разделите пространство на сетку из N_x * N_y * N_z ячеек размеров (l_x,l_y,L_z).
  2. Вычислить общую массу и местоположение центра масс для всех точек в каждой ячейке.
  3. Откажитесь от любых ячеек, в которых нет точек, и используйте результаты в качестве нового рабочего набора.

Чтобы это было улучшением, вам нужно иметь в среднем 10 или более исходных точек на ячейку, но не так много, чтобы введенная гранулярность размыла искомый сигнал.

Как лучше всего выполнить шаг 2, зависит от того, как организованы исходные данные и сколько места у вас в памяти для хранения промежуточных результатов. С большим количеством доступной памяти:

  • Подготовить и инициализировать до нуля четыре (N_x, N_y, N_z) массива, называемые M, Rx, Ry и Rz (или один скалярный массив M и один векторный массив R, это зависит от вашего языка реализации)
  • Пройдите по основному списку вовремя, увеличивая значения в соответствующей ячейке для каждой массы
  • Пройдите промежуточные массивы, чтобы вычислить собранные массы и места.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...